svv/orders.py
author Tero Marttila <terom@fixme.fi>
Sat, 08 Jan 2011 23:41:48 +0200
changeset 40 30a0a0fa8c54
parent 37 eabea2857143
child 48 06fa83c8c0bb
permissions -rw-r--r--
cal: span events across weeks
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
# coding: utf-8
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
"""
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
    Order data model/view/handler
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
"""
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
     6
from svv.controllers import PageHandler, DocumentHandler
34
260413f89ba9 forms: split off generic forms code from orders.py
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
     7
from svv.forms import FormError, BaseForm, json
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
from svv.html import tags
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
from svv import database as db
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    10
from svv import pdf, markup
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    12
import datetime
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    13
import logging
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    14
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    15
log = logging.getLogger('svv.orders')
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    17
class Customer (object) :
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    18
    """
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    19
        Data-mapping for the customers table
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    20
    """
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    21
    
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    22
    # customer name (organization or natural person)
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    23
    name = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    24
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    25
class Contact (object) :
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    26
    """
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    27
        Data-mapping for the contacts table
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    28
    """
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    29
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    30
    # human-readable details
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    31
    name = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    32
    phone = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    33
    email = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    34
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    35
    # relation to Customer
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    36
    customer = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    37
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    38
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    39
class Order (object) :
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    40
    """
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    41
        Data-mapping for orders table.
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    42
    """
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    43
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    44
    # relation to Customer
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    45
    customer = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    46
    
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    47
    # relation to Contact
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    48
    contact = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    49
    
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    50
    # event info
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    51
    event_name = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    52
    event_description = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    53
    event_start = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    54
    event_end = None
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    55
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    56
    def __init__ (self) :
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    57
        """
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    58
            Construct an Order with default values
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    59
        """
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    60
        
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    61
        ## Set default values
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    62
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    63
        
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    64
        # default to tomorrow afternoon
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    65
        self.event_start = datetime.datetime.combine(tomorrow, datetime.time(16, 00))
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    66
        self.event_end = None   # determined by UI behaviour
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    67
            
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    68
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    69
    def format_event_time (self) :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    70
        """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    71
            Return a concise string describing the event's approximate time span.
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    72
        """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    73
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    74
        start = self.event_start
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    75
        end = self.event_end
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    76
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    77
        # different days
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    78
        if (start.year, start.month) != (end.year, end.month) :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    79
            # the full dates
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    80
            date = "%s - %s" % (start.strftime("%d.%m.%Y"), end.strftime("%d.%m.%Y"))
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    81
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    82
        elif (start.day != end.day) :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    83
            # day range
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    84
            date = "%s-%s.%s" % (start.strftime("%d"), end.strftime("%d"), start.strftime("%m.%Y"))
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    85
        
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    86
        else : # start.date() == end.date()
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    87
            # single day
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    88
            date = start.strftime("%d.%m.%Y")
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    89
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    90
        # time
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    91
        time = "%s-%s" % (start.strftime("%H:%M"), end.strftime("%H:%M"))
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    92
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    93
        # format
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    94
        return "%s %s" % (date, time)
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    95
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    96
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    97
    def on_date (self, date) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    98
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    99
            Does the event take place on this date?
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
   100
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
   101
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
   102
        return self.event_start.date() <= date <= self.event_end.date()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
   103
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   104
# bind against database schema
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   105
db.mapper(Customer, db.customers)
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   106
db.mapper(Contact, db.contacts)
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   107
db.mapper(Order, db.orders, properties=dict(
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   108
    customer    = db.relation(Customer),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   109
    contact     = db.relation(Contact),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   110
))
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   111
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   112
class OrderForm (BaseForm) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   113
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   114
        A single instance of a <form>, where we can process submitted data from the client, storing the associated
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   115
        Order-related data, and then render a form for any of that related data.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   116
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   117
    
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   118
    def defaults (self) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   119
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   120
            Update our attributes with default values
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   121
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   122
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   123
        self.customer_id = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   124
        self.customer_name = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   125
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   126
        self.contact_id = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   127
        self.contact_name = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   128
        self.contact_phone = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   129
        self.contact_email = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   130
        self.contact_customer = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   131
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   132
        self.event_name = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   133
        self.event_description = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   134
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   135
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   136
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   137
        # default to tomorrow afternoon
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   138
        self.event_start = datetime.datetime.combine(tomorrow, datetime.time(16, 00))
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   139
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   140
        # automatically determined once start is set
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   141
        self.event_end = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   142
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   143
    def process_customer (self) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   144
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   145
            Process the incoming customer_* fields, returning (customer_id, customer_name).
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   146
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   147
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   148
        try :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   149
            customer_id = self.process_integer_field('customer_id')
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   150
            customer_name = self.process_text_field('customer_name')
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   152
            if not customer_id and not customer_name :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   153
                raise FormError('customer_name', None, "Must enter a customer")
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   154
       
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   155
            return self.process_multifield(db.customers,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   156
                ('customer_id', db.customers.c.id, customer_id),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   157
                (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   158
                    ('customer_name', db.customers.c.name, customer_name),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   159
                ),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   160
            )
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   161
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   162
        except FormError, e :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   163
            # list it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   164
            self.fail_field(e, 'customer_name')
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   165
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   166
            return None, None
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   167
 
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   168
    def process_contact (self, customer_id, customer_name) :
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   169
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   170
            Process the incoming contact_* fields, returning 
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   171
                (contact_id, contact_name, contact_phone, contact_email, contact_customer)
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   172
        """
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   173
        
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   174
        try :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   175
            contact_id = self.process_integer_field('contact_id')
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   176
            contact_name = self.process_text_field('contact_name')
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   177
            contact_phone = self.process_text_field('contact_phone')
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   178
            contact_email = self.process_text_field('contact_email')
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   179
            contact_customer = customer_id
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   180
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   181
            if not contact_id and not contact_name and (contact_phone or contact_email) and customer_name :
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   182
                # use customer name as contact name, if otherwise missing
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   183
                contact_name = customer_name
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   184
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   185
            if not contact_id and not (contact_name or contact_phone or contact_email) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   186
                raise FormError('contact_name', None, "Must enter a contact")
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   187
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   188
            return self.process_multifield(db.contacts,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   189
                ('contact_id', db.contacts.c.id, contact_id),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   190
                (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   191
                    ('contact_name', db.contacts.c.name, contact_name),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   192
                    ('contact_phone', db.contacts.c.phone, contact_phone),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   193
                    ('contact_email', db.contacts.c.email, contact_email),
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   194
                    ('contact_customer', db.contacts.c.customer_id, contact_customer),
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   195
                ),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   196
            )
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   197
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   198
        except FormError, e :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   199
            # list it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   200
            self.fail_field(e, 'contact_name' if e.field == 'contact_id' else None)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   201
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   202
            return None, None, None, None, None
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   203
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   204
    def process_event (self) :
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   205
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   206
            Process the incoming event_* fields, returning
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   207
                (event_name, event_description, event_start, event_end)
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   208
        """
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   209
        
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   210
        try :
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   211
            event_name = self.process_text_field('event_name')
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   212
            event_description = self.process_text_field('event_description', strip=False)
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   213
            event_start = self.process_datetime_field('event_start')
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   214
            event_end = self.process_datetime_field('event_end')
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   215
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   216
            if event_end < event_start :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   217
                raise FormError('event_start', event_end, "Event must end after start")
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   218
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   219
            return (event_name, event_description, event_start, event_end)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   220
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   221
        except FormError, e :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   222
            # list it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   223
            self.fail_field(e)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   224
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   225
            return None, None, None, None
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   226
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   227
    def process (self, data) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   228
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   229
            Bind ourselves to the given incoming POST data, and update our order field attributes.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   230
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   231
                data        - the submitted POST data as a MultiDict
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   232
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   233
            Returns True if all fields were processed without errors, False otherwise.
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   234
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   235
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   236
        # bind the raw post data
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   237
        self.data = data
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   238
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   239
        # customer
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   240
        self.customer_id, self.customer_name = self.process_customer()
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   241
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   242
        # contact
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   243
        self.contact_id, self.contact_name, self.contact_phone, self.contact_email, self.contact_customer = self.process_contact(self.customer_id, self.customer_name)
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   244
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   245
        if self.contact_customer and not self.customer_id :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   246
            # TODO: be really smart?
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   247
            pass
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   248
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   249
        # event
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   250
        self.event_name, self.event_description, self.event_start, self.event_end = self.process_event()
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   251
    
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   252
        return not self.errors
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   253
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   254
    def load (self, order) :
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   255
        """
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   256
            Load our field values from the given Order.
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   257
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   258
        
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   259
        if order.customer :
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   260
            self.customer_id        = order.customer.id
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   261
            self.customer_name      = order.customer.name
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   262
        
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   263
        if order.contact :
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   264
            self.contact_id         = order.contact.id
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   265
            self.contact_name       = order.contact.name
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   266
            self.contact_phone      = order.contact.phone
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   267
            self.contact_email      = order.contact.email
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   268
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   269
        self.event_name         = order.event_name
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   270
        self.event_description  = order.event_description
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   271
        self.event_start        = order.event_start
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   272
        self.event_end          = order.event_end
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   273
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   274
    def build_customer_list (self) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   275
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   276
            Query a (id, name) list of customers.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   277
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   278
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   279
        sql = db.select([db.customers.c.id, db.customers.c.name])
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   280
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   281
        return self.app.query(sql)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   282
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   283
    def build_contact_list (self, customer_id=None) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   284
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   285
            Query a (id, name, phone, email) list of contacts, optionally for given customer if given.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   286
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   287
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   288
        sql = db.select([db.contacts.c.id, db.contacts.c.name, db.contacts.c.phone, db.contacts.c.email])
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   289
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   290
        if customer_id :
29
9c7ddcaa2e90 orders: just sort customer's contacts higher in contacts list, instead of hiding others
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   291
            sql = sql.order_by((db.contacts.c.customer_id == customer_id))
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   292
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   293
        return self.app.query(sql)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   294
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   295
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   296
    def render_customer_input (self) :
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   297
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   298
            Render HTML for customer_id/name field inputs.
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   299
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   300
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   301
        # all known customers
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   302
        customers = list(self.build_customer_list())
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   303
        
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   304
        return (
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   305
            self.render_select_input('customer_id', [(0, u"Luo uusi")] + customers, self.customer_id),
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   306
            self.render_text_input('customer_name', self.customer_name),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   307
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   308
            tags.script(r"$(document).ready(function () { $('#customer_id').formSelectsPreset({textTarget: $('#customer_name')}); });"),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   309
        )
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   310
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   311
    def render_contact_input (self) :
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   312
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   313
            Render HTML for contact name field <input>s
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   314
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   315
        # recommended contacts for selected customer, if known
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   316
        contacts = list(self.build_contact_list(self.customer_id))
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   317
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   318
        return (
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   319
            self.render_select_input('contact_id', [(0, u"Luo uusi")] + [(id, name) for id, name, phone, email in contacts], self.contact_id),
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   320
            self.render_text_input('contact_name', self.contact_name),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   321
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   322
            tags.script("""\
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   323
$(document).ready(function () { 
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   324
    contact_phones = %(phones)s;
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   325
    contact_emails = %(emails)s;
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   326
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   327
    $('#contact_id').formSelectsPreset({
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   328
        textTarget: $('#contact_name'),
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   329
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   330
        mapTargets: [
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   331
            [$('#contact_phone'), contact_phones],
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   332
            [$('#contact_email'), contact_emails]
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   333
        ]
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   334
    });
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   335
});
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   336
""" %       dict(
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   337
                phones  = json.dumps(dict((row[db.contacts.c.id], row[db.contacts.c.phone]) for row in contacts)),
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   338
                emails  = json.dumps(dict((row[db.contacts.c.id], row[db.contacts.c.email]) for row in contacts)),
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   339
            )),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   340
        )
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   341
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   342
    def render_event_input (self) :
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   343
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   344
            Render HTML for event start/end field <input>s
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   345
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   346
        
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   347
        return (
10
4bdb45071c89 Fix up PageHandler.render to PageHandler.render_content, add PageHandler.process, and fix up orders
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   348
            self.render_datetime_input('event_start', self.event_start),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   349
            " - ",
10
4bdb45071c89 Fix up PageHandler.render to PageHandler.render_content, add PageHandler.process, and fix up orders
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   350
            self.render_datetime_input('event_end', self.event_end),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   351
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   352
            tags.script(r"""
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   353
$(document).ready(function () { 
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   354
    var event_start = $('#event_start');
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   355
    var event_end = $('#event_end');
21
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   356
    
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   357
    // XXX: datetimepicker breaks beforeShow completely (event having one breaks)
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   358
    event_start.change(function () {
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   359
        // copy value as default
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   360
        var start_date = event_start.datetimepicker("getDate");
21
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   361
        
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   362
        if (start_date) {
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   363
            event_end.datetimepicker("option", {
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   364
                defaultDate: start_date,
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   365
                minDate: start_date,
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   366
            });
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   367
        }
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   368
    });
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   369
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   370
    // init default as well
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   371
    event_start.change();
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   372
});"""      ),
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   373
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   374
        )
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   375
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   376
    def render (self, action, submit=u"Tallenna", return_url=None) :
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   377
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   378
            Render the entire <form>, using any loaded/processed values.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   379
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   380
                action          - the target URL for the form to POST to
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   381
                submit          - label for the submit button
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   382
                return_url      - URL to return to if form is abandoned
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   383
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   384
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   385
        return tags.form(action=action, method='POST')(
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   386
            (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   387
                tags.h3(u"Lomakkeessa oli virheitä"),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   388
                tags.p(u"Korjaa lomake ja lähetä uudelleen"),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   389
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   390
                tags.ul(class_='errors')(
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   391
                    tags.li(tags.a(href='#' + error.field)(
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   392
                        tags.em(error.field),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   393
                        error.message,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   394
                    )) for field_errors in self.errors.itervalues() for error in field_errors
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   395
                ),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   396
            ) if self.errors else None,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   397
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   398
            tags.fieldset(
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   399
                tags.legend(u"Tilaaja"),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   400
                
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   401
                tags.ol(
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   402
                    self.render_form_field('customer_name', u"Tilaaja", u"Tilaavan yhdistyksen/henkilön nimi", (
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   403
                        self.render_customer_input()
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   404
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   406
                    self.render_form_field('contact_name', u"Yhteyshenkilö", u"Yhteyshenkilön nimi, jos eri kun tilaaja", (
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   407
                        self.render_contact_input()
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   408
                    )),
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   409
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   410
                    self.render_form_field('contact_phone', u"Puhelinnumero", u"Yhteyshenkilön puhelinnumero", (
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   411
                        self.render_text_input('contact_phone', self.contact_phone)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   412
                    )),
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   413
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   414
                    self.render_form_field('contact_email', u"Sähköpostiosoite", u"Yhteyshenkilön sähköpostiosoite", (
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   415
                        self.render_text_input('contact_email', self.contact_email)
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   416
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   417
                ),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
            ),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   419
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   420
            tags.fieldset(
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
                tags.legend(u"Tapahtuma"),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   422
           
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   423
                tags.ol(
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   424
                    self.render_form_field('event_name', u"Tapahtuma", u"Tapahtuman lyhyt nimi", (
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   425
                        self.render_text_input('event_name', self.event_name)
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   428
                    self.render_form_field('event_description', u"Lisätiedot", u"Tapahtuman tarkemmat tiedot", (
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   429
                        self.render_text_input('event_description', self.event_description, multiline=True)
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
21
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   432
                    self.render_form_field('event_start', u"Ajankohta", 
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   433
                        (
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   434
                            u"Tapahtuman ajankohta (kamat noudetaan - palautetaan)", 
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   435
                            tags.br(), 
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   436
                            u"(%s)" % (datetime.datetime.now().strftime(self.DATETIME_FORMAT)),
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   437
                        ), 
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   438
                        (self.render_event_input()),
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   439
                    ),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   440
                ),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   441
            ),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   442
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   443
            tags.input(type='submit', value=submit),
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   444
            self.render_reset_button(u"Unohda koko juttu...", return_url) if return_url else None,
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   445
        )
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   447
class OrderContractForm (BaseForm) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   448
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   449
        Form for generating an order's contract document
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   450
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   451
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   452
    DEFAULT_PLACE = u"Otaniemi"
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   453
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   454
    DEFAULT_TEXT = u"""\
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   455
# Vuokrasopimus
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   456
### Teekkarispeksi ry AV-tekniikka
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   457
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   458
## Sopimusehdot
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   459
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   460
1.  ## Osapuolet
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   461
    1.  Teekkarispeksi ry (Y-tunnus 1888541-7), jäljempänä “Vuokranantaja”.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   462
    2.  {order.customer.name}, jäljempänä “Vuokraaja”. 1.1 ja 1.2 jäljempänä yhdessä “osapuolet”.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   463
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   464
2.  ## Kaluston lainaaminen
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   465
    1.  ### Yleistä
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   466
        Tässä sopimuksessa sovitaan toiminnasta Vuokranantajan lainatessa tanssimattoja Vuokraajalle.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   467
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   468
    2.  ### Vuokranantajan velvollisuudet
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   469
        Vuokranantaja sitoutuu toimittamaan sovittuna ajankohtana Vuokraajalle erikseen sovittava (liite) määrä tanssimattoja.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   470
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   471
    3.  ### Blaa Blaa
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   472
        Etc.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   473
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   474
3. ## Tätä sopimusta ja sitä koskevia erimielisyyksiä koskevat määräykset
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   475
    1.  ### Sopimuksen voimassaolo
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   476
        Sopimus on osapuolia sitova sen jälkeen, kun osapuolet ovat sen allekirjoittaneet.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   477
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   478
    2.  ### Muutosten tekeminen
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   479
        Muutokset sopimukseen on tehtävä kirjallisesti molempien osapuolten kesken.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   480
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   481
    3.  ### Blaa Blaa
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   482
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   483
        Etc.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   484
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   485
## Nouto
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   486
    Aika: _______________       Paikka: _______________
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   487
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   488
## Palautus
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   489
    Aika: _______________       Paikka: _______________
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   490
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   491
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   492
    # user clicked 'Edit' button, i.e. they want to view the rest of the edit fields
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   493
    edit = None
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   494
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   495
    def defaults (self) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   496
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   497
        today = datetime.date.today()
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   498
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   499
        self.prefill_placetime = False
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   500
        self.prefill_placetime_default = "%s, %s" % (self.DEFAULT_PLACE, today.strftime("%d.%m.%Y"))
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   501
        self.prefill_ourname = False
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   502
        self.prefill_ourname_default = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   503
        
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   504
        self.edit = False
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   505
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   506
        self.contract_text = self.DEFAULT_TEXT
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   507
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   508
    def render (self, action, return_url=None, edit_button=False) :
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   509
        """
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   510
                return_ulr              - display a "Return to order" link/button TO THIS URL
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   511
                edit_button             - display an "Edit further" button, hiding extra fields until pressed
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   512
        """
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   513
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   514
        # self.url_for(OrderContractDocument, id=id)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   515
        return tags.form(action=action, method='POST')(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   516
            tags.fieldset(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   517
                tags.legend(u"Vuokrasopimus"),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   518
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   519
                tags.ol(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   520
                    self.render_form_field('prefill_placetime', u"Esitäytä aika/paikka", u"Esitäytä allekirjoitusosion aika/paikka rivi", (
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   521
                        self.render_armed_text_input('prefill_placetime', self.prefill_placetime, self.prefill_placetime_default)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   522
                    )),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   523
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   524
                    self.render_form_field('prefill_ourname', u"Esitäytä vuokranantaja", u"Esitäytä allekirjoitusosion vuokranantajan nimi", (
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   525
                        self.render_armed_text_input('prefill_ourname', self.prefill_ourname, self.prefill_ourname_default)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   526
                    )),
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   527
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   528
                    (
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   529
                        self.render_form_field('contract_text', u"Sopimusteksti", u"Vuokrasopimuksen vapaamuotoinen otsikko, teksti, sopimusehdot, yms. Voidaan käyttää muuttujakenttiä (i.e. {...}). XXX: listaa kentät", (
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   530
                            self.render_text_input('contract_text', self.contract_text, multiline=True, autoscale=True)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   531
                        )),
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   532
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   533
                    ) if not edit_button or self.edit else None,
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   534
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   535
                    tags.li(
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   536
                        tags.input(type='submit', value=u"Tulosta vuokrasopimus"),
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   537
                        tags.input(type='submit', name='edit', value=u"Muokkaa vuokrasopimusta") if edit_button else None,
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   538
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   539
                        self.render_reset_button(u"Unohda koko juttu...", return_url) if return_url else None,
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   540
                    ),
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   541
                ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   542
            ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   543
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   544
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   545
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   546
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   547
    def process (self, data) :
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   548
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   549
            Bind incoming data.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   550
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   551
            Returns true if no error input, and not requesting the full editing form ("Edit more" button).
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   552
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   553
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   554
        # bind the raw post data
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   555
        self.data = data
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   556
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   557
        self.prefill_placetime = self.process_armed_text_field('prefill_placetime')
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   558
        self.prefill_ourname = self.process_armed_text_field('prefill_ourname')
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   559
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   560
        self.edit = self.process_checkbox_field('edit')
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   561
        
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   562
        self.contract_text = self.process_text_field('contract_text', default=self.DEFAULT_TEXT)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   563
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   564
        return not self.errors and not self.edit
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   565
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   566
class OrdersView (PageHandler) :
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   567
    """
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   568
        Render overview list of all orders in database.
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   569
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   570
        Currently divided into current/upcoming/past listings
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   571
    """
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   572
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   573
    def process (self) :
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   574
        """
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   575
            prepare
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   576
        """
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   577
        
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   578
        # database sesssion
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   579
        self.session = self.app.session()
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   580
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   581
    def build_orders_list (self, order_by=(Order.event_start)) :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   582
        """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   583
            Build summary list of orders, returning a series of Order objects, ordered by event_start, per default.
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   584
        """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   585
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   586
        return self.session.query(Order).options(db.eagerload(Order.customer), db.eagerload(Order.contact)).order_by(order_by).all()
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   587
    
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   588
    def group_orders_by_time (self, orders) :
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   589
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   590
            Sort the given set of orders into a set of categories by time.
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   591
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   592
            Returns a
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   593
                (past, current, future)
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   594
            set of order summary items.
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   595
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   596
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   597
        past = []
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   598
        current = []
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   599
        future = []
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   600
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   601
        today = datetime.date.today()
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   602
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   603
        def _classify (order) :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   604
            """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   605
                Return list to append order to
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   606
            """
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   607
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   608
            if order.event_end.date() < today :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   609
                return past
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   610
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   611
            elif order.event_start.date() <= today :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   612
                return current
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   613
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   614
            else :
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   615
                return future
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   616
        
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   617
        for order in orders :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   618
            # resolve list for order
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   619
            category = _classify(order)
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   620
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   621
            category.append(order)
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   622
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   623
        return past, current, future
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   624
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   625
    # columns for sorting
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   626
    # XXX: sorting not actually implemented...
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   627
    COLUMNS = (
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   628
        ('order_id',        u"ID",              Order.id),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   629
        ('customer_name',   u"Tilaaja",         Customer.name),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   630
        ('event_name',      u"Tapahtuma",       Order.event_name),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   631
        ('contact_name',    u"Yhteyshenkilö",   Contact.name),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   632
        ('event_start',     u"Ajankohta",       Order.event_start),
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   633
    )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   634
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   635
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   636
    def render_orders_list_rows (self, orders) :
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   637
        """
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   638
            Render HTML for each of the orders in the order list, inserting sub-captions when the month changes
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   639
        """
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   640
        
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   641
        # XXX: still broken
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   642
        from svv import urls
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   643
        
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   644
        # track each row's year/month
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   645
        last_date = None
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   646
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   647
        # alternating rows
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   648
        row_counter = 0
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   649
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   650
        for order in orders :
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   651
            # this order's date - only consider the starting datetime
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   652
            date = order.event_start.date()
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   653
            
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   654
            # month changed?
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   655
            if last_date and (date.year, date.month) != (last_date.year, last_date.month) :
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   656
                # sub-caption
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   657
                yield tags.tr(class_='sub-caption')(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   658
                    tags.th(colspan=len(self.COLUMNS))(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   659
                        date.strftime("%B %Y")
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   660
                    )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   661
                )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   662
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   663
                # reset
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   664
                row_counter = 0
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   665
            
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   666
            # track
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   667
            last_date = date
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   668
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   669
            # actual row
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   670
            yield tags.tr(class_=('alternate' if row_counter % 2 else None))(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   671
                # Id
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   672
                tags.td(class_='row-header')(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   673
                    tags.a(href=self.url_for(OrderView, id=order.id))(
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   674
                        u"#%d" % (order.id)
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   675
                    )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   676
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   677
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   678
                # Tilaaja
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   679
                tags.td(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   680
                    tags.a(href=self.url_for(urls.CustomerView, id=order.customer.id))(
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   681
                        order.customer.name
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   682
                    ) if order.customer else "-"
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   683
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   684
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   685
                # Tapahtuma
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   686
                tags.td(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   687
                    tags.a(href=self.url_for(OrderView, id=order.id))(
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   688
                        order.event_name
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   689
                    )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   690
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   691
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   692
                # Yhteyshenkilö
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   693
                tags.td(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   694
                    tags.a(href='#')(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   695
                        order.contact.name
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   696
                    ) if order.contact else "-"
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   697
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   698
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   699
                # Ajankohta
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   700
                tags.td(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   701
                    order.format_event_time(),
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   702
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   703
            )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   704
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   705
            row_counter += 1
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   706
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   707
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   708
    def render_orders_list (self, orders, caption) :
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   709
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   710
            Render HTML for sorted order list
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   711
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   712
        
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   713
        return tags.table(cellspacing="0")(
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   714
            tags.caption(caption),
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   715
            tags.thead(
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   716
                tags.tr(
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   717
                    tags.th(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   718
                        title
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   719
                    ) for name, title, col in self.COLUMNS
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   720
                ),
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   721
            ),
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   722
            tags.tbody(
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   723
                # render using separate loop for sub-captions
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   724
                self.render_orders_list_rows(orders)
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   725
            )
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   726
        )
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   727
10
4bdb45071c89 Fix up PageHandler.render to PageHandler.render_content, add PageHandler.process, and fix up orders
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   728
    def render_content (self) :
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   729
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   730
        # full order list
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   731
        orders_full = self.build_orders_list()
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   732
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   733
        # categorize
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   734
        past, current, future = self.group_orders_by_time(orders_full)
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   735
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   736
        return (
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   737
            tags.h1("Tilauslista"),
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   738
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   739
            (
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   740
                (
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   741
                    self.render_orders_list(orders, title),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   742
                ) for title, orders in (
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   743
                    (u"Tämänhetkiset", current),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   744
                    (u"Tulevat", future),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   745
                    (u"Menneet", past),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   746
                ) if orders
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   747
            ),
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   748
        )
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   749
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   750
class OrderView (PageHandler) :
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   751
    """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   752
        Render form for database object, let the user make updates, update the database.
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   753
    """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   754
    
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   755
    def process (self, id) :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   756
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   757
            Set up our object form.
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   758
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   759
            Process incoming POST data.
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   760
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   761
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   762
        # db session
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   763
        self.session = self.app.session()
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   764
        
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   765
        # order object
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   766
        self.order = self.session.query(Order).options(db.eagerload(Order.customer), db.eagerload(Order.contact)).get(id)
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   767
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   768
    def render_contract_form (self, id) :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   769
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   770
            Render the contract panel for our view
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   771
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   772
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   773
        form = OrderContractForm(self.app)
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   774
        form.defaults()
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   775
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   776
        # prefilled values?
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   777
        if self.POST :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   778
            # feed form POST data
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   779
            form.process(self.POST)
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   780
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   781
        # render, with edit button
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   782
        return form.render(action=self.url_for(OrderContractDocument, id=id), edit_button=True)
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   783
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   784
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   785
    def render_order (self, order) :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   786
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   787
            Render order fields
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   788
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   789
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   790
        return tags.form(action=self.url_for(EditOrderView, id=order.id), method='GET')(
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   791
            tags.fieldset(
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   792
                tags.legend(u"Tilaustiedot"),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   793
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   794
                
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   795
                tags.ol(
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   796
                    (tags.li(
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   797
                        tags.h3(title),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   798
                        (tags.div(value, class_='value') for value in values if value),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   799
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   800
                    ) for title, values in (
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   801
                        (u"Tilaaja", (order.customer.name, )),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   802
                        (u"Yhteyshenkilö", (
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   803
                            order.contact.name,
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   804
                            order.contact.phone,
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   805
                            order.contact.email,
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   806
                        )),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   807
                        (u"Tapahtuma", (
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   808
                            order.event_name,
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   809
                            tags.pre(order.event_description.strip(), _whitespace_sensitive=True),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   810
                            order.format_event_time(),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   811
                        )),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   812
                    )),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   813
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   814
                    tags.li(
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   815
                        tags.input(type='submit', value=u"Muokkaa"),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   816
                    ),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   817
                ),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   818
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   819
            ),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   820
        )
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   821
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   822
    def render_content (self, id) :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   823
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   824
            Render our form
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   825
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   826
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   827
        return (
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   828
            tags.h1(u"Tilaus #%d" % (id, )),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   829
            tags.h3(u"%s - %s (%s)" % (self.order.customer.name, self.order.event_name, self.order.format_event_time())),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   830
            
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   831
            self.render_order(self.order),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   832
            self.render_contract_form(id),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   833
        )
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   834
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   835
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   836
class EditOrderView (PageHandler) :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   837
    """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   838
        Render form for existing order, and update order.
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   839
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   840
        XXX: concurrent edits!
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   841
    """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   842
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   843
    def update (self, order, form) :
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   844
        """
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   845
            Update order values from submitted form data
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   846
        """
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   847
        
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   848
        # modify
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   849
        order.customer_id       = form.customer_id
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   850
        order.contact_id        = form.contact_id
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   851
        order.event_name        = form.event_name
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   852
        order.event_description = form.event_description
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   853
        order.event_start       = form.event_start
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   854
        order.event_end         = form.event_end
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   855
        
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   856
        # commit
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   857
        self.session.commit()
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   858
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   859
    def process (self, id) :
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   860
        """
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   861
            Set up our order form.
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   862
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   863
            Process incoming POST data.
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   864
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   865
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   866
        # db session
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   867
        self.session = self.app.session()
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   868
        
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   869
        # order object
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   870
        self.order = self.session.query(Order).options(db.eagerload(Order.customer), db.eagerload(Order.contact)).get(id)
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   871
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   872
        # form
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   873
        self.form = OrderForm(self.app)
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   874
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   875
        # load object data
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   876
        self.form.load(self.order)
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   877
        
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   878
        # update order?
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   879
        if self.POST :
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   880
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   881
            # feed form our POST data
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   882
            if self.form.process(self.POST) :
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   883
                # submit data was OK, update order from form
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   884
                self.update(self.order, self.form)
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   885
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   886
                # return to order view
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   887
                return self.redirect_for(OrderView, id=self.order.id)
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   888
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   889
            else :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   890
                # errors, re-show form
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   891
                pass
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   892
 
10
4bdb45071c89 Fix up PageHandler.render to PageHandler.render_content, add PageHandler.process, and fix up orders
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   893
    def render_content (self, id) :
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   894
        """
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   895
            Render our edit form
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   896
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   897
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   898
        return (
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   899
            tags.h1(u"Tilaus #%d" % (id, )),
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   900
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   901
            self.form.render(action=self.url_for(EditOrderView, id=id), return_url=self.url_for(OrderView, id=id)),
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   902
        )
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   903
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   904
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   905
class NewOrderView (PageHandler) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   906
    """
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   907
        Render form for input, let the user correct their errors, create the order, and redirect out.
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   908
    """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   909
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   910
    def create (self, form) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   911
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   912
            Create the new order from the given form data, returning the new order's ID
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   913
        """
10
4bdb45071c89 Fix up PageHandler.render to PageHandler.render_content, add PageHandler.process, and fix up orders
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   914
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   915
        # db session
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   916
        session = self.app.session()
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   917
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   918
        # order model
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   919
        order = Order()
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   920
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   921
        # set attrs
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   922
        order.customer_id           = form.customer_id
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   923
        order.contact_id            = form.contact_id
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   924
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   925
        order.event_name            = form.event_name
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   926
        order.event_description     = form.event_description
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   927
        order.event_start           = form.event_start
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   928
        order.event_end             = form.event_end
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   929
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   930
        # add and commit
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   931
        session.add(order)
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   932
        session.commit()
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   933
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   934
        # return with new id
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   935
        return order.id
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   936
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   937
    def process (self) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   938
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   939
            Set up up our form.
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   940
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   941
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   942
        self.form = OrderForm(self.app)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   943
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   944
        # use either POST data or defaults
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   945
        if self.POST :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   946
            # try and process the input, checking for any failures...
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   947
            if self.form.process(self.POST) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   948
                # should be good, create it!
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   949
                order_id = self.create(self.form)
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   950
                
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   951
                # redirect there now that our business is done and the order exists
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   952
                return self.redirect_for(OrderView, id=order_id)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   953
            
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   954
            else :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   955
                # errors in form input
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   956
                pass
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   957
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   958
        else :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   959
            # init from defaults
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   960
            self.form.defaults()
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   961
    
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   962
    def render_content (self) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   963
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   964
            Render our form
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   965
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   966
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   967
        return (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   968
            tags.h1(u"Uusi tilaus"),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   969
            self.form.render(action=self.url_for(NewOrderView))
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   970
        )
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   971
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   972
class OrderContractDocument (DocumentHandler) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   973
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   974
        Generate and return PDF document for rental contract.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   975
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   976
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   977
    def process (self, id):
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   978
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   979
            Return OrderModel object for given ID
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   980
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   981
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   982
        # db session
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   983
        self.session = self.app.session()
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   984
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   985
        # order object
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   986
        self.order = self.session.query(Order).options(db.eagerload(Order.customer), db.eagerload(Order.contact)).get(id)
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   987
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   988
        # form
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   989
        self.form = OrderContractForm(self.app)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   990
        self.form.defaults()
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   991
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   992
        # XXX: also use GET data?
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   993
        data = self.request.values
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   994
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   995
        if self.form.process(data) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   996
            # render PDF
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   997
            pass
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   998
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   999
        else :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1000
            # show form again
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1001
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1002
            # XXX: fix the pagelayout shit, this is brutal
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1003
            handler = PageHandler(self.app, self.request, self.urlmap)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1004
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1005
            # monkey-map
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1006
            handler.render_content = self.render_content
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1007
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1008
            log.warn("Monkeyhack %r -> %r", self, handler)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1009
            
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1010
            # XXX: this invokes handler.process(), but...
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1011
            return handler.respond(id=id)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1012
    
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1013
    def render_content (self, id) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1014
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1015
            Display PDF gen form.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1016
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1017
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1018
        return (
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1019
            tags.h1(u"Vuokrasopimus"),
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
  1020
            self.form.render(action=self.url_for(OrderContractDocument, id=id), return_url=self.url_for(OrderView, id=id)),
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1021
        )
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1022
    
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1023
    def generate_document (self, id) :
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1024
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1025
            Return PDF document to generate
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1026
        """
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1027
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1028
        order = self.order
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1029
        params = self.form
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1030
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1031
        title = "Teekkarispeksi Ry - Vuokrasopimus"
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1032
        author = "Teekkarispeksi Ry"
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1033
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1034
        tpl = pdf.PageTemplate('page',
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1035
            header_columns  = (
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1036
                ("", ""),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1037
                ("", ""),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1038
                ("", ""),
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1039
                ("Vuokrasopimus", [order.customer.name, order.event_name, 'dd.mm.yy hh:mm-hh:mm']),
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1040
            ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1041
            footer_columns  = (
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
  1042
                ("Teekkarispeksi Ry", ("www.teekkarispeksi.fi", )),
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
  1043
                ("Tekniikkavastaava", ("Juha Kallas", "045 xxx yyzz", "jskallas@cc.hut.fi")),
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
  1044
                ("Varastovastaava", ("Joel Pirttimaa", "045 xxx yyzz", "jhpirtti@cc.hut.fi")),
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1045
                ("", ""),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1046
            ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1047
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1048
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1049
        doc = pdf.DocumentTemplate([tpl],
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1050
            title = title, author = author,
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1051
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1052
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1053
        # stylesheet
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1054
        styles = pdf.Styles()
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1055
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1056
        from reportlab.platypus import Paragraph as p
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1057
        
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1058
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1059
        # format
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1060
        text = params.contract_text.format(
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1061
            order       = order,
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1062
        )
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1063
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1064
        # parse to doc tree
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1065
        root = markup.Markup().parse(text)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1066
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1067
        # format to flowables
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1068
        text_elements = list(pdf.Markup(styles).render(root))
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1069
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1070
        sig_prefill = {}
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1071
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1072
        if params.prefill_placetime :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1073
            sig_prefill[('Vuokranantaja', 'Aika ja paikka')] = sig_prefill[('Vuokraaja', 'Aika ja paikka')] = params.prefill_placetime
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1074
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1075
        if params.prefill_ourname :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1076
            sig_prefill[('Vuokranantaja', 'Nimen selvennys')] = params.prefill_ourname
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1077
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1078
        elements = text_elements + [
33
471837eb3d96 orders: Fix signature block alignment
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
  1079
                pdf.SignatureBlock(("Vuokranantaja", "Vuokraaja"), ("%(column)s", "Nimen selvennys", "Aika ja paikka"), sig_prefill, fullheight=True),
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1080
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1081
        ]
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1082
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1083
        # ok
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1084
        return doc, elements
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1085
       
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1086