from django.contrib import admin from django.urls import include, path, reverse from django.utils.translation import gettext_lazy as _ from rest_framework.routers import DefaultRouter from . import models from .views.admin import StatisticsView __all__ = ["AdminSite"] class AdminSite(admin.AdminSite): extra_urls = None tools = [ (_("Statistics"), "admin:tools-stats"), ] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.router = DefaultRouter() self.extra_urls = [] self.tools = type(self).tools.copy() def each_context(self, request): context = super().each_context(request) context.update( { # all programs "programs": models.Program.objects.active() .values("pk", "title") .order_by("title"), # today's diffusions "diffusions": models.Diffusion.objects.date() .order_by("start") .select_related("episode"), # TODO: only for dashboard # last comments "comments": models.Comment.objects.order_by( "-date" ).select_related("page")[0:10], "latests": models.Page.objects.select_subclasses().order_by( "-pub_date" )[0:10], } ) return context def get_urls(self): urls = ( [ path("api/", include((self.router.urls, "api"))), path( "tools/statistics/", self.admin_view(StatisticsView.as_view()), name="tools-stats", ), path( "tools/statistics//", self.admin_view(StatisticsView.as_view()), name="tools-stats", ), ] + self.extra_urls + super().get_urls() ) return urls def get_tools(self): return [(label, reverse(url)) for label, url in self.tools] def route_view(self, url, view, name, admin_view=True, label=None): self.extra_urls.append( path(url, self.admin_view(view) if admin_view else view, name=name) ) if label: self.tools.append((label, "admin:" + name))