From 21c5e895e0f7c77e7a142029810a9091f0d44cb2 Mon Sep 17 00:00:00 2001 From: ishenwei Date: Wed, 8 Apr 2026 20:44:44 +0800 Subject: [PATCH] feat: add Daily Reports to admin sidebar via monkey-patch - urls.py: add daily/ and daily-reports/ URL patterns directly - admin_new_views.py: use admin.site.each_context for full admin context - openclaw_daily apps.py: monkey-patch admin.site.get_app_list to inject Daily Reports item into sidebar app list (no circular import issues) --- src/config/urls.py | 17 +++++++++++++++-- src/openclaw/admin_new_views.py | 16 ++-------------- src/openclaw_daily/apps.py | 23 +++++++++++++++++++++++ 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/config/urls.py b/src/config/urls.py index 725a355..7225e07 100644 --- a/src/config/urls.py +++ b/src/config/urls.py @@ -1,7 +1,20 @@ +from django.contrib import admin from django.urls import path, include -from openclaw.admin_custom_site import openclaw_admin_site + +from openclaw.admin_new_views import ( + daily_report_list_view, + daily_report_detail_view, +) urlpatterns = [ - path("admin/", openclaw_admin_site.urls), + # Custom daily report URLs (before admin.site to take precedence) + path("admin/daily/", admin.site.admin_view(daily_report_list_view), name="openclaw_daily"), + path("admin/daily-reports/", admin.site.admin_view(daily_report_list_view), name="openclaw_daily_reports"), + path( + "admin/daily-reports//--/", + admin.site.admin_view(daily_report_detail_view), + name="openclaw_daily_report_detail", + ), + path("admin/", admin.site.urls), path("api/", include("openclaw.urls")), ] diff --git a/src/openclaw/admin_new_views.py b/src/openclaw/admin_new_views.py index 1f38a3e..d00d1d2 100644 --- a/src/openclaw/admin_new_views.py +++ b/src/openclaw/admin_new_views.py @@ -8,8 +8,6 @@ from collections import defaultdict from datetime import date from django.contrib import admin -from django.db.models import Count -from django.db.models.functions import TruncDate from django.http import Http404 from django.template.response import TemplateResponse @@ -17,10 +15,6 @@ from openclaw.models import Session, Message, ToolCall def daily_report_list_view(request): - """ - List page: shows all (agent_name, date) combinations with message/session counts. - Filterable by agent and date range. - """ start_str = request.GET.get("start") end_str = request.GET.get("end") agent_filter = request.GET.get("agent", "") @@ -63,10 +57,8 @@ def daily_report_list_view(request): key=lambda x: (-x["date_val"].toordinal(), x["agent_name"]), ) - # Use request.admin_site (set by AdminSite.admin_view wrapper) - admin_site = getattr(request, "admin_site", admin.site) context = { - **admin_site.each_context(request), + **admin.site.each_context(request), "start_date": start_date, "end_date": end_date, "selected_agent": agent_filter, @@ -78,9 +70,6 @@ def daily_report_list_view(request): def daily_report_detail_view(request, agent_name, year, month, day): - """ - Detail page: all messages for a specific agent on a specific date. - """ target_date = date(int(year), int(month), int(day)) sessions = ( @@ -111,9 +100,8 @@ def daily_report_detail_view(request, agent_name, year, month, day): "system": "System", } - admin_site = getattr(request, "admin_site", admin.site) context = { - **admin_site.each_context(request), + **admin.site.each_context(request), "agent_name": agent_name, "target_date": target_date, "sessions": sessions_with_messages, diff --git a/src/openclaw_daily/apps.py b/src/openclaw_daily/apps.py index 02fdb94..8f53ae2 100644 --- a/src/openclaw_daily/apps.py +++ b/src/openclaw_daily/apps.py @@ -1,6 +1,29 @@ from django.apps import AppConfig + class OpenClawDailyConfig(AppConfig): name = "openclaw_daily" label = "openclaw_daily" verbose_name = "Daily Reports" + + def ready(self): + from django.contrib import admin + + _orig = admin.site.get_app_list + + def _patched(request, app_label=None): + app_list = _orig(request, app_label) + app_list.insert(0, { + "name": "Daily Reports", + "app_label": "openclaw_daily", + "app_url": "/admin/daily-reports/", + "models": [{ + "name": "Daily Reports", + "object_name": "DailyReports", + "admin_url": "/admin/daily-reports/", + "view_only": True, + }], + }) + return app_list + + admin.site.get_app_list = _patched