X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=bluechips%2Fcontrollers%2Fspend.py;h=8d2dc4a526e182f8f80430babb5be0452b53da78;hb=01eb085c206c4ba88045fb88a2f1076622bd2585;hp=e309b00410421dd397d27b7dd26f047a1b69af74;hpb=25e0dd950ef119f1bf6b7ab0a54c730f4f9f5922;p=bluechips.git diff --git a/bluechips/controllers/spend.py b/bluechips/controllers/spend.py index e309b00..8d2dc4a 100644 --- a/bluechips/controllers/spend.py +++ b/bluechips/controllers/spend.py @@ -11,10 +11,12 @@ from bluechips.lib.base import * from pylons import request, app_globals as g from pylons.decorators.rest import dispatch_on from pylons.decorators import validate +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 @@ -28,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 @@ -37,6 +45,7 @@ class ExpenditureSchema(Schema): description = validators.UnicodeString() date = validators.DateConverter() shares = ForEach(ShareSchema) + chained_validators = [ValidateNotAllZero] class SpendController(BaseController): @@ -64,8 +73,27 @@ class SpendController(BaseController): else: c.title = 'Edit an Expenditure' c.expenditure = meta.Session.query(model.Expenditure).get(id) + if c.expenditure is None: + abort(404) + c.values = {} + for ii, user_row in enumerate(c.users): + user_id, user = user_row + try: + share = [s.share for s in c.expenditure.splits + if s.user == user][0] + 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 + return render('/spend/index.mako') + @redirect_on_get('edit') @validate(schema=ExpenditureSchema(), form='edit', variable_decode=True) def update(self, id=None): # Either create a new object, or, if we're editing, get the @@ -76,19 +104,19 @@ class SpendController(BaseController): op = 'created' else: e = meta.Session.query(model.Expenditure).get(id) + if e is None: + abort(404) op = 'updated' # 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 = {} for share_params in shares: user = users[share_params['user_id']] - split_dict[user] = Decimal(share_params['amount']) + split_dict[user] = Decimal(str(share_params['amount'])) e.split(split_dict) meta.Session.commit()