diff options
author | Marcello Stanisci <stanisci.m@gmail.com> | 2019-11-29 22:23:25 +0100 |
---|---|---|
committer | Marcello Stanisci <stanisci.m@gmail.com> | 2019-11-29 22:23:25 +0100 |
commit | c7f8e5962d4b7175d2f4e51f45a434a969b91f4b (patch) | |
tree | 31876004b0d026c85ea47f4d633f3b2ee2441ac4 | |
parent | 258613121ae37015f007b285a5b82af4f09e0db2 (diff) | |
download | bank-c7f8e5962d4b7175d2f4e51f45a434a969b91f4b.tar.gz bank-c7f8e5962d4b7175d2f4e51f45a434a969b91f4b.tar.bz2 bank-c7f8e5962d4b7175d2f4e51f45a434a969b91f4b.zip |
finishing style migration
-rw-r--r-- | talerbank/app/middleware.py | 2 | ||||
-rw-r--r-- | talerbank/app/schemas.py | 130 | ||||
-rw-r--r-- | talerbank/app/tests.py | 4 | ||||
-rw-r--r-- | talerbank/app/views.py | 55 |
4 files changed, 91 insertions, 100 deletions
diff --git a/talerbank/app/middleware.py b/talerbank/app/middleware.py index 08c85aa..cff5006 100644 --- a/talerbank/app/middleware.py +++ b/talerbank/app/middleware.py @@ -1,3 +1,4 @@ +import traceback import logging import zlib from . import urls @@ -101,6 +102,7 @@ class ExceptionMiddleware: LOGGER.error(repr(exception)) if not hasattr(exception, "taler_error_code"): + traceback.print_exc() exception = UnhandledException() render_to = self.render.get(request.path) diff --git a/talerbank/app/schemas.py b/talerbank/app/schemas.py index ed3eb83..6b529b3 100644 --- a/talerbank/app/schemas.py +++ b/talerbank/app/schemas.py @@ -54,6 +54,11 @@ class InvalidSession(ValueError): self.http_status_code = http_status_code super().__init__() +class InternalServerError(Exception): + def __init__(self, hint): + self.hint = hint + self.http_status_code = 500 + self.taler_error_code = 1011 # TALER_EC_INTERNAL_LOGIC_ERROR ## # Exception class to be raised when a JSON @@ -119,28 +124,35 @@ class AuthField(forms.Field): raise ValidationError(json.dumps(af.errors.as_json())) -class RejectData(forms.Form): - auth = AuthField() - # FIXME: adjust min/max values. - row_id = forms.IntegerField() - account_number = forms.IntegerField() +class BankValidator(): + def __init__(self, validator, data): + self.validation_result = validator(data) + if not self.validation_result.is_valid(): + raise JSONFieldException(self.validation_result.errors, 400) + def get(self, name, default=None): + ret = self.validation_result.cleaned_data.get(name) + if not ret: + return default + return ret -class AddIncomingData(): +class RejectData(BankValidator): def __init__(self, data): - self.inner_form = self.InnerForm(data) - if not self.inner_form.is_valid(): - JSONFieldException(data.errors, 400) + super(RejectData, self).__init__(self.InnerValidator, data) - def get(self, name): - ret = self.inner_form.cleaned_data.get(name) - # rare / impossible - if not ret: - raise JSONFieldException(data.errors, 400) - return ret + class InnerValidator(forms.Form): + auth = AuthField() + # FIXME: adjust min/max values. + row_id = forms.IntegerField() + account_number = forms.IntegerField() - class InnerForm(forms.Form): + +class AddIncomingData(BankValidator): + def __init__(self, data): + super(AddIncomingData, self).__init__(self.InnerValidator, data) + + class InnerValidator(forms.Form): auth = AuthField() amount = forms.CharField( validators=[ @@ -155,8 +167,7 @@ class AddIncomingData(): ## -# Form specification that validates GET parameters from a -# /history request. +# Subset of /history and /history-range input. class HistoryParamsBase(forms.Form): auth = forms.CharField( validators=[ @@ -198,23 +209,25 @@ class HistoryParamsBase(forms.Form): account_number = forms.IntegerField(required=False) -class HistoryParams(HistoryParamsBase): - def clean_start(self): - delta = self.cleaned_data.get("delta") - start = self.cleaned_data.get("start") - if None == start: - return 0 if 0 <= delta else UINT64_MAX - return start +class HistoryParams(BankValidator): + def __init__(self, data): + super(HistoryParams, self).__init__(self.InnerValidator, data) + + class InnerValidator(HistoryParamsBase): + # FIXME: adjust min/max values. + delta = forms.IntegerField() + start = forms.IntegerField(required=False) - # FIXME: adjust min/max values. - delta = forms.IntegerField() - start = forms.IntegerField(required=False) +class HistoryRangeParams(BankValidator): -class HistoryRangeParams(HistoryParamsBase): - # FIXME: adjust min/max values. - end = forms.IntegerField() - start = forms.IntegerField() + def __init__(self, data): + super(HistoryRangeParams, self).__init__(self.InnerValidator, data) + + class InnerValidator(HistoryParamsBase): + # FIXME: adjust min/max values. + end = forms.IntegerField() + start = forms.IntegerField() class PaytoField(forms.Field): @@ -237,17 +250,22 @@ class PaytoField(forms.Field): raise ValidationError("URL is not 'payto'") -class WithdrawHeadless(forms.Form): - auth = AuthField() - amount = forms.CharField( - validators=[ - RegexValidator( - AMOUNT_REGEX, message="Format CURRENCY:X[.Y] not respected" - ) - ] - ) - reserve_pub = forms.CharField() - exchange_wire_details = PaytoField(required=False) +class WithdrawHeadless(BankValidator): + + def __init__(self, data): + super(WithdrawHeadless, self).__init__(self.InnerValidator, data) + + class InnerValidator(forms.Form): + auth = AuthField() + amount = forms.CharField( + validators=[ + RegexValidator( + AMOUNT_REGEX, message="Format CURRENCY:X[.Y] not respected" + ) + ] + ) + reserve_pub = forms.CharField(required=True) + exchange_wire_details = PaytoField(required=False) class WithdrawHeadlessUri(forms.Form): amount = forms.CharField( @@ -259,19 +277,6 @@ class WithdrawHeadlessUri(forms.Form): ) -class PinTanParams(forms.Form): - amount_currency = forms.CharField( - validators=[ - RegexValidator("^[A-Z]+$", message="Currency is all upper case") - ] - ) - amount_value = forms.IntegerField(min_value=0) - amount_fraction = forms.IntegerField(min_value=0) - exchange = forms.URLField() - reserve_pub = forms.CharField() - exchange_wire_details = PaytoField() - - class SenderWireDetails(forms.Form): # FIXME: must be changed to 'payto' format. type = forms.CharField() @@ -287,16 +292,3 @@ class SenderWireDetailsField(forms.Field): swd = SenderWireDetails(value) if not swd.is_valid(): raise ValidationError(json.dumps(swd.errors.as_json())) - - -class WithdrawSessionData(forms.Form): - amount = forms.CharField( - validators=[ - RegexValidator( - AMOUNT_REGEX, message="Could not find valid amount in state.." - ) - ] - ) - reserve_pub = forms.CharField() - exchange_account_number = forms.IntegerField(min_value=1) - sender_wiredetails = SenderWireDetailsField() diff --git a/talerbank/app/tests.py b/talerbank/app/tests.py index 4181c8c..aba7158 100644 --- a/talerbank/app/tests.py +++ b/talerbank/app/tests.py @@ -777,8 +777,8 @@ class DBCustomColumnTestCase(TestCase): self.assertTrue(isinstance(user_bankaccount.amount, Amount)) -# This tests whether a bank account goes debit and then goes >=0 -# again +## This tests whether a bank account goes debit and then goes >=0 +## again class DebitTestCase(TestCase): def setUp(self): BankAccount(user=User.objects.create_user(username='U')).save() diff --git a/talerbank/app/views.py b/talerbank/app/views.py index c97d86b..d41f659 100644 --- a/talerbank/app/views.py +++ b/talerbank/app/views.py @@ -50,8 +50,8 @@ import qrcode.image.svg import lxml from .schemas import ( HistoryParams, HistoryRangeParams, URLParamValidationError, RejectData, - AddIncomingData, JSONFieldException, PinTanParams, InvalidSession, - WithdrawSessionData, WithdrawHeadless, WithdrawHeadlessUri + AddIncomingData, JSONFieldException, InvalidSession, WithdrawHeadless, + WithdrawHeadlessUri ) LOGGER = logging.getLogger(__name__) @@ -738,20 +738,21 @@ def build_history_response(qs, cancelled, user_account): @login_via_headers def serve_history_range(request, user_account): - get_params = HistoryRangeParams(request.GET.dict()) - if not get_params.is_valid(): - raise URLParamValidationError(get_params.errors, 400) + args = HistoryRangeParams(request.GET.dict()) - start_td = datetime.fromtimestamp(get_params.cleaned_data.get("start")) - end_td = datetime.fromtimestamp(get_params.cleaned_data.get("end")) + start_td = datetime.fromtimestamp(args.get("start")) + end_td = datetime.fromtimestamp(args.get("end")) qs = query_history_range( - user_account.bankaccount, request.GET.get("direction"), start_td, - end_td, get_params.cleaned_data.get("ordering") + user_account.bankaccount, + args.get("direction", "both"), + start_td, + end_td, + args.get("ordering") ) history = build_history_response( - qs, get_params.cleaned_data.get("cancelled"), user_account + qs, args.get("cancelled", "show"), user_account ) if not history: @@ -768,19 +769,18 @@ def serve_history_range(request, user_account): @require_GET @login_via_headers def serve_history(request, user_account): - get_params = HistoryParams(request.GET.dict()) - if not get_params.is_valid(): - raise URLParamValidationError(get_params.errors, 400) + args = HistoryParams(request.GET.dict()) qs = query_history( - user_account.bankaccount, get_params.cleaned_data.get("direction"), - get_params.cleaned_data.get("delta"), - get_params.cleaned_data.get("start"), - get_params.cleaned_data.get("ordering") + user_account.bankaccount, + args.get("direction"), + args.get("delta"), + args.get("start", UINT64_MAX), + args.get("ordering", "descending") ) history = build_history_response( - qs, get_params.cleaned_data.get("cancelled"), user_account + qs, args.get("cancelled", "show"), user_account ) if not history: @@ -824,10 +824,8 @@ def auth_and_login(request): def reject(request, user_account): data = RejectData(json.loads(decode_body(request))) - if not data.is_valid(): - raise JSONFieldException(data.errors, 400) - trans = BankTransaction.objects.get(id=data.cleaned_data.get("row_id")) + trans = BankTransaction.objects.get(id=data.get("row_id")) if trans.credit_account.account_no != \ user_account.bankaccount.account_no: raise RejectNoRightsException() @@ -931,25 +929,24 @@ def withdraw_headless(request, user): (request.get_host(), user.bankaccount.account_no) ret_obj = ({"sender_wire_details": sender_payto}) - if not data.is_valid(): - raise JSONFieldException(data.errors, 400) - - # Pick default exchange. - if None == data.cleaned_data["exchange_wire_details"]: + exchange_payto = data.get("exchange_wire_details") + if not exchange_payto: exchange_accno = get_acct_from_payto( settings.TALER_SUGGESTED_EXCHANGE_PAYTO ) ret_obj.update(exchange_url=settings.TALER_SUGGESTED_EXCHANGE) else: exchange_accno = get_acct_from_payto( - data.cleaned_data["exchange_wire_details"] + exchange_payto ) exchange_bankaccount = BankAccount.objects.get(account_no=exchange_accno) wire_transfer( - Amount.parse(data.cleaned_data["amount"]), user.bankaccount, - exchange_bankaccount, data.cleaned_data["reserve_pub"] + Amount.parse(data.get("amount")), + user.bankaccount, + exchange_bankaccount, + data.get("reserve_pub") ) return JsonResponse(ret_obj) |