Coverage for benefits/core/views.py: 91%
81 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-06 23:14 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-06 23:14 +0000
1"""
2The core application: view definition for the root of the webapp.
3"""
5from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound, HttpResponseServerError
6from django.shortcuts import redirect
7from django.template import loader
8from django.template.response import TemplateResponse
9from django.utils.decorators import method_decorator
10from django.views.generic import TemplateView
11from django.views.generic.edit import FormView
13from benefits.core.forms import ChooseAgencyForm
14from benefits.routes import routes
15from . import models, session
16from .middleware import pageview_decorator, index_or_agencyindex_origin_decorator, user_error
18TEMPLATE_AGENCY = "core/index--agency-base.html"
19TEMPLATE_LOGGED_OUT = "core/logged-out.html"
21TEMPLATE_BAD_REQUEST = "400.html"
22TEMPLATE_NOT_FOUND = "404.html"
23TEMPLATE_SERVER_ERROR = "500.html"
26class IndexView(FormView):
27 """View handler for the main entry page."""
29 template_name = "core/index.html"
30 form_class = ChooseAgencyForm
32 # this form cannot use an action_url because the redirect is determined
33 # *after* user interaction
34 def form_valid(self, form):
35 self.success_url = form.selected_transit_agency.eligibility_index_url
36 return super().form_valid(form)
38 @method_decorator(pageview_decorator)
39 def get(self, request, *args, **kwargs):
40 session.reset(request)
41 return super().get(request, *args, **kwargs)
44@pageview_decorator
45def agency_index(request, agency: models.TransitAgency):
46 """View handler for an agency entry page."""
47 session.reset(request)
48 session.update(request, agency=agency, origin=agency.index_url)
50 return TemplateResponse(request, "core/index--agency.html", agency.index_context)
53@pageview_decorator
54def agency_eligibility_index(request, agency: models.TransitAgency):
55 """View handler forwards the request to the agency's Eligibility Index (e.g. flow selection) page."""
56 session.reset(request)
57 session.update(request, agency=agency, origin=agency.index_url)
59 return redirect(routes.ELIGIBILITY_INDEX)
62@pageview_decorator
63def agency_public_key(request, agency: models.TransitAgency):
64 """View handler returns an agency's public key as plain text."""
65 return HttpResponse(agency.eligibility_api_public_key_data, content_type="text/plain")
68@pageview_decorator
69def agency_card(request, agency: models.TransitAgency):
70 """View handler forwards the request to the agency's Agency Card (e.g. Eligibility API) flow, or returns a user error."""
71 session.reset(request)
72 session.update(request, agency=agency, origin=agency.index_url)
74 eligibility_api_flow = agency.enrollment_flows.exclude(eligibility_api_url="").order_by("id").last()
76 if eligibility_api_flow:
77 session.update(request, flow=eligibility_api_flow)
78 return redirect(routes.ELIGIBILITY_CONFIRM)
79 else:
80 return user_error(request)
83class HelpView(TemplateView):
84 """View handler for the help page."""
86 template_name = "core/help.html"
88 @method_decorator(pageview_decorator)
89 def get(self, request, *args, **kwargs):
90 return super().get(request, *args, **kwargs)
92 def get_context_data(self, **kwargs):
93 context = super().get_context_data(**kwargs)
95 if not session.active_agency(self.request):
96 choices = models.CardSchemes.CHOICES
97 context["all_card_schemes"] = [choices[card_scheme] for card_scheme in choices.keys()]
99 return context
102@pageview_decorator
103@index_or_agencyindex_origin_decorator
104def bad_request(request, exception, template_name=TEMPLATE_BAD_REQUEST):
105 """View handler for HTTP 400 Bad Request responses."""
106 t = loader.get_template(template_name)
108 return HttpResponseBadRequest(t.render(request=request))
111@pageview_decorator
112@index_or_agencyindex_origin_decorator
113def csrf_failure(request, reason):
114 """
115 View handler for CSRF_FAILURE_VIEW with custom data.
116 """
117 t = loader.get_template(TEMPLATE_BAD_REQUEST)
119 return HttpResponseNotFound(t.render(request=request))
122@pageview_decorator
123@index_or_agencyindex_origin_decorator
124def page_not_found(request, exception, template_name=TEMPLATE_NOT_FOUND):
125 """View handler for HTTP 404 Not Found responses."""
126 t = loader.get_template(template_name)
128 return HttpResponseNotFound(t.render(request=request))
131@pageview_decorator
132@index_or_agencyindex_origin_decorator
133def server_error(request, template_name=TEMPLATE_SERVER_ERROR):
134 """View handler for HTTP 500 Server Error responses."""
135 t = loader.get_template(template_name)
137 return HttpResponseServerError(t.render(request=request))
140def logged_out(request):
141 """View handler for the final log out confirmation message."""
142 return TemplateResponse(request, TEMPLATE_LOGGED_OUT)