diff options
author | Marcello Stanisci <marcello.stanisci@inria.fr> | 2017-03-21 14:30:28 +0100 |
---|---|---|
committer | Marcello Stanisci <marcello.stanisci@inria.fr> | 2017-03-21 14:30:28 +0100 |
commit | a37e84da7c180ac44c6b9c43ab4219be67d375b8 (patch) | |
tree | c905d4db9f700a358e85c0b22a135339f1ccf1a7 /talerbank | |
parent | b2adea3efc1fdc13ee7cf56e229b8b64513b187f (diff) | |
download | bank-a37e84da7c180ac44c6b9c43ab4219be67d375b8.tar.gz bank-a37e84da7c180ac44c6b9c43ab4219be67d375b8.tar.bz2 bank-a37e84da7c180ac44c6b9c43ab4219be67d375b8.zip |
fix #4824's related issues
Diffstat (limited to 'talerbank')
-rw-r--r-- | talerbank/app/amounts.py | 18 | ||||
-rw-r--r-- | talerbank/app/models.py | 27 | ||||
m--------- | talerbank/app/static/web-common | 0 | ||||
-rw-r--r-- | talerbank/app/views.py | 6 |
4 files changed, 44 insertions, 7 deletions
diff --git a/talerbank/app/amounts.py b/talerbank/app/amounts.py index 93f65e6..d76eaff 100644 --- a/talerbank/app/amounts.py +++ b/talerbank/app/amounts.py @@ -24,6 +24,22 @@ logger = logging.getLogger(__name__) FRACTION = 100000000 +def amount_add(a1, a2): + assert(a1["currency"] == a2["currency"]) + a1_float = floatify(a1) + a2_float = floatify(a2) + return parse_amount("%s %s" % (str(a1_float + a2_float), a2["currency"])) + +def amount_sub(a1, a2): + assert(a1["currency"] == a2["currency"]) + a1_float = floatify(a1) + a2_float = floatify(a2) + sub = a1_float - a2_float + fmt = "%s %s" % (str(sub), a2["currency"]) + logger.info(fmt) + return parse_amount(fmt) + + def floatify(amount_dict): return amount_dict['value'] + (float(amount_dict['fraction']) / float(FRACTION)) @@ -36,7 +52,7 @@ def parse_amount(amount_str): Parse amount of return None if not a valid amount string """ - parsed = re.search("^\s*([0-9]+)(\.[0-9]+)? ([-_*A-Za-z0-9]+)\s*$", amount_str) + parsed = re.search("^\s*((-)?[0-9]+)(\.[0-9]+)? ([-_*A-Za-z0-9]+)\s*$", amount_str) if not parsed: return None value = int(parsed.group(1)) diff --git a/talerbank/app/models.py b/talerbank/app/models.py index 0543fbb..f87caa2 100644 --- a/talerbank/app/models.py +++ b/talerbank/app/models.py @@ -28,13 +28,34 @@ class BankAccount(models.Model): currency = models.CharField(max_length=12, default="") account_no = models.AutoField(primary_key=True) user = models.OneToOneField(User, on_delete=models.CASCADE) - + def _get_balance(self): + return dict(value=self.balance_value, + fraction=self.balance_fraction, + currency=self.currency) + def _set_balance(self, amount): + self.balance_value = amount["value"] + self.balance_fraction = amount["fraction"] + self.currency = amount["currency"] + balance_obj = property(_get_balance, _set_balance) class BankTransaction(models.Model): amount_value = models.IntegerField(default=0) amount_fraction = models.IntegerField(default=0) currency = models.CharField(max_length=12) - debit_account = models.ForeignKey(BankAccount, on_delete=models.CASCADE, related_name="debit_account") - credit_account = models.ForeignKey(BankAccount, on_delete=models.CASCADE, related_name="credit_account") + debit_account = models.ForeignKey(BankAccount, + on_delete=models.CASCADE, + related_name="debit_account") + credit_account = models.ForeignKey(BankAccount, + on_delete=models.CASCADE, + related_name="credit_account") subject = models.CharField(default="(no subject given)", max_length=200) date = models.DateTimeField(auto_now=True) + def _get_amount(self): + return dict(value=self.amount_value, + fraction=self.amount_fraction, + currency=self.currency) + def _set_amount(self, amount): + self.amount_value = amount["value"] + self.amount_fraction = amount["fraction"] + self.currency = amount["currency"] + amount_obj = property(_get_amount, _set_amount) diff --git a/talerbank/app/static/web-common b/talerbank/app/static/web-common -Subproject 6dd8ca1675817cc0ca65f0819489234eeafaa2e +Subproject dc9d5ab2308fef7cdd1e8c95fbf4fdd51bed7bf diff --git a/talerbank/app/views.py b/talerbank/app/views.py index 4225956..57dc42a 100644 --- a/talerbank/app/views.py +++ b/talerbank/app/views.py @@ -263,7 +263,7 @@ def extract_history(account): counterpart = item.credit_account sign = -1 entry = dict( - float_amount=amounts.stringify(item.amount * sign), + float_amount=amounts.stringify(amounts.floatify(item.amount_obj) * sign), float_currency=item.currency, counterpart=counterpart.account_no, counterpart_username=counterpart.user.username, @@ -391,8 +391,8 @@ def wire_transfer(amount, credit_account=credit_account, debit_account=debit_account, subject=subject) - debit_account.balance -= float_amount - credit_account.balance += float_amount + debit_account.balance_obj = amounts.amount_sub(debit_account.balance_obj, amount) + credit_account.balance_obj = amounts.amount_add(credit_account.balance_obj, amount) with transaction.atomic(): debit_account.save() |