From 721b113c9d28485a97387f82c869687c5ba73bd2 Mon Sep 17 00:00:00 2001 From: ishenwei Date: Wed, 8 Apr 2026 19:38:02 +0800 Subject: [PATCH] feat: add Daily Report to admin sidebar via custom AdminSite - Create OpenClawAdminSite (openclaw_admin) with Daily Reports menu in sidebar - Re-register Session/Message/ToolCall with custom site - Add daily/daily-reports URLs at AdminSite level - Override admin/index.html template for sidebar item - Use self.admin_view (not admin.site.admin_view) for site-aware view wrapping - Clean up admin.py: remove inline URLs from SessionAdmin (now at site level) --- src/config/urls.py | 4 +-- src/openclaw/admin.py | 34 +++----------------- src/openclaw/admin_custom_site.py | 52 +++++++++++++++++++++++++++++++ src/templates/admin/index.html | 24 ++++++++++++++ 4 files changed, 82 insertions(+), 32 deletions(-) create mode 100644 src/openclaw/admin_custom_site.py create mode 100644 src/templates/admin/index.html diff --git a/src/config/urls.py b/src/config/urls.py index b38990a..725a355 100644 --- a/src/config/urls.py +++ b/src/config/urls.py @@ -1,7 +1,7 @@ -from django.contrib import admin from django.urls import path, include +from openclaw.admin_custom_site import openclaw_admin_site urlpatterns = [ - path("admin/", admin.site.urls), + path("admin/", openclaw_admin_site.urls), path("api/", include("openclaw.urls")), ] diff --git a/src/openclaw/admin.py b/src/openclaw/admin.py index 59f1840..77a0920 100755 --- a/src/openclaw/admin.py +++ b/src/openclaw/admin.py @@ -1,10 +1,8 @@ from django.contrib import admin from django.http import HttpResponse -from django.template.response import TemplateResponse from openclaw.export import export_daily_markdown from openclaw.models import Session, Message, ToolCall -from openclaw.admin_new_views import daily_report_list_view, daily_report_detail_view class MessageInline(admin.TabularInline): @@ -45,42 +43,18 @@ def export_to_markdown(modeladmin, request, queryset): class SessionAdmin(admin.ModelAdmin): actions = [export_to_markdown] list_display = ( - "session_id", - "agent_name", - "model_id", - "total_tokens", - "message_count", - "tool_call_count", - "status", - "start_time", + "session_id", "agent_name", "model_id", "total_tokens", + "message_count", "tool_call_count", "status", "start_time", ) list_filter = ("agent_name", "source_node", "model_id", "start_time") search_fields = ("session_id", "cwd") ordering = ("-start_time",) inlines = [MessageInline, ToolCallInline] readonly_fields = ( - "session_id", - "agent_name", - "source_node", - "start_time", - "end_time", - "pushed_at", + "session_id", "agent_name", "source_node", + "start_time", "end_time", "pushed_at", ) - def get_urls(self): - from django.urls import path - urls = super().get_urls() - custom_urls = [ - path("daily/", admin.site.admin_view(daily_report_list_view), name="openclaw_daily"), - path("daily-reports/", admin.site.admin_view(daily_report_list_view), name="openclaw_daily_reports"), - path( - "daily-reports//--/", - admin.site.admin_view(daily_report_detail_view), - name="openclaw_daily_report_detail", - ), - ] - return custom_urls + urls - @admin.register(Message) class MessageAdmin(admin.ModelAdmin): diff --git a/src/openclaw/admin_custom_site.py b/src/openclaw/admin_custom_site.py new file mode 100644 index 0000000..ce291b4 --- /dev/null +++ b/src/openclaw/admin_custom_site.py @@ -0,0 +1,52 @@ +""" +Custom AdminSite for OpenClaw — adds Daily Report to sidebar + URLs. +Re-registers Session/Message/ToolCall from admin.py, and adds custom report URLs. +""" + +from django.contrib.admin import AdminSite + +from openclaw.admin_new_views import daily_report_list_view, daily_report_detail_view + + +class OpenClawAdminSite(AdminSite): + site_header = "OpenClaw Archive" + site_title = "OpenClaw Admin" + index_title = "Agent Sessions" + + def get_urls(self): + from django.urls import path + urls = super().get_urls() + custom_urls = [ + path( + "daily/", + self.admin_view(daily_report_list_view), + name="openclaw_daily", + ), + path( + "daily-reports/", + self.admin_view(daily_report_list_view), + name="openclaw_daily_reports", + ), + path( + "daily-reports//--/", + self.admin_view(daily_report_detail_view), + name="openclaw_daily_report_detail", + ), + ] + return custom_urls + urls + + def index(self, request, extra_context=None): + extra_context = extra_context or {} + extra_context["show_daily_report"] = True + return super().index(request, extra_context) + + +openclaw_admin_site = OpenClawAdminSite(name="openclaw_admin") + +# Re-register models with this custom site (imported from admin.py) +from openclaw.admin import SessionAdmin, MessageAdmin, ToolCallAdmin +from openclaw.models import Session, Message, ToolCall + +openclaw_admin_site.register(Session, SessionAdmin) +openclaw_admin_site.register(Message, MessageAdmin) +openclaw_admin_site.register(ToolCall, ToolCallAdmin) diff --git a/src/templates/admin/index.html b/src/templates/admin/index.html new file mode 100644 index 0000000..d0fc367 --- /dev/null +++ b/src/templates/admin/index.html @@ -0,0 +1,24 @@ +{% extends "admin/index.html" %} +{% load static %} + +{% block branding %} +

+ {{ site_header|default:"Django Admin" }} +

+{% endblock %} + +{% block nav-sidebar %} +{{ block.super }} + +{# Daily Report custom sidebar item #} + + +{% endblock %}