diff options
Diffstat (limited to 'talerbank/app/middleware.py')
-rw-r--r-- | talerbank/app/middleware.py | 104 |
1 files changed, 46 insertions, 58 deletions
diff --git a/talerbank/app/middleware.py b/talerbank/app/middleware.py index eb34b96..e335a1a 100644 --- a/talerbank/app/middleware.py +++ b/talerbank/app/middleware.py @@ -5,21 +5,18 @@ from . import urls from django.http import JsonResponse from django.urls import reverse from django.shortcuts import redirect -from .models import BankAccount, BankTransaction, \ - BankAccountDoesNotExist, BankTransactionDoesNotExist -from .views import \ - (DebitLimitException, SameAccountException, - LoginFailed, RejectNoRightsException, UnhandledException, - set_profile_hint) - -from .schemas import \ - (JSONFieldException, - URLParamValidationError, - InvalidSession) - -from taler.util.amount import \ - (CurrencyMismatch, BadFormatAmount, - NumberTooBig, NegativeNumber) +from .models import BankAccount, BankTransaction +from .views import ( + DebitLimitException, + SameAccountException, + LoginFailed, + UnhandledException, + set_profile_hint, +) + +from .schemas import JSONFieldException, URLParamValidationError, InvalidSession + +from taler.util.amount import CurrencyMismatchError, AmountFormatError LOGGER = logging.getLogger() @@ -56,65 +53,56 @@ class DecompressionMiddleware: return self.get_response(request) -## -# Class holding data needed by the handling logic. + class ExceptionMiddleware: + """ + Middleware for handling exceptions not caught directly + by the application logic. + """ - ## - # Init constructor. - # - # @param self the object itself. - # @param get_response a Django-provided callable that calls - # whatever comes next in the chain: a further middleware - # or the view itself (please refer to the official - # documentation for more details). def __init__(self, get_response): + """ + # Init constructor. + # + # @param self the object itself. + # @param get_response a Django-provided callable that calls + # whatever comes next in the chain: a further middleware + # or the view itself (please refer to the official + # documentation for more details). + """ self.get_response = get_response # Map between endpoints and Web pages to render # after the exception gets managed. self.render = { reverse("profile", urlconf=urls): "profile", - reverse("register", urlconf=urls): "index", + reverse("register", urlconf=urls): "index", reverse("public-accounts", urlconf=urls): "index", } - ## - # This function is transparently invoked by Django when - # a request traverses the chain made of middleware classes - # and the view itself as the last element in the chain. - # - # @param self this class. - # @param request Django-specific request object (of the same - # type that is handed to views). - # @return Django-specific response object. def __call__(self, request): + """ + This function is transparently invoked by Django when + a request traverses the chain made of middleware classes + and the view itself as the last element in the chain. + """ return self.get_response(request) - ## - # Main logic for processing the exception. It checks - # if the exception captured can be managed, and does it - # if so. Otherwise, it lets the native handler operate. - # - # @param self a @a ExceptionMiddleware object. - # @param request Django-specific HTTP request. - # @param exception the exception raised from the bank. def process_exception(self, request, exception): + """ + Main logic for processing the exception. It checks + if the exception captured can be managed, and does it + if so. Otherwise, it lets the native handler operate. + """ LOGGER.error(f"Error: {exception}, while serving {request.get_full_path()}") - if not hasattr(exception, "taler_error_code"): - print("####### Exception without Taler Error Code ########") - traceback.print_exc() - print("###################################################") - exception = UnhandledException() - - render_to = self.render.get(request.path) - - if not render_to: - return JsonResponse({"ec": exception.taler_error_code, - "error": exception.hint}, - status=exception.http_status_code) - set_profile_hint(request, failure=True, success=False, hint=exception.hint) - return redirect(render_to) + if hasattr(exception, "taler_error_code"): + render_to = self.render.get(request.path) -# [1] https://git.taler.net/exchange.git/tree/src/include/taler_error_codes.h + if not render_to: + return JsonResponse( + {"ec": exception.taler_error_code, "error": exception.hint}, + status=exception.http_status_code, + ) + set_profile_hint(request, failure=True, success=False, hint=exception.hint) + return redirect(render_to) |