summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcello Stanisci <stanisci.m@gmail.com>2019-11-29 22:23:25 +0100
committerMarcello Stanisci <stanisci.m@gmail.com>2019-11-29 22:23:25 +0100
commitc7f8e5962d4b7175d2f4e51f45a434a969b91f4b (patch)
tree31876004b0d026c85ea47f4d633f3b2ee2441ac4
parent258613121ae37015f007b285a5b82af4f09e0db2 (diff)
downloadbank-c7f8e5962d4b7175d2f4e51f45a434a969b91f4b.tar.gz
bank-c7f8e5962d4b7175d2f4e51f45a434a969b91f4b.tar.bz2
bank-c7f8e5962d4b7175d2f4e51f45a434a969b91f4b.zip
finishing style migration
-rw-r--r--talerbank/app/middleware.py2
-rw-r--r--talerbank/app/schemas.py130
-rw-r--r--talerbank/app/tests.py4
-rw-r--r--talerbank/app/views.py55
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)