--- 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) :
"""