7 from decimal import Decimal, InvalidOperation
9 from bluechips.lib.base import *
11 from pylons import request
12 from pylons.decorators.rest import dispatch_on
13 from pylons.decorators import validate
15 from formencode import validators, Schema
16 from formencode.foreach import ForEach
17 from formencode.variabledecode import NestedVariables
19 log = logging.getLogger(__name__)
22 class ShareSchema(Schema):
23 "Validate individual user shares."
24 allow_extra_fields = False
25 user_id = validators.Int(not_empty=True)
26 amount = validators.Number(not_empty=True)
29 class ExpenditureSchema(Schema):
30 "Validate an expenditure."
31 allow_extra_fields = False
32 pre_validators = [NestedVariables()]
33 spender_id = validators.Int(not_empty=True)
34 amount = model.types.CurrencyValidator(not_empty=True)
35 description = validators.UnicodeString()
36 date = validators.DateConverter()
37 shares = ForEach(ShareSchema)
40 class SpendController(BaseController):
44 def edit(self, id=None):
45 c.users = meta.Session.query(model.User.id, model.User)
47 c.title = 'Add a New Expenditure'
48 c.expenditure = model.Expenditure()
49 c.expenditure.spender_id = request.environ['user'].id
51 num_residents = meta.Session.query(model.User).\
52 filter_by(resident=True).count()
53 # Pre-populate split percentages for an even split.
55 for ii, user_row in enumerate(c.users):
56 user_id, user = user_row
58 val = Decimal(100) / Decimal(num_residents)
61 c.values['shares-%d.amount' % ii] = val
63 c.title = 'Edit an Expenditure'
64 c.expenditure = meta.Session.query(model.Expenditure).get(id)
65 return render('/spend/index.mako')
67 @validate(schema=ExpenditureSchema(), form='edit', variable_decode=True)
68 def update(self, id=None):
69 # Either create a new object, or, if we're editing, get the
72 e = model.Expenditure()
75 e = meta.Session.query(model.Expenditure).get(id)
77 # Set the fields that were submitted
78 shares = self.form_result.pop('shares')
79 update_sar(e, self.form_result)
83 users = dict(meta.Session.query(model.User.id, model.User).all())
85 for share_params in shares:
86 user = users[share_params['user_id']]
87 split_dict[user] = Decimal(share_params['amount'])
92 h.flash('Expenditure updated.')
94 return h.redirect_to('/')