Implement OrderView
authorTero Marttila <terom@fixme.fi>
Thu, 23 Dec 2010 02:59:53 +0200
changeset 12 2d3fb967cd30
parent 11 90a3c570c227
child 13 cb18f86e38d9
Implement OrderView
svv/application.py
svv/orders.py
--- a/svv/application.py	Thu Dec 23 02:22:34 2010 +0200
+++ b/svv/application.py	Thu Dec 23 02:59:53 2010 +0200
@@ -76,3 +76,10 @@
         
         return self.engine.execute(sql, **values).last_inserted_ids()
 
+    def execute (self, sql, **values) :
+        """
+            Execute an SQL statement (UPDATE) that doesn't return any values.
+        """
+
+        self.engine.execute(sql, **values)
+
--- a/svv/orders.py	Thu Dec 23 02:22:34 2010 +0200
+++ b/svv/orders.py	Thu Dec 23 02:59:53 2010 +0200
@@ -75,6 +75,20 @@
         # automatically determined once start is set
         self.event_end = None
 
+    def fail_field (self, form_error, field=None) :
+        """
+            Mark the field mentioned inside the given FormError as failed.
+
+                form_error      - the FormError to store
+                field           - the name of the field to store the error under, if not the same as in form_error
+        """
+
+        field = field or form_error.field
+
+        log.warn("Marking field %s as failed: %s", field, form_error)
+
+        self.errors[field].append(form_error)
+
     def process_raw_field (self, name, default=None, required=None) :
         """
             Process a generic incoming data field.
@@ -329,19 +343,44 @@
     
         return not self.errors
 
-    def fail_field (self, form_error, field=None) :
+    def load (self, id) :
         """
-            Mark the field mentioned inside the given FormError as failed.
+            Load our field values from the database using the given id
+        """
+        
+        # query tables from db
+        sql_from = db.orders.join(db.customers).join(db.contacts, (db.orders.c.contact == db.contacts.c.id))
+        sql = db.select(
+            [
+                db.orders,
+                db.customers,
+                db.contacts
+            ],
+            (db.orders.c.id == id),
+            from_obj = sql_from,
+            use_labels = True,
+        )
 
-                form_error      - the FormError to store
-                field           - the name of the field to store the error under, if not the same as in form_error
-        """
+        for row in self.app.query(sql) :
+            # load data
 
-        field = field or form_error.field
+            self.customer_id = row[db.customers.c.id]
+            self.customer_name = row[db.customers.c.name]
 
-        log.warn("Marking field %s as failed: %s", field, form_error)
+            self.contact_id = row[db.contacts.c.id]
+            self.contact_name = row[db.contacts.c.name]
+            self.contact_phone = row[db.contacts.c.phone]
+            self.contact_email = row[db.contacts.c.email]
 
-        self.errors[field].append(form_error)
+            self.event_name = row[db.orders.c.event_name]
+            self.event_description = row[db.orders.c.event_description]
+            self.event_start = row[db.orders.c.event_start]
+            self.event_end = row[db.orders.c.event_end]
+            
+            break
+
+        else :
+            raise KeyError(id, "No such order found")
 
     def build_customer_list (self) :
         """
@@ -570,8 +609,63 @@
         return tags.h1("Orders list")
 
 class OrderView (PageHandler) :
+    """
+        Render form for database object, let the user make updates, update the database.
+    """
+    
+    def update (self, id, form) :
+        """
+            Update database values from form
+        """
+
+        sql = db.orders.update().where((db.orders.c.id == id)).values(
+            {
+                db.orders.c.customer            : form.customer_id,
+                db.orders.c.contact             : form.contact_id,
+                db.orders.c.event_name          : form.event_name,
+                db.orders.c.event_description   : form.event_description,
+                db.orders.c.event_start         : form.event_start,
+                db.orders.c.event_end           : form.event_end,
+            }
+        )
+
+        # execute it
+        self.app.execute(sql)
+
+    def process (self, id) :
+        """
+            Set up our form.
+        """
+
+        self.form = OrderForm(self.app)
+
+        # use either POST data or database data
+        if self.POST :
+            # feed form our POST data
+            if self.form.process(self.POST) :
+                # submit data OK
+                self.update(id, self.form)
+
+            else :
+                # errors
+                pass
+        
+        else :
+            # fetch data from database
+            self.form.load(id)
+
     def render_content (self, id) :
-        return tags.h1("Order info for #%d" % (id, ))
+        """
+            Render our form
+        """
+
+        return (
+            tags.h1(u"Tilaus #%d" % (id, )),
+            tags.h3(u"%s - %s (%s)" % (self.form.customer_name, self.form.event_name, self.form.event_start.strftime('%d.%m.%Y'))),
+
+            self.form.render(action=self.url_for(OrderView, id=id))
+        )
+
 
 class NewOrderView (PageHandler) :
     """