summaryrefslogtreecommitdiff
path: root/talerbank/app/middleware.py
diff options
context:
space:
mode:
Diffstat (limited to 'talerbank/app/middleware.py')
-rw-r--r--talerbank/app/middleware.py104
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)