svv/orders.py
author Tero Marttila <terom@fixme.fi>
Fri, 21 Jan 2011 04:44:30 +0200
changeset 61 ce1d012d02fe
parent 48 06fa83c8c0bb
permissions -rw-r--r--
html: amend
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
    """
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   117
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   118
    def __init__ (self, app) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   119
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   120
            Bind against app for database access.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   121
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   122
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   123
        super(OrderForm, self).__init__()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   124
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   125
        self.app = app
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   126
    
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   127
    def defaults (self) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   128
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   129
            Update our attributes with default values
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   130
        """
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.customer_id = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   133
        self.customer_name = 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
        self.contact_id = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   136
        self.contact_name = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   137
        self.contact_phone = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   138
        self.contact_email = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   139
        self.contact_customer = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   140
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   141
        self.event_name = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   142
        self.event_description = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   143
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   144
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   145
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   146
        # default to tomorrow afternoon
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   147
        self.event_start = datetime.datetime.combine(tomorrow, datetime.time(16, 00))
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   148
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   149
        # automatically determined once start is set
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   150
        self.event_end = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   151
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   152
    def process_customer (self) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   153
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   154
            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
   155
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   156
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   157
        try :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   158
            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
   159
            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
   160
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   161
            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
   162
                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
   163
       
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   164
            return self.process_multifield(db.customers,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   165
                ('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
   166
                (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   167
                    ('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
   168
                ),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   169
            )
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   170
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   171
        except FormError, e :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   172
            # list it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   173
            self.fail_field(e, 'customer_name')
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   174
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   175
            return None, None
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   176
 
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   177
    def process_contact (self, customer_id, customer_name) :
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   178
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   179
            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
   180
                (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
   181
        """
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   182
        
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   183
        try :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   184
            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
   185
            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
   186
            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
   187
            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
   188
            contact_customer = customer_id
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   189
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   190
            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
   191
                # 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
   192
                contact_name = customer_name
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   193
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   194
            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
   195
                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
   196
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   197
            return self.process_multifield(db.contacts,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   198
                ('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
   199
                (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   200
                    ('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
   201
                    ('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
   202
                    ('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
   203
                    ('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
   204
                ),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   205
            )
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   206
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   207
        except FormError, e :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   208
            # list it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   209
            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
   210
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   211
            return None, None, None, None, None
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   212
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   213
    def process_event (self) :
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   214
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   215
            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
   216
                (event_name, event_description, event_start, event_end)
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   217
        """
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   218
        
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   219
        try :
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   220
            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
   221
            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
   222
            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
   223
            event_end = self.process_datetime_field('event_end')
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   224
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   225
            if event_end < event_start :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   226
                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
   227
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   228
            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
   229
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   230
        except FormError, e :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   231
            # list it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   232
            self.fail_field(e)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   233
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   234
            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
   235
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   236
    def process (self, data) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   237
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   238
            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
   239
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   240
                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
   241
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   242
            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
   243
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   244
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   245
        # bind
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   246
        self.data = data
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   247
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   248
        # customer
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   249
        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
   250
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   251
        # contact
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   252
        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
   253
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   254
        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
   255
            # TODO: be really smart?
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   256
            pass
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   257
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   258
        # event
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   259
        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
   260
    
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   261
        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
   262
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   263
    def load (self, order) :
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   264
        """
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   265
            Load our field values from the given Order.
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   266
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   267
        
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   268
        if order.customer :
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   269
            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
   270
            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
   271
        
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   272
        if order.contact :
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   273
            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
   274
            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
   275
            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
   276
            self.contact_email      = order.contact.email
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   277
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   278
        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
   279
        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
   280
        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
   281
        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
   282
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   283
    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
   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) list of customers.
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.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
   289
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   290
        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
   291
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   292
    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
   293
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   294
            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
   295
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   296
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   297
        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
   298
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   299
        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
   300
            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
   301
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   302
        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
   303
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   304
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   305
    def render_customer_input (self) :
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   306
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   307
            Render HTML for customer_id/name field inputs.
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   308
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   309
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   310
        # all known customers
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   311
        customers = list(self.build_customer_list())
7
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
        return (
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   314
            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
   315
            self.render_text_input('customer_name', self.customer_name),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   316
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   317
            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
   318
        )
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   319
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   320
    def render_contact_input (self) :
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   321
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   322
            Render HTML for contact name field <input>s
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   323
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   324
        # 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
   325
        contacts = list(self.build_contact_list(self.customer_id))
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   326
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   327
        return (
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   328
            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
   329
            self.render_text_input('contact_name', self.contact_name),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   330
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   331
            tags.script("""\
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   332
$(document).ready(function () { 
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   333
    contact_phones = %(phones)s;
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   334
    contact_emails = %(emails)s;
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
    $('#contact_id').formSelectsPreset({
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   337
        textTarget: $('#contact_name'),
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   338
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   339
        mapTargets: [
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   340
            [$('#contact_phone'), contact_phones],
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   341
            [$('#contact_email'), contact_emails]
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   342
        ]
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   343
    });
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   344
});
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   345
""" %       dict(
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   346
                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
   347
                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
   348
            )),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   349
        )
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   350
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   351
    def render_event_input (self) :
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   352
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   353
            Render HTML for event start/end field <input>s
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   354
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   355
        
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   356
        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
   357
            self.render_datetime_input('event_start', self.event_start),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   358
            " - ",
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
   359
            self.render_datetime_input('event_end', self.event_end),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   360
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   361
            tags.script(r"""
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   362
$(document).ready(function () { 
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   363
    var event_start = $('#event_start');
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   364
    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
   365
    
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   366
    // XXX: datetimepicker breaks beforeShow completely (event having one breaks)
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   367
    event_start.change(function () {
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   368
        // copy value as default
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   369
        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
   370
        
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   371
        if (start_date) {
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   372
            event_end.datetimepicker("option", {
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   373
                defaultDate: start_date,
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   374
                minDate: start_date,
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   375
            });
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   376
        }
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   377
    });
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   378
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   379
    // init default as well
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   380
    event_start.change();
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   381
});"""      ),
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   382
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   383
        )
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   384
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   385
    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
   386
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   387
            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
   388
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   389
                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
   390
                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
   391
                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
   392
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   393
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   394
        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
   395
            (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   396
                tags.h3(u"Lomakkeessa oli virheitä"),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   397
                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
   398
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   399
                tags.ul(class_='errors')(
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   400
                    tags.li(tags.a(href='#' + error.field)(
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   401
                        tags.em(error.field),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   402
                        error.message,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   403
                    )) 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
   404
                ),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   405
            ) if self.errors else None,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   406
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
            tags.fieldset(
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   408
                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
   409
                
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   410
                tags.ol(
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   411
                    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
   412
                        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
   413
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   415
                    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
   416
                        self.render_contact_input()
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   417
                    )),
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   418
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   419
                    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
   420
                        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
   421
                    )),
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   422
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   423
                    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
   424
                        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
   425
                    )),
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
            ),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
            tags.fieldset(
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
                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
   431
           
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   432
                tags.ol(
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   433
                    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
   434
                        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
   435
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   436
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   437
                    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
   438
                        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
   439
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   440
21
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   441
                    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
   442
                        (
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   443
                            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
   444
                            tags.br(), 
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   445
                            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
   446
                        ), 
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   447
                        (self.render_event_input()),
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   448
                    ),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   449
                ),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   450
            ),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   451
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   452
            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
   453
            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
   454
        )
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   455
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   456
class OrderContractForm (BaseForm) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   457
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   458
        Form for generating an order's contract document
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   459
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   460
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   461
    DEFAULT_PLACE = u"Otaniemi"
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   462
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   463
    DEFAULT_TEXT = u"""\
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   464
# Vuokrasopimus
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   465
### Teekkarispeksi ry AV-tekniikka
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   466
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   467
## Sopimusehdot
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   468
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   469
1.  ## Osapuolet
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   470
    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
   471
    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
   472
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   473
2.  ## Kaluston lainaaminen
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   474
    1.  ### Yleistä
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   475
        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
   476
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   477
    2.  ### Vuokranantajan velvollisuudet
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   478
        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
   479
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   480
    3.  ### Blaa Blaa
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   481
        Etc.
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
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
   484
    1.  ### Sopimuksen voimassaolo
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   485
        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
   486
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   487
    2.  ### Muutosten tekeminen
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   488
        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
   489
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   490
    3.  ### Blaa Blaa
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
        Etc.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   493
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   494
## Nouto
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   495
    Aika: _______________       Paikka: _______________
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   496
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   497
## Palautus
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   498
    Aika: _______________       Paikka: _______________
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   499
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   500
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   501
    # 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
   502
    edit = None
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   503
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   504
    def defaults (self) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   505
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   506
        today = datetime.date.today()
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   507
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   508
        self.prefill_placetime = False
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   509
        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
   510
        self.prefill_ourname = False
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   511
        self.prefill_ourname_default = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   512
        
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   513
        self.edit = False
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   514
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   515
        self.contract_text = self.DEFAULT_TEXT
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   516
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   517
    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
   518
        """
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   519
                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
   520
                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
   521
        """
15
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
        # self.url_for(OrderContractDocument, id=id)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   524
        return tags.form(action=action, method='POST')(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   525
            tags.fieldset(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   526
                tags.legend(u"Vuokrasopimus"),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   527
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   528
                tags.ol(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   529
                    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
   530
                        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
   531
                    )),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   532
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   533
                    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
   534
                        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
   535
                    )),
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   536
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   537
                    (
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   538
                        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
   539
                            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
   540
                        )),
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   541
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   542
                    ) 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
   543
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   544
                    tags.li(
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   545
                        self.render_submit_button(u"Tulosta vuokrasopimus"),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   546
                        self.render_submit_button(u"Muokkaa vuokrasopimusta", 'edit') if edit_button else None,
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   547
                        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
   548
                    ),
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   549
                ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   550
            ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   551
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   552
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   553
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   554
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   555
    def process (self, data) :
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   556
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   557
            Bind incoming data.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   558
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   559
            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
   560
        """
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   561
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   562
        # bind
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   563
        self.data = data
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   564
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   565
        self.prefill_placetime = self.process_armed_text_field('prefill_placetime')
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   566
        self.prefill_ourname = self.process_armed_text_field('prefill_ourname')
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   567
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   568
        self.edit = self.process_action_field('edit')
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   569
        
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   570
        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
   571
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   572
        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
   573
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   574
class OrdersView (PageHandler) :
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   575
    """
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   576
        Render overview list of all orders in database.
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   577
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   578
        Currently divided into current/upcoming/past listings
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   579
    """
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 process (self) :
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   582
        """
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   583
            prepare
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   584
        """
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   585
        
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   586
        # database sesssion
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   587
        self.session = self.app.session()
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   588
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   589
    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
   590
        """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   591
            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
   592
        """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   593
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   594
        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
   595
    
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   596
    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
   597
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   598
            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
   599
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   600
            Returns a
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   601
                (past, current, future)
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   602
            set of order summary items.
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   603
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   604
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   605
        past = []
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   606
        current = []
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   607
        future = []
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   608
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   609
        today = datetime.date.today()
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   610
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   611
        def _classify (order) :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   612
            """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   613
                Return list to append order to
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   614
            """
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   615
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   616
            if order.event_end.date() < today :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   617
                return past
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   618
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   619
            elif order.event_start.date() <= today :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   620
                return current
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   621
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   622
            else :
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   623
                return future
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   624
        
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   625
        for order in orders :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   626
            # resolve list for order
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   627
            category = _classify(order)
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   628
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   629
            category.append(order)
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   630
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   631
        return past, current, future
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   632
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   633
    # columns for sorting
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   634
    # XXX: sorting not actually implemented...
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   635
    COLUMNS = (
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   636
        ('order_id',        u"ID",              Order.id),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   637
        ('customer_name',   u"Tilaaja",         Customer.name),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   638
        ('event_name',      u"Tapahtuma",       Order.event_name),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   639
        ('contact_name',    u"Yhteyshenkilö",   Contact.name),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   640
        ('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
   641
    )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   642
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   643
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   644
    def render_orders_list_rows (self, orders) :
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   645
        """
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   646
            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
   647
        """
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   648
        
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   649
        # XXX: still broken
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   650
        from svv import urls
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   651
        
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   652
        # track each row's year/month
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   653
        last_date = None
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   654
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   655
        # alternating rows
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   656
        row_counter = 0
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   657
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   658
        for order in orders :
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   659
            # 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
   660
            date = order.event_start.date()
14
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
            # month changed?
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   663
            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
   664
                # sub-caption
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   665
                yield tags.tr(class_='sub-caption')(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   666
                    tags.th(colspan=len(self.COLUMNS))(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   667
                        date.strftime("%B %Y")
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
                )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   670
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   671
                # reset
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   672
                row_counter = 0
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   673
            
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   674
            # track
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   675
            last_date = date
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
            # actual row
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   678
            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
   679
                # Id
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   680
                tags.td(class_='row-header')(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   681
                    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
   682
                        u"#%d" % (order.id)
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
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   686
                # Tilaaja
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   687
                tags.td(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   688
                    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
   689
                        order.customer.name
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   690
                    ) if order.customer else "-"
14
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
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   693
                # Tapahtuma
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   694
                tags.td(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   695
                    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
   696
                        order.event_name
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
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   700
                # Yhteyshenkilö
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   701
                tags.td(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   702
                    tags.a(href='#')(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   703
                        order.contact.name
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   704
                    ) if order.contact else "-"
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   705
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   706
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   707
                # Ajankohta
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   708
                tags.td(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   709
                    order.format_event_time(),
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   710
                ),
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
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   713
            row_counter += 1
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   714
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   715
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   716
    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
   717
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   718
            Render HTML for sorted order list
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   719
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   720
        
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   721
        return tags.table(cellspacing="0")(
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   722
            tags.caption(caption),
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   723
            tags.thead(
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   724
                tags.tr(
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   725
                    tags.th(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   726
                        title
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   727
                    ) for name, title, col in self.COLUMNS
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   728
                ),
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   729
            ),
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   730
            tags.tbody(
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   731
                # 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
   732
                self.render_orders_list_rows(orders)
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   733
            )
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   734
        )
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   735
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
   736
    def render_content (self) :
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   737
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   738
        # full order list
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   739
        orders_full = self.build_orders_list()
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
        # categorize
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   742
        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
   743
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   744
        return (
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   745
            tags.h1("Tilauslista"),
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   746
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   747
            (
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   748
                (
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   749
                    self.render_orders_list(orders, title),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   750
                ) for title, orders in (
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   751
                    (u"Tämänhetkiset", current),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   752
                    (u"Tulevat", future),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   753
                    (u"Menneet", past),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   754
                ) if orders
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   755
            ),
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   756
        )
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   757
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   758
class OrderView (PageHandler) :
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   759
    """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   760
        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
   761
    """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   762
    
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   763
    def process (self, id) :
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
            Set up our object form.
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   766
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   767
            Process incoming POST data.
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   768
        """
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
        # db session
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   771
        self.session = self.app.session()
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
        # order object
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   774
        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
   775
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   776
    def render_contract_form (self, id) :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   777
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   778
            Render the contract panel for our view
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   779
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   780
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   781
        form = OrderContractForm()
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   782
        form.defaults()
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
        # prefilled values?
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   785
        if self.POST :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   786
            # feed form POST data
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   787
            form.process(self.POST)
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   788
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   789
        # render, with edit button
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   790
        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
   791
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   792
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   793
    def render_order (self, order) :
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
            Render order fields
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   796
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   797
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   798
        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
   799
            tags.fieldset(
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   800
                tags.legend(u"Tilaustiedot"),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   801
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   802
                
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   803
                tags.ol(
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   804
                    (tags.li(
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   805
                        tags.h3(title),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   806
                        (tags.div(value, class_='value') for value in values if value),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   807
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   808
                    ) for title, values in (
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   809
                        (u"Tilaaja", (order.customer.name, )),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   810
                        (u"Yhteyshenkilö", (
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   811
                            order.contact.name,
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   812
                            order.contact.phone,
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   813
                            order.contact.email,
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   814
                        )),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   815
                        (u"Tapahtuma", (
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   816
                            order.event_name,
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   817
                            tags.pre(order.event_description.strip(), _whitespace_sensitive=True),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   818
                            order.format_event_time(),
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
                    tags.li(
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   823
                        tags.input(type='submit', value=u"Muokkaa"),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   824
                    ),
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
            ),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   828
        )
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   829
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   830
    def render_content (self, id) :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   831
        """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   832
            Render our form
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
        return (
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   836
            tags.h1(u"Tilaus #%d" % (id, )),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   837
            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
   838
            
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   839
            self.render_order(self.order),
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   840
            self.render_contract_form(id),
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
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   843
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   844
class EditOrderView (PageHandler) :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   845
    """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   846
        Render form for existing order, and update order.
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   847
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   848
        XXX: concurrent edits!
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   849
    """
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   850
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
   851
    def update (self, order, form) :
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   852
        """
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
   853
            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
   854
        """
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
        # 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
   857
        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
   858
        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
   859
        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
   860
        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
   861
        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
   862
        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
   863
        
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
   864
        # 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
   865
        self.session.commit()
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   866
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   867
    def process (self, id) :
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   868
        """
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   869
            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
   870
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
            Process incoming POST data.
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   872
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   873
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
   874
        # 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
   875
        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
   876
        
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
        # order object
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   878
        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
   879
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
        # form
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   881
        self.form = OrderForm(self.app)
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   882
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
        # load object data
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   884
        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
   885
        
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
   886
        # update order?
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   887
        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
   888
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   889
            # feed form our POST data
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   890
            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
   891
                # 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
   892
                self.update(self.order, self.form)
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   893
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   894
                # return to order view
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   895
                return self.redirect_for(OrderView, id=self.order.id)
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   896
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   897
            else :
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   898
                # errors, re-show form
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   899
                pass
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   900
 
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
   901
    def render_content (self, id) :
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   902
        """
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   903
            Render our edit form
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   904
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   905
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   906
        return (
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   907
            tags.h1(u"Tilaus #%d" % (id, )),
35
13b5dd3a7a5f orders: Separate EditOrderView
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   908
36
d7a159024912 forms: Add a reset/return button to separate-page forms
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   909
            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
   910
        )
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   911
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   912
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   913
class NewOrderView (PageHandler) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   914
    """
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   915
        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
   916
    """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   917
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   918
    def create (self, form) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   919
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   920
            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
   921
        """
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
   922
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
   923
        # 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
   924
        session = self.app.session()
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   925
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
   926
        # 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
   927
        order = Order()
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   928
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
   929
        # 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
   930
        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
   931
        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
   932
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
        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
   934
        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
   935
        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
   936
        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
   937
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
   938
        # 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
   939
        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
   940
        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
   941
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
   942
        # 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
   943
        return order.id
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   944
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   945
    def process (self) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   946
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   947
            Set up up our form.
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   948
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   949
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   950
        self.form = OrderForm(self.app)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   951
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   952
        # use either POST data or defaults
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   953
        if self.POST :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   954
            # 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
   955
            if self.form.process(self.POST) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   956
                # should be good, create it!
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   957
                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
   958
                
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   959
                # 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
   960
                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
   961
            
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   962
            else :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   963
                # errors in form input
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   964
                pass
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   965
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   966
        else :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   967
            # init from defaults
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   968
            self.form.defaults()
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   969
    
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   970
    def render_content (self) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   971
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   972
            Render our form
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   973
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   974
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   975
        return (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   976
            tags.h1(u"Uusi tilaus"),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   977
            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
   978
        )
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   979
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   980
class OrderContractDocument (DocumentHandler) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   981
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   982
        Generate and return PDF document for rental contract.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   983
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   984
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   985
    def process (self, id):
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   986
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   987
            Return OrderModel object for given ID
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   988
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   989
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   990
        # db session
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   991
        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
   992
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   993
        # order object
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
   994
        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
   995
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   996
        # form
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   997
        self.form = OrderContractForm()
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   998
        self.form.defaults()
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   999
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1000
        # XXX: also use GET data?
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1001
        data = self.request.values
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1002
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1003
        if self.form.process(data) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1004
            # render PDF
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1005
            pass
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1006
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1007
        else :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1008
            # show form again
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: fix the pagelayout shit, this is brutal
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1011
            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
  1012
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1013
            # monkey-map
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1014
            handler.render_content = self.render_content
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1015
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1016
            log.warn("Monkeyhack %r -> %r", self, handler)
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
            # XXX: this invokes handler.process(), but...
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1019
            return handler.respond(id=id)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1020
    
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1021
    def render_content (self, id) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1022
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1023
            Display PDF gen form.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1024
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1025
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1026
        return (
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1027
            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
  1028
            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
  1029
        )
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
    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
  1032
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1033
            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
  1034
        """
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1035
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1036
        order = self.order
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1037
        params = self.form
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1038
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1039
        title = "Teekkarispeksi Ry - Vuokrasopimus"
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1040
        author = "Teekkarispeksi Ry"
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1041
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1042
        tpl = pdf.PageTemplate('page',
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1043
            header_columns  = (
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1044
                ("", ""),
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
                ("", ""),
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1047
                ("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
  1048
            ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1049
            footer_columns  = (
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
  1050
                ("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
  1051
                ("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
  1052
                ("Varastovastaava", ("Joel Pirttimaa", "045 xxx yyzz", "jhpirtti@cc.hut.fi")),
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1053
                ("", ""),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1054
            ),
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
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1057
        doc = pdf.DocumentTemplate([tpl],
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1058
            title = title, author = author,
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1059
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1060
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1061
        # stylesheet
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1062
        styles = pdf.Styles()
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1063
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1064
        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
  1065
        
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1066
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1067
        # format
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1068
        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
  1069
            order       = order,
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1070
        )
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1071
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1072
        # 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
  1073
        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
  1074
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1075
        # format to flowables
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1076
        text_elements = list(pdf.Markup(styles).render(root))
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1077
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1078
        sig_prefill = {}
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1079
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1080
        if params.prefill_placetime :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1081
            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
  1082
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1083
        if params.prefill_ourname :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1084
            sig_prefill[('Vuokranantaja', 'Nimen selvennys')] = params.prefill_ourname
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1085
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1086
        elements = text_elements + [
33
471837eb3d96 orders: Fix signature block alignment
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
  1087
                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
  1088
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1089
        ]
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1090
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1091
        # ok
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1092
        return doc, elements
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1093
       
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1094