orders: Separate EditOrderView
authorTero Marttila <terom@fixme.fi>
Fri, 07 Jan 2011 03:19:37 +0200
changeset 35 13b5dd3a7a5f
parent 34 260413f89ba9
child 36 d7a159024912
orders: Separate EditOrderView
static/forms.css
svv/orders.py
svv/urls.py
--- a/static/forms.css	Fri Jan 07 02:46:29 2011 +0200
+++ b/static/forms.css	Fri Jan 07 03:19:37 2011 +0200
@@ -57,7 +57,7 @@
 /* Fields inside a fieldset will be vertically separated */
 fieldset ol li
 {
-    padding: 1em 1em 0em;
+    padding: 0.5em 1em;
 
     border-top: 1px solid #c5c5c5;
 }
@@ -68,9 +68,12 @@
 }
 
 /* The field identifier displays above the field itself, and is visually weighted, but smaller than the fieldset legend */
-fieldset label
+fieldset label,
+fieldset h3         /* used in place of labels for non-input fields... */
 {
     display: block;
+
+    margin: 0.2em 0em;
     
     font-weight: bold;
     font-size: small;
@@ -113,18 +116,21 @@
     width: 30%;
 
     border: auto;
-
-    /* XXX: might be best to re-configure input/p margins */
-    margin-bottom: 1em;
 }
 
 /* Field's descriptive text */
 fieldset p
 {
-    margin: 0.5em;
+    margin: 0.8em;
 
     font-style: italic;
     font-size: x-small;
 }
 
+/* Static fields */
+fieldset div.value
+{
+    /* Value is visually indented */
+    margin-left: 2em;
+}
 
--- a/svv/orders.py	Fri Jan 07 02:46:29 2011 +0200
+++ b/svv/orders.py	Fri Jan 07 03:19:37 2011 +0200
@@ -496,7 +496,7 @@
 
         self.contract_text = self.DEFAULT_TEXT
 
-    def render (self, action, submit=u"Tulosta Vuokrasopimus") :
+    def render (self, action, submit=u"Tulosta vuokrasopimus") :
         
         # self.url_for(OrderContractDocument, id=id)
         return tags.form(action=action, method='POST')(
@@ -521,7 +521,7 @@
 
                     tags.li(
                         tags.input(type='submit', value=submit),
-                        tags.input(type='submit', name='edit', value=u"Muokkaa lisää"),
+                        tags.input(type='submit', name='edit', value=u"Muokkaa vuokrasopimusta"),
                     ),
                 ),
             ),
@@ -737,6 +737,94 @@
         Render form for database object, let the user make updates, update the database.
     """
     
+    def process (self, id) :
+        """
+            Set up our object form.
+
+            Process incoming POST data.
+        """
+
+        # db session
+        self.session = self.app.session()
+        
+        # order object
+        self.order = self.session.query(Order).options(db.eagerload(Order.customer), db.eagerload(Order.contact)).get(id)
+
+    def render_contract_form (self, id) :
+        """
+            Render the contract panel for our view
+        """
+
+        form = OrderContractForm(self.app)
+        form.defaults()
+
+        # prefilled values?
+        if self.POST :
+            # feed form POST data
+            form.process(self.POST)
+
+        # render
+        return form.render(action=self.url_for(OrderContractDocument, id=id))
+
+
+    def render_order (self, order) :
+        """
+            Render order fields
+        """
+
+        return tags.form(action=self.url_for(EditOrderView, id=order.id), method='GET')(
+            tags.fieldset(
+                tags.legend(u"Tilaustiedot"),
+
+                
+                tags.ol(
+                    (tags.li(
+                        tags.h3(title),
+                        (tags.div(value, class_='value') for value in values if value),
+
+                    ) for title, values in (
+                        (u"Tilaaja", (order.customer.name, )),
+                        (u"Yhteyshenkilö", (
+                            order.contact.name,
+                            order.contact.phone,
+                            order.contact.email,
+                        )),
+                        (u"Tapahtuma", (
+                            order.event_name,
+                            tags.pre(order.event_description.strip(), _whitespace_sensitive=True),
+                            order.format_event_time(),
+                        )),
+                    )),
+
+                    tags.li(
+                        tags.input(type='submit', value=u"Muokkaa"),
+                    ),
+                ),
+
+            ),
+        )
+
+    def render_content (self, id) :
+        """
+            Render our form
+        """
+
+        return (
+            tags.h1(u"Tilaus #%d" % (id, )),
+            tags.h3(u"%s - %s (%s)" % (self.order.customer.name, self.order.event_name, self.order.format_event_time())),
+            
+            self.render_order(self.order),
+            self.render_contract_form(id),
+        )
+
+
+class EditOrderView (PageHandler) :
+    """
+        Render form for existing order, and update order.
+
+        XXX: concurrent edits!
+    """
+
     def update (self, order, form) :
         """
             Update order values from submitted form data
@@ -755,7 +843,7 @@
 
     def process (self, id) :
         """
-            Set up our object form.
+            Set up our order form.
 
             Process incoming POST data.
         """
@@ -780,37 +868,22 @@
                 # submit data was OK, update order from form
                 self.update(self.order, self.form)
 
-            else :
-                # errors
-                pass
-        
-    def render_contract_form (self, id) :
-        """
-            Render the contract panel for our view
-        """
+                # return to order view
+                return self.redirect_for(OrderView, id=self.order.id)
 
-        form = OrderContractForm(self.app)
-        form.defaults()
-
-        # prefilled values?
-        if self.POST :
-            # feed form POST data
-            form.process(self.POST)
-
-        # render
-        return form.render(action=self.url_for(OrderContractDocument, id=id))
-
+            else :
+                # errors, re-show form
+                pass
+ 
     def render_content (self, id) :
         """
-            Render our form
+            Render our edit 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.render_contract_form(id),
-            self.form.render(action=self.url_for(OrderView, id=id))
+
+            self.form.render(action=self.url_for(EditOrderView, id=id)),
         )
 
 
--- a/svv/urls.py	Fri Jan 07 02:46:29 2011 +0200
+++ b/svv/urls.py	Fri Jan 07 03:19:37 2011 +0200
@@ -7,13 +7,14 @@
 # controllers
 from svv.controllers import Index 
 from svv.customers import CustomersView, CustomerView
-from svv.orders import OrdersView, OrderView, NewOrderView, OrderContractDocument
+from svv.orders import OrdersView, OrderView, EditOrderView, NewOrderView, OrderContractDocument
 
 # map URLs -> AppHandler
 URLS = Map((
     Rule('/orders/', endpoint=OrdersView),
     Rule('/orders/new', endpoint=NewOrderView),
     Rule('/orders/<int:id>', endpoint=OrderView),
+    Rule('/orders/<int:id>/edit', endpoint=EditOrderView),
     Rule('/orders/<int:id>/Vuokrasopimus.pdf', endpoint=OrderContractDocument),
 
     Rule('/customers', endpoint=CustomersView),