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
« 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"""
5import logging
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
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
20from . import analytics
22TEMPLATE_RETRY = "enrollment/retry.html"
23TEMPLATE_SYSTEM_ERROR = "enrollment/system_error.html"
26logger = logging.getLogger(__name__)
29class IndexView(AgencySessionRequiredMixin, EligibleSessionRequiredMixin, RedirectView):
30 """CBV for the enrollment landing page."""
32 route_origin = routes.ENROLLMENT_INDEX
34 def get_redirect_url(self, *args, **kwargs):
35 route_name = self.agency.enrollment_index_route
36 return reverse(route_name)
38 def get(self, request, *args, **kwargs):
39 session.update(request, origin=reverse(self.route_origin))
40 return super().get(request, *args, **kwargs)
43class ReenrollmentErrorView(FlowSessionRequiredMixin, EligibleSessionRequiredMixin, TemplateView):
44 """View handler for a re-enrollment attempt that is not yet within the re-enrollment window."""
46 template_name = "enrollment/reenrollment-error.html"
48 def get_context_data(self, **kwargs):
49 context = super().get_context_data(**kwargs)
51 request = self.request
53 flow = self.flow
54 expiry = session.enrollment_expiry(request)
55 reenrollment = session.enrollment_reenrollment(request)
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.")
62 context["paragraphs"] = [
63 f"{does_not_expire_until} {date(expiry)}. {reenroll_on} {date(reenrollment)}. {try_again}"
64 ]
66 return context
68 def get(self, request, *args, **kwargs):
69 flow = self.flow
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))
76 return super().get(request, *args, **kwargs)
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)
86@decorator_from_middleware(EligibleSessionRequired)
87def system_error(request):
88 """View handler for an enrollment system error."""
90 # overwrite origin so that CTA takes user to agency index
91 agency = session.agency(request)
92 session.update(request, origin=agency.index_url)
94 return TemplateResponse(request, TEMPLATE_SYSTEM_ERROR)
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))
105 flow = session.flow(request)
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))
112 context = {"redirect_to": request.path}
113 context.update(flow.enrollment_success_context)
115 return TemplateResponse(request, "enrollment/success.html", context)