]> asedeno.scripts.mit.edu Git - bluechips.git/blobdiff - bluechips/controllers/spend.py
require at least one non-zero share on an expenditure
[bluechips.git] / bluechips / controllers / spend.py
index c99d325ba10984b2fd1da0a508cf9479668ca8b3..cc6466fed32f95ef15365e9bc86ec53079773dc2 100644 (file)
@@ -16,6 +16,7 @@ from pylons.controllers.util import abort
 from formencode import validators, Schema
 from formencode.foreach import ForEach
 from formencode.variabledecode import NestedVariables
+from formencode.schema import SimpleFormValidator
 
 from mailer import Message
 
@@ -29,6 +30,12 @@ class ShareSchema(Schema):
     amount = validators.Number(not_empty=True)
 
 
+def validate_state(value_dict, state, validator):
+    if all(s['amount'] == 0 for s in value_dict['shares']):
+        return {'shares-0.amount': 'Need at least one non-zero share'}
+ValidateNotAllZero = SimpleFormValidator(validate_state)
+
+
 class ExpenditureSchema(Schema):
     "Validate an expenditure."
     allow_extra_fields = False
@@ -38,6 +45,7 @@ class ExpenditureSchema(Schema):
     description = validators.UnicodeString()
     date = validators.DateConverter()
     shares = ForEach(ShareSchema)
+    chained_validators = [ValidateNotAllZero]
     
 
 class SpendController(BaseController):
@@ -73,9 +81,12 @@ class SpendController(BaseController):
                 try:
                     share = [s.share for s in c.expenditure.splits
                              if s.user == user][0]
-                    percent = (Decimal(100) * Decimal(int(share)) /
-                               Decimal(int(c.expenditure.amount))).\
-                            quantize(Decimal("0.001"))
+                    if c.expenditure.amount == 0:
+                        percent = 0
+                    else:
+                        percent = (Decimal(100) * Decimal(int(share)) /
+                                   Decimal(int(c.expenditure.amount))).\
+                                quantize(Decimal("0.001"))
                 except IndexError:
                     percent = 0
                 c.values['shares-%d.amount' % ii] = percent
@@ -99,8 +110,6 @@ class SpendController(BaseController):
         # Set the fields that were submitted
         shares = self.form_result.pop('shares')
         update_sar(e, self.form_result)
-        if e.id is not None:
-            e.update_split()
 
         users = dict(meta.Session.query(model.User.id, model.User).all())
         split_dict = {}