Coverage for benefits/admin.py: 86%

37 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-13 23:09 +0000

1from django.conf import settings 

2from django.contrib.admin import AdminSite 

3 

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 

9 

10from benefits.core.middleware import RecaptchaEnabled 

11from benefits.core.models import TransitAgency 

12from benefits.core import recaptcha, session 

13 

14 

15class BenefitsAdminLoginForm(AdminAuthenticationForm): 

16 

17 def clean(self): 

18 if not recaptcha.verify(self.data): 

19 raise ValidationError("reCAPTCHA failed, please try again.") 

20 return super().clean() 

21 

22 

23class BenefitsAdminSite(AdminSite): 

24 

25 site_title = "Cal-ITP Benefits Administrator" 

26 site_header = "Administrator" 

27 index_title = "Dashboard" 

28 login_form = BenefitsAdminLoginForm 

29 

30 @method_decorator(decorator_from_middleware(RecaptchaEnabled)) 

31 def login(self, request, extra_context=None): 

32 return super().login(request, extra_context) 

33 

34 def index(self, request, extra_context=None): 

35 """ 

36 Display the main admin index page if the user is a superuser or a "staff_group" user. 

37 Display the agency dashboard index page if the user is an agency user. 

38 get_app_list returns a sorted list of all the installed apps that have been 

39 registered in this site. 

40 """ 

41 app_list = self.get_app_list(request) 

42 

43 context = { 

44 **self.each_context(request), 

45 "title": self.index_title, 

46 "subtitle": None, 

47 "app_list": app_list, 

48 **(extra_context or {}), 

49 } 

50 

51 request.current_app = self.name 

52 

53 staff_group = Group.objects.get(name=settings.STAFF_GROUP_NAME) 

54 if request.user.is_superuser or request.user.groups.filter(name=staff_group).exists(): 

55 return TemplateResponse(request, "admin/index.html", context) 

56 else: 

57 agency = TransitAgency.for_user(request.user) 

58 session.update(request, agency=agency) 

59 

60 if agency is not None: 60 ↛ 72line 60 didn't jump to line 72 because the condition on line 60 was always true

61 has_permission_for_in_person = agency.customer_service_group in request.user.groups.all() 

62 transit_processor_portal_url = agency.transit_processor.portal_url 

63 

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 ) 

71 

72 return TemplateResponse(request, "admin/agency-dashboard-index.html", context)