Coverage for benefits/eligibility/views.py: 97%
82 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-14 01:41 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-14 01:41 +0000
1"""
2The eligibility application: view definitions for the eligibility verification flow.
3"""
5from django.contrib import messages
6from django.shortcuts import redirect
7from django.template.response import TemplateResponse
8from django.urls import reverse
9from django.utils.decorators import decorator_from_middleware
11from benefits.routes import routes
12from benefits.core import recaptcha, session
13from benefits.core.middleware import AgencySessionRequired, RecaptchaEnabled, FlowSessionRequired
14from benefits.core.models import EnrollmentFlow
15from . import analytics, forms, verify
17TEMPLATE_CONFIRM = "eligibility/confirm.html"
20@decorator_from_middleware(AgencySessionRequired)
21@decorator_from_middleware(RecaptchaEnabled)
22def index(request):
23 """View handler for the enrollment flow selection form."""
24 agency = session.agency(request)
25 session.update(request, eligible=False, origin=agency.index_url)
27 # clear any prior OAuth token as the user is choosing their desired flow
28 # this may or may not require OAuth, with a different set of scope/claims than what is already stored
29 session.logout(request)
31 context = {"form": forms.EnrollmentFlowSelectionForm(agency=agency)}
33 if request.method == "POST":
34 form = forms.EnrollmentFlowSelectionForm(data=request.POST, agency=agency)
36 if form.is_valid():
37 flow_id = form.cleaned_data.get("flow")
38 flow = EnrollmentFlow.objects.get(id=flow_id)
39 session.update(request, flow=flow)
41 analytics.selected_flow(request, flow)
43 eligibility_start = reverse(routes.ELIGIBILITY_START)
44 response = redirect(eligibility_start)
45 else:
46 # form was not valid, allow for correction/resubmission
47 if recaptcha.has_error(form): 47 ↛ 48line 47 didn't jump to line 48 because the condition on line 47 was never true
48 messages.error(request, "Recaptcha failed. Please try again.")
49 context["form"] = form
50 context.update(agency.eligibility_index_context)
51 response = TemplateResponse(request, "eligibility/index.html", context)
52 else:
53 context.update(agency.eligibility_index_context)
54 response = TemplateResponse(request, "eligibility/index.html", context)
56 return response
59@decorator_from_middleware(AgencySessionRequired)
60@decorator_from_middleware(FlowSessionRequired)
61def start(request):
62 """View handler for the eligibility verification getting started screen."""
63 session.update(request, eligible=False, origin=reverse(routes.ELIGIBILITY_START))
65 flow = session.flow(request)
67 return TemplateResponse(request, "eligibility/start.html", flow.eligibility_start_context)
70@decorator_from_middleware(AgencySessionRequired)
71@decorator_from_middleware(RecaptchaEnabled)
72@decorator_from_middleware(FlowSessionRequired)
73def confirm(request):
74 """View handler for the eligibility verification form."""
76 # GET from an already verified user, no need to verify again
77 if request.method == "GET" and session.eligible(request):
78 return verified(request)
80 agency = session.agency(request)
81 flow = session.flow(request)
83 form = flow.eligibility_form_instance()
85 # GET/POST for Eligibility API verification
86 context = {"form": form}
88 # GET from an unverified user, present the form
89 if request.method == "GET":
90 session.update(request, origin=reverse(routes.ELIGIBILITY_CONFIRM))
91 return TemplateResponse(request, TEMPLATE_CONFIRM, context)
92 # POST form submission, process form data, make Eligibility Verification API call
93 elif request.method == "POST": 93 ↛ exitline 93 didn't return from function 'confirm' because the condition on line 93 was always true
94 analytics.started_eligibility(request, flow)
96 form = flow.eligibility_form_instance(data=request.POST)
97 # form was not valid, allow for correction/resubmission
98 if not form.is_valid():
99 if recaptcha.has_error(form):
100 messages.error(request, "Recaptcha failed. Please try again.")
101 context["form"] = form
102 return TemplateResponse(request, TEMPLATE_CONFIRM, context)
104 # form is valid, make Eligibility Verification request to get the verified confirmation
105 is_verified = verify.eligibility_from_api(flow, form, agency)
107 # form was not valid, allow for correction/resubmission
108 if is_verified is None:
109 analytics.returned_error(request, flow, form.errors)
110 context["form"] = form
111 return TemplateResponse(request, TEMPLATE_CONFIRM, context)
112 # no type was verified
113 elif not is_verified:
114 return redirect(routes.ELIGIBILITY_UNVERIFIED)
115 # type was verified
116 else:
117 return verified(request)
120@decorator_from_middleware(AgencySessionRequired)
121def verified(request):
122 """View handler for the verified eligibility page."""
124 flow = session.flow(request)
125 analytics.returned_success(request, flow)
127 session.update(request, eligible=True)
129 return redirect(routes.ENROLLMENT_INDEX)
132@decorator_from_middleware(AgencySessionRequired)
133@decorator_from_middleware(FlowSessionRequired)
134def unverified(request):
135 """View handler for the unverified eligibility page."""
137 flow = session.flow(request)
139 analytics.returned_fail(request, flow)
141 return TemplateResponse(request, "eligibility/unverified.html", flow.eligibility_unverified_context)