X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=bluechips%2Fcontrollers%2Fspend.py;h=1a1c34612091b888df800ebeacfba199fc631da3;hb=d24e23a6a01ed245e204c8c29fc10a5fbc6f8bc4;hp=d39f78e900f6e388c77c31643f5087b9a1b139c7;hpb=2976c86719afddb7000dbb938f92cbc3be4c7ac3;p=bluechips.git diff --git a/bluechips/controllers/spend.py b/bluechips/controllers/spend.py index d39f78e..1a1c346 100644 --- a/bluechips/controllers/spend.py +++ b/bluechips/controllers/spend.py @@ -6,23 +6,105 @@ import logging 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 decimal import Decimal, InvalidOperation log = logging.getLogger(__name__) class SpendController(BaseController): def index(self): + c.title = 'Add a New Expenditure' + + c.expenditure = dict() + c.expenditure['spender'] = request.environ['user'] + + return render('/spend/index.mako') + + def edit(self, id): + c.title = 'Edit an Expenditure' + + c.expenditure = meta.Session.query(model.Expenditure).get(id) + return render('/spend/index.mako') - @validate(form=spend.new_spend_form, error_handler='index') - def new(self): - e = model.Expenditure() + def update(self, id=None): + # Validate the submission + if not valid(self, spend.new_spend_form): + if id is None: + return self.index() + else: + return self.edit(id) + + # 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 update_sar(e, self.form_result) - meta.Session.save(e) - even_split(e) + if id is None: + e.even_split() + else: + e.update_split() + + meta.Session.commit() + + h.flash('Expenditure recorded.') + h.flash("""Want to do something unusual? + +""" % (h.link_to('Change the split', h.url_for(controller='spend', + action='split', + id=e.id)), + h.link_to('Spin off a subitem', h.url_for(controller='spend', + action='subitem', + id=e.id)))) + + return h.redirect_to('/') + + @dispatch_on(POST='_post_split', + GET='_get_split') + def split(self, id): + abort(500) + + def _get_split(self, id): + c.title = 'Change Expenditure Split' + + c.expenditure = meta.Session.query(model.Expenditure).get(id) + c.users = meta.Session.query(model.User) + + return render('/spend/split.mako') + + def _post_split(self, id): + c.values = request.params + c.errors = dict() + + split_dict = dict() + + for username, percent in c.values.iteritems(): + try: + user = meta.Session.query(model.User).\ + filter(model.User.username==username).one() + split_dict[user] = Decimal(percent) + except InvalidOperation: + c.errors[username] = 'Please enter a number' + if c.errors != dict(): + return self._get_split(id) + + e = meta.Session.query(model.Expenditure).get(id) + e.split(split_dict) + meta.Session.commit() - c.expenditure = e + h.flash('Expenditure redivided') - return render('/spend/new.mako') + return h.redirect_to('/')