Coverage for benefits/enrollment/views.py: 99%

64 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-10-10 16:52 +0000

1""" 

2The enrollment application: view definitions for the benefits enrollment flow. 

3""" 

4 

5import logging 

6 

7from django.template.defaultfilters import date 

8from django.template.response import TemplateResponse 

9from django.urls import reverse 

10from django.utils.decorators import decorator_from_middleware 

11from django.views.generic import RedirectView, TemplateView 

12 

13from benefits.core.context.flow import SystemName 

14from benefits.core.context import formatted_gettext_lazy as _ 

15from benefits.routes import routes 

16from benefits.core import session 

17from benefits.core.mixins import AgencySessionRequiredMixin, EligibleSessionRequiredMixin, FlowSessionRequiredMixin 

18from benefits.core.middleware import EligibleSessionRequired, FlowSessionRequired, pageview_decorator 

19 

20from . import analytics 

21 

22TEMPLATE_RETRY = "enrollment/retry.html" 

23TEMPLATE_SYSTEM_ERROR = "enrollment/system_error.html" 

24 

25 

26logger = logging.getLogger(__name__) 

27 

28 

29class IndexView(AgencySessionRequiredMixin, EligibleSessionRequiredMixin, RedirectView): 

30 """CBV for the enrollment landing page.""" 

31 

32 route_origin = routes.ENROLLMENT_INDEX 

33 

34 def get_redirect_url(self, *args, **kwargs): 

35 route_name = self.agency.enrollment_index_route 

36 return reverse(route_name) 

37 

38 def get(self, request, *args, **kwargs): 

39 session.update(request, origin=reverse(self.route_origin)) 

40 return super().get(request, *args, **kwargs) 

41 

42 

43class ReenrollmentErrorView(FlowSessionRequiredMixin, EligibleSessionRequiredMixin, TemplateView): 

44 """View handler for a re-enrollment attempt that is not yet within the re-enrollment window.""" 

45 

46 template_name = "enrollment/reenrollment-error.html" 

47 

48 def get_context_data(self, **kwargs): 

49 context = super().get_context_data(**kwargs) 

50 

51 request = self.request 

52 

53 flow = self.flow 

54 expiry = session.enrollment_expiry(request) 

55 reenrollment = session.enrollment_reenrollment(request) 

56 

57 if flow.system_name == SystemName.CALFRESH: 57 ↛ 66line 57 didn't jump to line 66 because the condition on line 57 was always true

58 does_not_expire_until = _("Your CalFresh Cardholder transit benefit does not expire until") 

59 reenroll_on = _("You can re-enroll for this benefit beginning on") 

60 try_again = _("Please try again then.") 

61 

62 context["paragraphs"] = [ 

63 f"{does_not_expire_until} {date(expiry)}. {reenroll_on} {date(reenrollment)}. {try_again}" 

64 ] 

65 

66 return context 

67 

68 def get(self, request, *args, **kwargs): 

69 flow = self.flow 

70 

71 if session.logged_in(request) and flow.supports_sign_out: 

72 # overwrite origin for a logged in user 

73 # if they click the logout button, they are taken to the new route 

74 session.update(request, origin=reverse(routes.LOGGED_OUT)) 

75 

76 return super().get(request, *args, **kwargs) 

77 

78 

79@decorator_from_middleware(EligibleSessionRequired) 

80def retry(request): 

81 """View handler for a recoverable failure condition.""" 

82 analytics.returned_retry(request) 

83 return TemplateResponse(request, TEMPLATE_RETRY) 

84 

85 

86@decorator_from_middleware(EligibleSessionRequired) 

87def system_error(request): 

88 """View handler for an enrollment system error.""" 

89 

90 # overwrite origin so that CTA takes user to agency index 

91 agency = session.agency(request) 

92 session.update(request, origin=agency.index_url) 

93 

94 return TemplateResponse(request, TEMPLATE_SYSTEM_ERROR) 

95 

96 

97@pageview_decorator 

98@decorator_from_middleware(EligibleSessionRequired) 

99@decorator_from_middleware(FlowSessionRequired) 

100def success(request): 

101 """View handler for the final success page.""" 

102 request.path = "/enrollment/success" 

103 session.update(request, origin=reverse(routes.ENROLLMENT_SUCCESS)) 

104 

105 flow = session.flow(request) 

106 

107 if session.logged_in(request) and flow.supports_sign_out: 

108 # overwrite origin for a logged in user 

109 # if they click the logout button, they are taken to the new route 

110 session.update(request, origin=reverse(routes.LOGGED_OUT)) 

111 

112 context = {"redirect_to": request.path} 

113 context.update(flow.enrollment_success_context) 

114 

115 return TemplateResponse(request, "enrollment/success.html", context)