BrickTracker/bricktracker/views/exceptions.py

47 lines
1.2 KiB
Python
Raw Normal View History

2025-01-17 11:03:00 +01:00
from functools import wraps
import logging
from typing import Callable, ParamSpec, Tuple, Union
from werkzeug.wrappers.response import Response
from .error import error
logger = logging.getLogger(__name__)
# Decorator type hinting is hard.
# What a view can return (str or Response or (Response, xxx))
ViewReturn = Union[
str,
Response,
Tuple[str | Response, int]
]
# View signature (*arg, **kwargs -> (str or Response or (Response, xxx))
P = ParamSpec('P')
ViewCallable = Callable[P, ViewReturn]
# Return the exception template or response if an exception occured
def exception_handler(
file: str,
/,
json: bool = False,
post_redirect: str | None = None
) -> Callable[[ViewCallable], ViewCallable]:
def outer(function: ViewCallable, /) -> ViewCallable:
@wraps(function)
def wrapper(*args, **kwargs) -> ViewReturn:
try:
return function(*args, **kwargs)
# Catch SQLite errors as database errors
except Exception as e:
return error(
e,
file,
json=json,
post_redirect=post_redirect,
**kwargs,
)
return wrapper
return outer