From cef3f80d9d9a7a08b8c09bc909cb52afbdb0f0d2 Mon Sep 17 00:00:00 2001 From: Scott Torborg Date: Tue, 3 Nov 2009 17:08:47 -1000 Subject: [PATCH] added special Currency validator --- bluechips/controllers/spend.py | 3 +-- bluechips/controllers/transfer.py | 3 +-- bluechips/model/types.py | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/bluechips/controllers/spend.py b/bluechips/controllers/spend.py index aa6a59c..3d5f82a 100644 --- a/bluechips/controllers/spend.py +++ b/bluechips/controllers/spend.py @@ -31,7 +31,7 @@ class ExpenditureSchema(Schema): allow_extra_fields = False pre_validators = [NestedVariables()] spender_id = validators.Int(not_empty=True) - amount = validators.Number(not_empty=True) + amount = model.types.CurrencyValidator(not_empty=True) description = validators.UnicodeString() date = validators.DateConverter() shares = ForEach(ShareSchema) @@ -64,7 +64,6 @@ class SpendController(BaseController): # Set the fields that were submitted shares = self.form_result.pop('shares') - e.amount = Decimal(self.form_result.pop('amount') * 100) update_sar(e, self.form_result) if e.id is not None: e.update_split() diff --git a/bluechips/controllers/transfer.py b/bluechips/controllers/transfer.py index e324c6f..d68ed9e 100644 --- a/bluechips/controllers/transfer.py +++ b/bluechips/controllers/transfer.py @@ -21,7 +21,7 @@ class TransferSchema(Schema): allow_extra_fields = False debtor_id = validators.Int(not_empty=True) creditor_id = validators.Int(not_empty=True) - amount = validators.Number(not_empty=True) + amount = model.types.CurrencyValidator(not_empty=True) description = validators.UnicodeString() date = validators.DateConverter() @@ -50,7 +50,6 @@ class TransferController(BaseController): else: t = meta.Session.query(model.Transfer).get(id) - t.amount = self.form_result.pop('amount') * 100 update_sar(t, self.form_result) meta.Session.commit() diff --git a/bluechips/model/types.py b/bluechips/model/types.py index 673a366..fdd3b8b 100644 --- a/bluechips/model/types.py +++ b/bluechips/model/types.py @@ -3,8 +3,10 @@ Define special types used in BlueChips """ import locale +from decimal import Decimal, InvalidOperation import sqlalchemy as sa +from formencode import validators, Invalid from bluechips.lib.subclass import SmartSubclass from weakref import WeakValueDictionary @@ -32,6 +34,27 @@ def localeconv(): return d locale.localeconv = localeconv + +class CurrencyValidator(validators.FancyValidator): + "A validator to convert to Currency objects." + messages = {'amount': "Please enter a valid currency amount", + 'precision': "Only two digits after the decimal, please"} + + def _to_python(self, value, state): + try: + dec = Decimal(value) + except InvalidOperation: + raise Invalid(self.message('amount', state), + value, state) + else: + ret = dec.quantize(Decimal('1.00')) + if ret != dec: + raise Invalid(self.message('precision', state), + value, state) + else: + return Currency(int(ret * 100)) + + class Currency(object): """ Store currency values as an integral number of cents @@ -107,6 +130,7 @@ class Currency(object): def __str__(self): return locale.currency(self.value / 100., grouping=True) + class DBCurrency(sa.types.TypeDecorator): """ A type which represents monetary amounts internally as integers. -- 2.45.2