X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=bluechips%2Fcontrollers%2Fspend.py;h=aa6a59c05f6c8952831d55b3d32a5eefa53475f9;hb=acccaf1c26b247e15d6fe5e10658548cc4718295;hp=d39f78e900f6e388c77c31643f5087b9a1b139c7;hpb=2976c86719afddb7000dbb938f92cbc3be4c7ac3;p=bluechips.git diff --git a/bluechips/controllers/spend.py b/bluechips/controllers/spend.py index d39f78e..aa6a59c 100644 --- a/bluechips/controllers/spend.py +++ b/bluechips/controllers/spend.py @@ -4,25 +4,80 @@ Handle expenditures import logging +from decimal import Decimal, InvalidOperation + from bluechips.lib.base import * -from bluechips.widgets import spend -from bluechips.lib.split import * + +from pylons import request +from pylons.decorators.rest import dispatch_on +from pylons.decorators import validate + +from formencode import validators, Schema +from formencode.foreach import ForEach +from formencode.variabledecode import NestedVariables log = logging.getLogger(__name__) + +class ShareSchema(Schema): + "Validate individual user shares." + allow_extra_fields = False + user_id = validators.Int(not_empty=True) + amount = validators.Number(not_empty=True) + + +class ExpenditureSchema(Schema): + "Validate an expenditure." + allow_extra_fields = False + pre_validators = [NestedVariables()] + spender_id = validators.Int(not_empty=True) + amount = validators.Number(not_empty=True) + description = validators.UnicodeString() + date = validators.DateConverter() + shares = ForEach(ShareSchema) + + class SpendController(BaseController): def index(self): - return render('/spend/index.mako') + return self.edit() - @validate(form=spend.new_spend_form, error_handler='index') - def new(self): - e = model.Expenditure() + 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 + else: + c.title = 'Edit an Expenditure' + c.expenditure = meta.Session.query(model.Expenditure).get(id) + return render('/spend/index.mako') + + @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) + else: + e = meta.Session.query(model.Expenditure).get(id) + + # 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) - meta.Session.save(e) + 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']) + e.split(split_dict) - even_split(e) meta.Session.commit() - c.expenditure = e - - return render('/spend/new.mako') + h.flash('Expenditure updated.') + + return h.redirect_to('/')