diff options
author | Marcello Stanisci <stanisci.m@gmail.com> | 2017-12-22 21:55:56 +0100 |
---|---|---|
committer | Marcello Stanisci <stanisci.m@gmail.com> | 2017-12-22 21:55:56 +0100 |
commit | 4e1f605a97f48f6300f632b64f46b4d9e98714f5 (patch) | |
tree | 7df2771acd9aa0313ddf282c6e9d86e3befe6e66 /talerbank/app/middleware.py | |
parent | 9db330755e89eb233900474fcf454320eb5f678c (diff) | |
download | bank-4e1f605a97f48f6300f632b64f46b4d9e98714f5.tar.gz bank-4e1f605a97f48f6300f632b64f46b4d9e98714f5.tar.bz2 bank-4e1f605a97f48f6300f632b64f46b4d9e98714f5.zip |
Implementing #5222.
Diffstat (limited to 'talerbank/app/middleware.py')
-rw-r--r-- | talerbank/app/middleware.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/talerbank/app/middleware.py b/talerbank/app/middleware.py new file mode 100644 index 0000000..ab4269a --- /dev/null +++ b/talerbank/app/middleware.py @@ -0,0 +1,62 @@ +import logging +from django.http import JsonResponse +from .models import BankAccount, BankTransaction +from .views import \ + (DebitLimitException, SameAccountException, + LoginFailed, RejectNoRightsException) +from .schemas import \ + (URLParameterMissing, URLParameterMalformed, + JSONFieldException, UnknownCurrencyException) +from .amount import CurrencyMismatch, BadFormatAmount + +LOGGER = logging.getLogger() + +EXCS = { + BankAccount.DoesNotExist: 0, + BankTransaction.DoesNotExist: 1, + SameAccountException: 2, + DebitLimitException: 3, + URLParameterMissing: 8, + URLParameterMalformed: 9, + JSONFieldException: 6, + CurrencyMismatch: 11, + BadFormatAmount: 11, + LoginFailed: 12, + RejectNoRightsException: 13, + UnknownCurrencyException: 14} + +APIS = { + "/reject": 5300, + "/history": 5200, + "/admin/add/incoming": 5100} + +RENDER = { + "/profile": "profile", + "/register": "index", + "/public-accounts": "index", + "/pin/verify": "profile"} + +class ExceptionMiddleware: + + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + return self.get_response(request) + + def process_exception(self, request, exception): + if not EXCS.get(exception.__class__): + return None + taler_ec = EXCS.get(exception.__class__) + # The way error codes compose matches definitions found + # at [1]. + taler_ec += APIS.get(request.path, 1000) + render_to = RENDER.get(request.path) + if not render_to: + return JsonResponse({"ec": taler_ec, + "error": exception.hint}, + status=exception.http_status_code) + request.session["profile_hint"] = True, False, hint + return redirect(render_to) + +# [1] https://git.taler.net/exchange.git/tree/src/include/taler_error_codes.h#n1502 |