33from contextlib import asynccontextmanager
44from dotenv import load_dotenv
55from fastapi import FastAPI , Request , Depends , status
6- from fastapi .responses import RedirectResponse
6+ from fastapi .responses import RedirectResponse , Response
77from fastapi .staticfiles import StaticFiles
88from fastapi .templating import Jinja2Templates
99from fastapi .exceptions import RequestValidationError
1010from starlette .exceptions import HTTPException as StarletteHTTPException
1111from routers .core import account , dashboard , organization , role , user , static_pages , invitation
1212from utils .core .dependencies import (
13- get_optional_user
13+ get_optional_user ,
14+ get_user_from_request
1415)
1516from exceptions .http_exceptions import (
1617 AuthenticationError ,
@@ -91,21 +92,29 @@ async def needs_new_tokens_handler(request: Request, exc: NeedsNewTokens):
9192
9293# Handle PasswordValidationError by rendering the validation_error page
9394@app .exception_handler (PasswordValidationError )
94- async def password_validation_exception_handler (request : Request , exc : PasswordValidationError ):
95+ async def password_validation_exception_handler (
96+ request : Request ,
97+ exc : PasswordValidationError
98+ ) -> Response :
99+ user = await get_user_from_request (request )
95100 return templates .TemplateResponse (
96101 request ,
97102 "errors/validation_error.html" ,
98103 {
99104 "status_code" : 422 ,
100- "errors" : {"error" : exc .detail }
105+ "errors" : {"error" : exc .detail },
106+ "user" : user
101107 },
102108 status_code = 422 ,
103109 )
104110
105111
106112# Handle RequestValidationError by rendering the validation_error page
107113@app .exception_handler (RequestValidationError )
108- async def validation_exception_handler (request : Request , exc : RequestValidationError ):
114+ async def validation_exception_handler (
115+ request : Request ,
116+ exc : RequestValidationError
117+ ):
109118 errors = {}
110119
111120 # Map error types to user-friendly message templates
@@ -129,26 +138,28 @@ async def validation_exception_handler(request: Request, exc: RequestValidationE
129138 # For JSON body, it might be (body, field_name)
130139 # For array items, it might be (field_name, array_index)
131140 field_name = location [- 2 ] if isinstance (location [- 1 ], int ) else location [- 1 ]
132-
141+
133142 # Format the field name to be more user-friendly
134143 display_name = field_name .replace ("_" , " " ).title ()
135-
144+
136145 # Use mapped message if available, otherwise use FastAPI's message
137146 error_type = error .get ("type" , "" )
138147 message_template = error_templates .get (error_type , error ["msg" ])
139-
148+
140149 # For array items, append the index to the message
141150 if isinstance (location [- 1 ], int ):
142151 message_template = f"Item { location [- 1 ] + 1 } : { message_template } "
143-
152+
144153 errors [display_name ] = message_template
145154
155+ user = await get_user_from_request (request )
146156 return templates .TemplateResponse (
147157 request ,
148158 "errors/validation_error.html" ,
149159 {
150160 "status_code" : 422 ,
151- "errors" : errors
161+ "errors" : errors ,
162+ "user" : user
152163 },
153164 status_code = 422 ,
154165 )
@@ -157,10 +168,11 @@ async def validation_exception_handler(request: Request, exc: RequestValidationE
157168# Handle StarletteHTTPException (including 404, 405, etc.) by rendering the error page
158169@app .exception_handler (StarletteHTTPException )
159170async def http_exception_handler (request : Request , exc : StarletteHTTPException ):
171+ user = await get_user_from_request (request )
160172 return templates .TemplateResponse (
161173 request ,
162174 "errors/error.html" ,
163- {"status_code" : exc .status_code , "detail" : exc .detail },
175+ {"status_code" : exc .status_code , "detail" : exc .detail , "user" : user },
164176 status_code = exc .status_code ,
165177 )
166178
@@ -170,13 +182,15 @@ async def http_exception_handler(request: Request, exc: StarletteHTTPException):
170182async def general_exception_handler (request : Request , exc : Exception ):
171183 # Log the error for debugging
172184 logger .error (f"Unhandled exception: { exc } " , exc_info = True )
185+ user = await get_user_from_request (request )
173186
174187 return templates .TemplateResponse (
175188 request ,
176189 "errors/error.html" ,
177190 {
178191 "status_code" : 500 ,
179- "detail" : "Internal Server Error"
192+ "detail" : "Internal Server Error" ,
193+ "user" : user
180194 },
181195 status_code = 500 ,
182196 )
0 commit comments