""" Handle expenditures """ import logging from bluechips.lib.base import * from bluechips.widgets import spend 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') 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) 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() h.flash('Expenditure redivided') return h.redirect_to('/')