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)
# 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()
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()
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()
"""
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
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
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.