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.decorators.secure import authenticate_form
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
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
description = validators.UnicodeString()
date = validators.DateConverter()
shares = ForEach(ShareSchema)
+ chained_validators = [ValidateNotAllZero]
class SpendController(BaseController):
c.values = {}
for ii, user_row in enumerate(c.users):
user_id, user = user_row
+ val = 0
if user.resident:
val = Decimal(100) / Decimal(num_residents)
- else:
- val = 0
c.values['shares-%d.amount' % ii] = val
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
+ shares_by_user = dict(((sp.user, sp.share) for sp
+ in c.expenditure.splits))
+ share = shares_by_user.get(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"))
+ c.values['shares-%d.amount' % ii] = percent
+
return render('/spend/index.mako')
+ @redirect_on_get('edit')
+ @authenticate_form
@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
# 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 = {}