]> asedeno.scripts.mit.edu Git - bluechips.git/commitdiff
added special Currency validator
authorScott Torborg <scott@crookedmedia.com>
Wed, 4 Nov 2009 03:08:47 +0000 (17:08 -1000)
committerScott Torborg <scott@crookedmedia.com>
Wed, 4 Nov 2009 03:08:47 +0000 (17:08 -1000)
bluechips/controllers/spend.py
bluechips/controllers/transfer.py
bluechips/model/types.py

index aa6a59c05f6c8952831d55b3d32a5eefa53475f9..3d5f82abc0ed178fbe8b3e7c4e242250539bf393 100644 (file)
@@ -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()
index e324c6f2b6beb8d217c1d5daa899e59c847b1bba..d68ed9e4e84c56f65c2e8f5e16ff3a45a0a3f48c 100644 (file)
@@ -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()
         
index 673a366927386ac8025821bd1ed1ce6adebe634e..fdd3b8bd4c6ce1c622960c0df02827a4965427c3 100644 (file)
@@ -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.