X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=bluechips%2Fcontrollers%2Ftransfer.py;h=46bc77b9f6f10c168feff9efd22423b1019183fc;hb=fed6d11d2cbd6d617d18bc01a78196865da4155b;hp=5def992f5909328d4be2436aa95b9cc6f28b1d18;hpb=bebd16417636ba2830651f3e1c129df879623c5f;p=bluechips.git diff --git a/bluechips/controllers/transfer.py b/bluechips/controllers/transfer.py index 5def992..46bc77b 100644 --- a/bluechips/controllers/transfer.py +++ b/bluechips/controllers/transfer.py @@ -4,26 +4,104 @@ Handle transfers import logging +from datetime import date + from bluechips.lib.base import * -from bluechips.widgets import transfer -from pylons import request +from pylons import request, app_globals as g +from pylons.decorators import validate +from pylons.decorators.secure import authenticate_form +from pylons.controllers.util import abort + +from formencode import Schema, validators + +from mailer import Message log = logging.getLogger(__name__) + +class TransferSchema(Schema): + "Validate a transfer." + allow_extra_fields = False + debtor_id = validators.Int(not_empty=True) + creditor_id = validators.Int(not_empty=True) + amount = model.types.CurrencyValidator(not_empty=True) + description = validators.UnicodeString() + date = validators.DateConverter() + + class TransferController(BaseController): def index(self): - c.transfer = dict() - c.transfer['debtor'] = request.environ['user'] - + return self.edit() + + def edit(self, id=None): + c.users = get_users() + if id is None: + c.title = 'Add a New Transfer' + c.transfer = model.Transfer() + c.transfer.debtor_id = request.environ['user'].id + c.transfer.date = date.today() + else: + c.title = 'Edit a Transfer' + c.transfer = meta.Session.query(model.Transfer).get(id) + if c.transfer is None: + abort(404) return render('/transfer/index.mako') - @validate(form=transfer.new_transfer_form, error_handler='index') - def new(self): - t = model.Transfer() - update_sar(t, self.form_result) - meta.Session.save(t) - - h.flash('Transfer recorded.') + @redirect_on_get('edit') + @authenticate_form + @validate(schema=TransferSchema(), form='edit') + def update(self, id=None): + if id is None: + t = model.Transfer() + meta.Session.add(t) + op = 'created' + else: + t = meta.Session.query(model.Transfer).get(id) + if t is None: + abort(404) + op = 'updated' + update_sar(t, self.form_result) + meta.Session.commit() + + show = ('Transfer of %s from %s to %s %s.' % + (t.amount, t.debtor, t.creditor, op)) + h.flash(show) + + # Send email notification to involved users if they have an email set. + body = render('/emails/transfer.txt', extra_vars={'transfer': t, + 'op': op}) + g.handle_notification((t.debtor, t.creditor), show, body) + + return h.redirect_to('/') + + def delete(self, id): + c.title = 'Delete a Transfer' + c.transfer = meta.Session.query(model.Transfer).get(id) + if c.transfer is None: + abort(404) + + return render('/transfer/delete.mako') + + @redirect_on_get('delete') + @authenticate_form + def destroy(self, id): + t = meta.Session.query(model.Transfer).get(id) + if t is None: + abort(404) + + if 'delete' in request.params: + meta.Session.delete(t) + + meta.Session.commit() + show = ("Transfer of %s from %s to %s deleted." % + (t.amount, t.debtor, t.creditor)) + h.flash(show) + + body = render('/emails/transfer.txt', + extra_vars={'transfer': t, + 'op': 'deleted'}) + g.handle_notification((t.debtor, t.creditor), show, body) + return h.redirect_to('/')