Coverage for benefits/oauth/hooks.py: 100%
55 statements
« prev ^ index » next coverage.py v7.10.2, created at 2025-08-08 16:26 +0000
« prev ^ index » next coverage.py v7.10.2, created at 2025-08-08 16:26 +0000
1from cdt_identity.hooks import DefaultHooks
2from django.shortcuts import redirect
3from django.utils.decorators import method_decorator, decorator_from_middleware
4import sentry_sdk
6from benefits.routes import routes
7from benefits.core import session
8from benefits.core.middleware import AgencySessionRequired, FlowSessionRequired
9from benefits.eligibility.views import VerifiedView, analytics as eligibility_analytics
10from . import analytics
13class OAuthHooks(DefaultHooks):
14 @classmethod
15 def pre_login(cls, request):
16 super().pre_login(request)
17 analytics.started_sign_in(request)
19 @classmethod
20 def cancel_login(cls, request):
21 super().cancel_login(request)
22 analytics.canceled_sign_in(request)
23 return redirect(routes.ELIGIBILITY_UNVERIFIED)
25 @classmethod
26 def pre_logout(cls, request):
27 super().pre_logout(request)
28 analytics.started_sign_out(request)
30 # the user is signed out of the app
31 session.logout(request)
33 @classmethod
34 def post_logout(cls, request):
35 super().post_logout(request)
36 analytics.finished_sign_out(request)
38 origin = session.origin(request)
39 return redirect(origin)
41 @classmethod
42 @method_decorator(
43 [
44 decorator_from_middleware(AgencySessionRequired),
45 decorator_from_middleware(FlowSessionRequired),
46 ]
47 )
48 def claims_verified_eligible(cls, request, claims_request, claims_result):
49 super().claims_verified_eligible(request, claims_request, claims_result)
50 session.update(request, logged_in=True)
51 analytics.finished_sign_in(request)
53 flow = session.flow(request)
54 eligibility_analytics.started_eligibility(request, flow)
56 # changing the method to POST since this now represents a verification success
57 # and we want to run the associated logic e.g. sending analytics events
58 # GET requests to the VerifiedView simply redirect to enrollment index
59 request.method = "POST"
60 return VerifiedView().setup_and_dispatch(request)
62 @classmethod
63 @method_decorator(
64 [
65 decorator_from_middleware(AgencySessionRequired),
66 decorator_from_middleware(FlowSessionRequired),
67 ]
68 )
69 def claims_verified_not_eligible(cls, request, claims_request, claims_result):
70 super().claims_verified_not_eligible(request, claims_request, claims_result)
71 session.update(request, logged_in=True)
72 analytics.finished_sign_in(request, error=claims_result.errors)
74 flow = session.flow(request)
75 eligibility_analytics.started_eligibility(request, flow)
77 return redirect(routes.ELIGIBILITY_UNVERIFIED)
79 @classmethod
80 def system_error(cls, request, exception, operation):
81 super().system_error(request, exception, operation)
82 analytics.error(request, message=str(exception), operation=str(operation))
83 sentry_sdk.capture_exception(exception)
84 return redirect(routes.OAUTH_SYSTEM_ERROR)