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)
This commit is contained in:
ishenwei
2026-04-08 20:44:44 +08:00
parent 9542ebde73
commit 21c5e895e0
3 changed files with 40 additions and 16 deletions

View File

@@ -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/<str:agent_name>/<int:year>-<int:month>-<int:day>/",
admin.site.admin_view(daily_report_detail_view),
name="openclaw_daily_report_detail",
),
path("admin/", admin.site.urls),
path("api/", include("openclaw.urls")),
]

View File

@@ -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,

View File

@@ -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