summaryrefslogtreecommitdiff
path: root/talerbank/app/middleware.py
diff options
context:
space:
mode:
authorMarcello Stanisci <stanisci.m@gmail.com>2017-12-22 21:55:56 +0100
committerMarcello Stanisci <stanisci.m@gmail.com>2017-12-22 21:55:56 +0100
commit4e1f605a97f48f6300f632b64f46b4d9e98714f5 (patch)
tree7df2771acd9aa0313ddf282c6e9d86e3befe6e66 /talerbank/app/middleware.py
parent9db330755e89eb233900474fcf454320eb5f678c (diff)
downloadbank-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.py62
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