Coverage for benefits / admin.py: 93%
37 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-13 19:35 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-13 19:35 +0000
1from django.conf import settings
2from django.contrib.admin import AdminSite
3from django.contrib.admin.forms import AdminAuthenticationForm
4from django.contrib.auth.models import Group
5from django.template.response import TemplateResponse
6from django.utils.decorators import decorator_from_middleware, method_decorator
8from benefits.core import session
9from benefits.core.middleware import RecaptchaEnabled
10from benefits.core.mixins import ValidateRecaptchaMixin
11from benefits.core.models import TransitAgency
14class BenefitsAdminLoginForm(ValidateRecaptchaMixin, AdminAuthenticationForm):
15 pass
18class BenefitsAdminSite(AdminSite):
20 site_title = "Cal-ITP Benefits Administrator"
21 site_header = "Administrator"
22 index_title = "Dashboard"
23 login_form = BenefitsAdminLoginForm
24 enable_nav_sidebar = False
26 @method_decorator(decorator_from_middleware(RecaptchaEnabled))
27 def login(self, request, extra_context=None):
28 return super().login(request, extra_context)
30 def index(self, request, extra_context=None):
31 """
32 Display the main admin index page if the user is a superuser or a "staff_group" user.
33 Display the agency dashboard index page if the user is an agency user.
34 get_app_list returns a sorted list of all the installed apps that have been
35 registered in this site.
36 """
37 app_list = self.get_app_list(request)
39 context = {
40 **self.each_context(request),
41 "title": self.index_title,
42 "subtitle": None,
43 "app_list": app_list,
44 **(extra_context or {}),
45 }
47 request.current_app = self.name
49 staff_group = Group.objects.get(name=settings.STAFF_GROUP_NAME)
50 if request.user.is_superuser or request.user.groups.filter(name=staff_group).exists():
51 return TemplateResponse(request, "admin/index.html", context)
52 else:
53 agency = TransitAgency.for_user(request.user)
54 session.update(request, agency=agency)
56 if agency is not None: 56 ↛ 72line 56 didn't jump to line 72 because the condition on line 56 was always true
57 has_permission_for_in_person = agency.customer_service_group in request.user.groups.all()
59 if hasattr(agency, "transitprocessorconfig"): 59 ↛ 60line 59 didn't jump to line 60 because the condition on line 59 was never true
60 transit_processor_portal_url = agency.transitprocessorconfig.portal_url
61 else:
62 transit_processor_portal_url = ""
64 context.update(
65 {
66 "has_permission_for_in_person": has_permission_for_in_person,
67 "transit_processor_portal_url": transit_processor_portal_url,
68 "title": f"{agency.long_name} | {self.index_title} | {self.site_title}",
69 }
70 )
72 return TemplateResponse(request, "admin/agency-dashboard-index.html", context)