Coverage for benefits/admin.py: 86%
38 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-22 21:13 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-22 21:13 +0000
1from django.conf import settings
2from django.contrib.admin import AdminSite
4from django.forms import ValidationError
5from django.contrib.admin.forms import AdminAuthenticationForm
6from django.contrib.auth.models import Group
7from django.template.response import TemplateResponse
8from django.utils.decorators import method_decorator, decorator_from_middleware
10from benefits.core.middleware import RecaptchaEnabled
11from benefits.core.models import TransitAgency
12from benefits.core import recaptcha, session
15class BenefitsAdminLoginForm(AdminAuthenticationForm):
17 def clean(self):
18 if not recaptcha.verify(self.data):
19 raise ValidationError("reCAPTCHA failed, please try again.")
20 return super().clean()
23class BenefitsAdminSite(AdminSite):
25 site_title = "Cal-ITP Benefits Administrator"
26 site_header = "Administrator"
27 index_title = "Dashboard"
28 login_form = BenefitsAdminLoginForm
29 enable_nav_sidebar = False
31 @method_decorator(decorator_from_middleware(RecaptchaEnabled))
32 def login(self, request, extra_context=None):
33 return super().login(request, extra_context)
35 def index(self, request, extra_context=None):
36 """
37 Display the main admin index page if the user is a superuser or a "staff_group" user.
38 Display the agency dashboard index page if the user is an agency user.
39 get_app_list returns a sorted list of all the installed apps that have been
40 registered in this site.
41 """
42 app_list = self.get_app_list(request)
44 context = {
45 **self.each_context(request),
46 "title": self.index_title,
47 "subtitle": None,
48 "app_list": app_list,
49 **(extra_context or {}),
50 }
52 request.current_app = self.name
54 staff_group = Group.objects.get(name=settings.STAFF_GROUP_NAME)
55 if request.user.is_superuser or request.user.groups.filter(name=staff_group).exists():
56 return TemplateResponse(request, "admin/index.html", context)
57 else:
58 agency = TransitAgency.for_user(request.user)
59 session.update(request, agency=agency)
61 if agency is not None: 61 ↛ 73line 61 didn't jump to line 73 because the condition on line 61 was always true
62 has_permission_for_in_person = agency.customer_service_group in request.user.groups.all()
63 transit_processor_portal_url = agency.transit_processor.portal_url
65 context.update(
66 {
67 "has_permission_for_in_person": has_permission_for_in_person,
68 "transit_processor_portal_url": transit_processor_portal_url,
69 "title": f"{agency.long_name} | {self.index_title} | {self.site_title}",
70 }
71 )
73 return TemplateResponse(request, "admin/agency-dashboard-index.html", context)