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

1""" 

2The core application: view definition for the root of the webapp. 

3""" 

4 

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 

12 

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 

17 

18TEMPLATE_AGENCY = "core/index--agency-base.html" 

19TEMPLATE_LOGGED_OUT = "core/logged-out.html" 

20 

21TEMPLATE_BAD_REQUEST = "400.html" 

22TEMPLATE_NOT_FOUND = "404.html" 

23TEMPLATE_SERVER_ERROR = "500.html" 

24 

25 

26class IndexView(FormView): 

27 """View handler for the main entry page.""" 

28 

29 template_name = "core/index.html" 

30 form_class = ChooseAgencyForm 

31 

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) 

37 

38 @method_decorator(pageview_decorator) 

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

40 session.reset(request) 

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

42 

43 

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) 

49 

50 return TemplateResponse(request, "core/index--agency.html", agency.index_context) 

51 

52 

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) 

58 

59 return redirect(routes.ELIGIBILITY_INDEX) 

60 

61 

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") 

66 

67 

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) 

73 

74 eligibility_api_flow = agency.enrollment_flows.exclude(eligibility_api_url="").order_by("id").last() 

75 

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) 

81 

82 

83class HelpView(TemplateView): 

84 """View handler for the help page.""" 

85 

86 template_name = "core/help.html" 

87 

88 @method_decorator(pageview_decorator) 

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

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

91 

92 def get_context_data(self, **kwargs): 

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

94 

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()] 

98 

99 return context 

100 

101 

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) 

107 

108 return HttpResponseBadRequest(t.render(request=request)) 

109 

110 

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) 

118 

119 return HttpResponseNotFound(t.render(request=request)) 

120 

121 

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) 

127 

128 return HttpResponseNotFound(t.render(request=request)) 

129 

130 

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) 

136 

137 return HttpResponseServerError(t.render(request=request)) 

138 

139 

140def logged_out(request): 

141 """View handler for the final log out confirmation message.""" 

142 return TemplateResponse(request, TEMPLATE_LOGGED_OUT)