X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=bluechips%2Fcontrollers%2Fspend.py;h=c99d325ba10984b2fd1da0a508cf9479668ca8b3;hb=da1f93fdb5d86f642018933a5ef51949b28a8125;hp=aa6a59c05f6c8952831d55b3d32a5eefa53475f9;hpb=acccaf1c26b247e15d6fe5e10658548cc4718295;p=bluechips.git diff --git a/bluechips/controllers/spend.py b/bluechips/controllers/spend.py index aa6a59c..c99d325 100644 --- a/bluechips/controllers/spend.py +++ b/bluechips/controllers/spend.py @@ -8,14 +8,17 @@ from decimal import Decimal, InvalidOperation from bluechips.lib.base import * -from pylons import request +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 mailer import Message + log = logging.getLogger(__name__) @@ -31,7 +34,7 @@ class ExpenditureSchema(Schema): allow_extra_fields = False pre_validators = [NestedVariables()] spender_id = validators.Int(not_empty=True) - amount = validators.Number(not_empty=True) + amount = model.types.CurrencyValidator(not_empty=True) description = validators.UnicodeString() date = validators.DateConverter() shares = ForEach(ShareSchema) @@ -47,9 +50,36 @@ class SpendController(BaseController): 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 + 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 + 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")) + except IndexError: + percent = 0 + c.values['shares-%d.amount' % ii] = percent + return render('/spend/index.mako') @validate(schema=ExpenditureSchema(), form='edit', variable_decode=True) @@ -59,12 +89,15 @@ class SpendController(BaseController): 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') - e.amount = Decimal(self.form_result.pop('amount') * 100) update_sar(e, self.form_result) if e.id is not None: e.update_split() @@ -73,11 +106,21 @@ class SpendController(BaseController): 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() - - h.flash('Expenditure updated.') + show = ("Expenditure of %s paid for by %s %s." % + (e.amount, e.spender, op)) + h.flash(show) + + # Send email notification to involved users if they have an email set. + involved_users = set(sp.user for sp in e.splits if sp.share != 0) + involved_users.add(e.spender) + body = render('/emails/expenditure.txt', + extra_vars={'expenditure': e, + 'op': op}) + g.handle_notification(involved_users, show, body) + return h.redirect_to('/')