+ def edit(self, id=None):
+ c.users = meta.Session.query(model.User.id, model.User)
+ if id is None:
+ c.title = 'Add a New Expenditure'
+ c.expenditure = model.Expenditure()
+ c.expenditure.spender_id = request.environ['user'].id
+
+ num_residents = meta.Session.query(model.User).\
+ filter_by(resident=True).count()
+ # Pre-populate split percentages for an even split.
+ 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)
+ 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
+ # old one
+ if id is None:
+ e = model.Expenditure()
+ meta.Session.add(e)
+ 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')