Skip to content

admin

log_panel.admin

LogAdmin

Bases: ModelAdmin

Read-only admin interface for browsing application logs.

Provides two views: - Cards view (default): one card per logger with error/warning badges and a color-coded timeline strip across the selected time range. - Table view: paginated log entries for a single logger, filterable by level and message content.

changelist_view(request, extra_context=None)

Route to the cards or table view depending on the logger_name query param.

Source code in log_panel/admin.py
def changelist_view(
    self, request: HttpRequest, extra_context: dict | None = None
) -> TemplateResponse:
    """Route to the cards or table view depending on the ``logger_name`` query param."""
    backend: LogsBackend | None = conf.get_backend()
    error: str | None = None
    logger_name: str = request.GET.get(key="logger_name", default="")

    if logger_name:
        context: dict = self._log_table_context(
            request, backend, logger_name, error
        )
        template: str = "admin/log_panel/panel/table.html"
    else:
        context: dict = self._logger_cards_context(request, backend, error)
        template: str = "admin/log_panel/panel/cards.html"

    return TemplateResponse(request, template, context)

get_urls()

Add a read-only full-message view for chunked log payloads.

Source code in log_panel/admin.py
def get_urls(self) -> list:
    """Add a read-only full-message view for chunked log payloads."""
    return [
        path(
            "<path:object_id>/message/",
            self.admin_site.admin_view(self.message_view),
            name="log_panel_log_message",
        ),
        *super().get_urls(),
    ]

message_view(request, object_id)

Render the complete log message for a single log entry.

Source code in log_panel/admin.py
def message_view(self, request: HttpRequest, object_id: str) -> TemplateResponse:
    """Render the complete log message for a single log entry."""
    log: Log = get_object_or_404(
        Log.objects.prefetch_related("message_chunks"),
        pk=object_id,
    )
    return TemplateResponse(
        request,
        "admin/log_panel/panel/message.html",
        {
            **self.admin_site.each_context(request),
            "title": f"{conf.get_setting(key='TITLE')}{log.logger_name}",
            "opts": self.model._meta,
            "log": log,
            "log_message": log.get_full_message(),
            "level_colors": conf.get_level_colors(),
        },
    )