]> asedeno.scripts.mit.edu Git - bluechips.git/blobdiff - bluechips/controllers/transfer.py
if we GET to an update action, redirect to the edit action
[bluechips.git] / bluechips / controllers / transfer.py
index 5def992f5909328d4be2436aa95b9cc6f28b1d18..50948456fad832da5bd81035aee1ea08a6d15d8c 100644 (file)
@@ -4,26 +4,72 @@ 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.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 = meta.Session.query(model.User.id, model.User.name)
+        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')
+    @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('/')