svv/orders.py
author Tero Marttila <terom@fixme.fi>
Fri, 07 Jan 2011 02:11:52 +0200
changeset 33 471837eb3d96
parent 32 10c48a6843ad
child 34 260413f89ba9
permissions -rw-r--r--
orders: Fix signature block alignment
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
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
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
     8
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
     9
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
    10
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    11
import datetime
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    12
import logging
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    13
import collections
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    15
try :
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    16
    # Python2.6 stdlib
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    17
    import json
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    19
except ImportError :
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    20
    # simplejson, API should be similar
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    21
    import simplejson as json
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    22
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    23
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
    24
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
    25
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
    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 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
    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
    # 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
    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
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
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
    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
        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
    36
    """
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
    # 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
    39
    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
    40
    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
    41
    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
    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
    # 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
    44
    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
    45
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
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
    48
    """
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
        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
    50
    """
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
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
    # 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
    53
    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
    54
    
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
    # 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
    56
    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
    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
    # 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
    59
    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
    60
    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
    61
    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
    62
    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
    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
    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
    65
        """
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
            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
    67
        """
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
    68
        
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
    69
        ## 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
    70
        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
    71
        
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
    72
        # 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
    73
        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
    74
        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
    75
            
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
    def format_event_time (self) :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    78
        """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    79
            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
    80
        """
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
        start = self.event_start
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    83
        end = self.event_end
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    84
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    85
        # different days
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    86
        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
    87
            # the full dates
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    88
            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
    89
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    90
        elif (start.day != end.day) :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    91
            # day range
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    92
            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
    93
        
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    94
        else : # start.date() == end.date()
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    95
            # single day
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    96
            date = start.strftime("%d.%m.%Y")
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    97
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    98
        # time
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    99
        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
   100
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   101
        # format
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   102
        return "%s %s" % (date, time)
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   103
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   104
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
   105
# 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
   106
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
   107
db.mapper(Contact, db.contacts)
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   108
db.mapper(Order, db.orders, properties=dict(
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   109
    customer    = db.relation(Customer),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   110
    contact     = db.relation(Contact),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   111
))
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
   112
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   113
class FormError (Exception) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   114
    """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   115
        A user-level error in a form field
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   116
    """
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   118
    def __init__ (self, field, value, error) :
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   119
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   120
                field       - name of field with error
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   121
                value       - the errenous value in the form that we recieved it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   122
                              may be None if it was the *lack* of a value that caused the issue
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   123
                error       - descriptive text for user
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   124
        """
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   126
        self.field = field
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   127
        self.value = value
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   128
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   129
        super(FormError, self).__init__(error)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   130
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   131
class BaseForm (object) :
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   132
    # any POST data we have processed, updated from process()
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   133
    data = None
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   134
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   135
    def __init__ (self, app) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   136
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   137
                app             - bind this form to the app state (db etc)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   138
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   139
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   140
        self.app = app
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   141
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   142
        # accumulated errors
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   143
        self.errors = collections.defaultdict(list)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   144
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   145
    def defaults (self) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   146
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   147
            Update our attributes with default values
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   148
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   149
        
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   150
        raise NotImplementedError()
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   151
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   152
    def fail_field (self, form_error, field=None) :
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   153
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   154
            Mark the field mentioned inside the given FormError as failed.
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   155
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   156
                form_error      - the FormError to store
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   157
                field           - the name of the field to store the error under, if not the same as in form_error
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   158
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   159
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   160
        field = field or form_error.field
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   161
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   162
        log.warn("Marking field %s as failed: %s", field, form_error)
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   163
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   164
        self.errors[field].append(form_error)
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   165
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   166
    def build_name_for_armed_input (self, name) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   167
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   168
            Return the name used for the checkbox associated with the named armed text input
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   169
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   170
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   171
        return name + '_enabled'
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   172
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   173
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   174
    def process_raw_field (self, name, default=None, required=None) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   175
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   176
            Process a generic incoming data field.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   177
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   178
                default         - value to return if no value was present
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   179
                required        - raise a FormError if no value present
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   180
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   181
            Returns the value as a str, or default
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   182
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   183
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   184
        if name in self.data :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   185
            return self.data[name]
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   186
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   187
        elif required :
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   188
            raise FormError(name, None, "Required field")
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   189
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   190
        else :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   191
            return default
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   192
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   193
    def process_text_field (self, name, default=None, required=None, strip=True) :
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   194
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   195
            Process a generic incoming string field.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   196
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   197
            Trims extra whitespace from around the value, unless strip=False is given.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   198
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   199
            Returns the value as unicode, or default.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   200
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   201
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   202
        value = self.process_raw_field(name, required=required)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   203
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   204
        if value is None :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   205
            return default
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   206
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   207
        try :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   208
            # XXX: decode somehow, or can werkzeug handle that?
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   209
            value = unicode(value)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   210
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   211
        except UnicodeDecodeError :
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   212
            raise FormError(name, value, "Failed to decode Unicode characters")
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   213
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   214
        if strip :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   215
            value = value.strip()
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   216
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   217
        return value
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   218
    
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   219
    def process_integer_field (self, name, default=None, required=None) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   220
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   221
            Process a generic incoming int field.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   222
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   223
            Returns the value as int, or default.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   224
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   225
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   226
        value = self.process_raw_field(name, required=required)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   227
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   228
        if value is None :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   229
            return default
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   230
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   231
        try :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   232
            return int(value)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   233
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   234
        except ValueError :
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   235
            raise FormError(name, value, "Must be a number")
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   236
    
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   237
    DATETIME_FORMAT = "%d.%m.%Y %H:%M"
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   238
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   239
    def process_datetime_field (self, name, default=None, required=None, format=DATETIME_FORMAT) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   240
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   241
            Process an incoming datetime field.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   242
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   243
            Returns the value as datetime, or default.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   244
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   245
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   246
        value = self.process_raw_field(name, required=required)
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
        if value is None :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   249
            return default
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
        try :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   252
            return datetime.datetime.strptime(value, format)
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
        except ValueError, ex :
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   255
            raise FormError(name, value, "Invalid date/time value: " + str(ex))
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   256
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   257
    def process_checkbox_field (self, name, required=None) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   258
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   259
            Process an incoming checkbox input's value.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   260
            
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   261
            Any non-empty/non-whitespace value will be accepted as True.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   262
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   263
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   264
        value = self.process_raw_field(name, required)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   265
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   266
        if not value and required :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   267
            raise FormError(name, value, "Must be checked")
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   268
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   269
        elif value and value.strip() :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   270
            # checked
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   271
            return True
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   272
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   273
        else :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   274
            # unchecked
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   275
            return False
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   276
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   277
    def process_armed_text_field (self, name, required=None) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   278
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   279
            A text field that must be enabled by a checkbox before being used.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   280
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   281
            If not enabled, returns False. Otherwise, text field value, and fails if empty but required.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   282
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   283
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   284
        checkbox_name = self.build_name_for_armed_input(name)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   285
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   286
        if self.process_checkbox_field(checkbox_name) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   287
            # use input value
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   288
            return self.process_text_field(name, required=required)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   289
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   290
        else :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   291
            # not selected
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   292
            return False
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   293
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   294
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   295
    def process_multifield (self, table, id, fields) :
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
            Process a set of user-given field values for an object with an unique id, and some set of additional fields.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   298
            
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   299
            If the id is given, look up the corresponding field values, and return those.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   300
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   301
            If any of the fields are given, either look up a matching row, or create a new one, and return its id.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   302
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   303
            Returns an (id_name, field_name, ...) N-tuple.
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   304
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   305
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   306
        id_name, id_col, id_value = id
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   307
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   308
        if id_value :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   309
            # look up object from db
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   310
            columns = [col for name, col, value in fields]
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   311
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   312
            sql = db.select(columns, (id_col == id_value))
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   313
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   314
            for row in self.app.query(sql) :
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   315
                # XXX: sanity-check row values vs our values
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   316
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   317
                # new values
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   318
                fields = tuple(
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   319
                    (name, col, row[col]) for name, col, value in fields
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   320
                )
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   321
                
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   322
                # ok, just use the first one
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   323
                break
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   324
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   325
            else :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   326
                # not found!
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   327
                raise FormError(id_name, id_value, "Item selected does not seem to exist")
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   328
                
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   329
            log.info("Lookup %s=%d -> %s", id_name, id_value, dict((name, value) for name, col, value in fields))
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   330
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   331
        elif any(value for name, col, value in fields) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   332
            # look up identical object from db?
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   333
            sql = db.select([id_col], db.and_(*[(col == value) for name, col, value in fields]))
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   334
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   335
            for row in self.app.query(sql) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   336
                if id_value :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   337
                    log.warn("Duplicate %s=%d for %s", id_name, id_value, dict((name, value) for name, col, value in fields))
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   338
                
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   339
                # found object's id
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   340
                id_value = row[id_col]
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   341
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   342
                log.info("Found %s -> %d", dict((name, value) for name, col, value in fields), id_value)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   343
            
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   344
            # create new object?
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   345
            if not id_value :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   346
                sql = db.insert(table).values(dict((col, value) for name, col, value in fields))
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   347
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   348
                id_value, = self.app.insert(sql)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   349
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   350
                log.info("Create %s -> %d", dict((name, value) for name, col, value in fields), id_value)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   351
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   352
        else :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   353
            # not known
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   354
            log.debug("No %s known for order...", id_name)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   355
        
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   356
        # return full set of values
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   357
        return (id_value, ) + tuple(value for name, col, value in fields)
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   358
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   359
    def process (self, data) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   360
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   361
            Bind ourselves to the given incoming POST data, and update our order field attributes.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   362
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   363
                data        - the submitted POST data as a MultiDict
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   364
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   365
            Returns True if all fields were processed without errors, False otherwise.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   366
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   367
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   368
        raise NotImplmentedError()
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   369
    
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   370
        return not self.errors
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   371
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   372
    def render_text_input (self, name, value=None, multiline=False, rows=10, autoscale=True) :
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   373
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   374
            Render HTML for a generic text field input.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   375
                
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   376
                name            - field name, as used for POST
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   377
                value           - default field value
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   378
                multiline       - use a multi-line <textarea> instead
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   379
                rows            - number of rows for <textarea> per default
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   380
                autoscale       - automatically scale the <textarea> to the number of lines of text
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   381
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   382
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   383
        if multiline :
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   384
            if autoscale and value :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   385
                rows = value.count('\n') * 5 / 4
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   386
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   387
            # XXX: textarea can't be self-closing for some reason?
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   388
            return tags.textarea(name=name, id=name, rows=rows, _selfclosing=False, _whitespace_sensitive=True)(value)
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   389
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   390
        else :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   391
            return tags.input(type='text', name=name, id=name, value=value)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   392
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   393
    def render_select_input (self, name, options, value=None) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   394
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   395
            Render HTML for a generic select control.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   396
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   397
                name            - field name, as used for POST
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   398
                options         - sequence of (value, title) options. `value` may be None to omit.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   399
                value           - the selected value
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   400
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   401
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   402
        return tags.select(name=name, id=name)(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   403
            (
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   404
                tags.option(value=opt_value, selected=('selected' if opt_value == value else None))(opt_title)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   405
            ) for opt_value, opt_title in options
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   406
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   407
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   408
    def render_datetime_input (self, name, value=None) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   409
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   410
            Render HTML for a generic datetime control (using jQuery).
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   411
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   412
                name            - field name, as used for POST
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   413
                value           - selected date
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   414
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   415
            
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   416
        return (
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   417
            self.render_text_input(name, (value.strftime(self.DATETIME_FORMAT) if value else None)),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   418
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   419
            tags.script("$(document).ready(function () { $('#" + name + "').datetimepicker(); });"),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   420
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   421
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   422
    def render_checkbox_input (self, name, checked=None) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   423
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   424
            Render HTML for a checkbox.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   425
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   426
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   427
        return tags.input(type="checkbox", name=name, id=name, value="1",
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   428
            checked=("checked" if checked else None)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   429
        )
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   430
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   431
    def render_armed_text_input (self, name, value=False, default=None) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   432
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   433
            Render HTML for a text field that must be enabled by a checkbox before being used.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   434
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   435
                value       - the three-state value
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   436
                                False       - not checked, use default as value
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   437
                                None        - checked, use empty value
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   438
                                str         - checked, ues value
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   439
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   440
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   441
        checkbox_name = self.build_name_for_armed_input(name)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   442
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   443
        if value is False :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   444
            checked = False
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   445
            value = default
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   446
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   447
        else :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   448
            checked = True
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   449
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   450
        return (
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   451
            self.render_checkbox_input(checkbox_name, checked),
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   452
            self.render_text_input(name, value),
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   453
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   454
            tags.script("$(document).ready(function () { $('#" + name + "').formEnabledBy($('#" + checkbox_name + "')); });")
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   455
        )
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   456
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   457
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   458
    def render_form_field (self, name, title, description, inputs) :
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
            Render the label, input control, error note and description for a single field, along with their containing <li>.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   461
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   462
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   463
        # any errors for this field?
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   464
        errors = self.errors[name]
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   465
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   466
        return tags.li(class_='field' + (' failed' if errors else ''))(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   467
            tags.label((
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   468
                title,
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   469
                tags.strong(u"(Virheellinen)") if errors else None,
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   470
            ), for_=name),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   471
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   472
            inputs,
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   473
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   474
            tags.p(description),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   475
            
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   476
            # possible errors
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   477
            tags.ul(class_='errors')(tags.li(error.message) for error in errors) if errors else None,
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   478
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   479
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   480
    def render (self, action, submit=u"Tallenna") :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   481
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   482
            Render the entire <form>, using any loaded/processed values.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   483
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   484
                action          - the target URL for the form to POST to
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   485
                submit          - label for the submit button
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   486
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   487
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   488
        raise NotImplementedError()
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   489
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   490
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   491
class OrderForm (BaseForm) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   492
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   493
        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
   494
        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
   495
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   496
    
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   497
    def defaults (self) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   498
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   499
            Update our attributes with default values
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   500
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   501
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   502
        self.customer_id = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   503
        self.customer_name = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   504
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   505
        self.contact_id = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   506
        self.contact_name = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   507
        self.contact_phone = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   508
        self.contact_email = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   509
        self.contact_customer = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   510
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   511
        self.event_name = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   512
        self.event_description = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   513
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   514
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   515
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   516
        # default to tomorrow afternoon
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   517
        self.event_start = datetime.datetime.combine(tomorrow, datetime.time(16, 00))
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   518
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   519
        # automatically determined once start is set
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   520
        self.event_end = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   521
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   522
    def process_customer (self) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   523
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   524
            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
   525
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   526
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   527
        try :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   528
            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
   529
            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
   530
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   531
            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
   532
                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
   533
       
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   534
            return self.process_multifield(db.customers,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   535
                ('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
   536
                (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   537
                    ('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
   538
                ),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   539
            )
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   540
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   541
        except FormError, e :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   542
            # list it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   543
            self.fail_field(e, 'customer_name')
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   544
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   545
            return None, None
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   546
 
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   547
    def process_contact (self, customer_id, customer_name) :
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   548
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   549
            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
   550
                (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
   551
        """
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   552
        
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   553
        try :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   554
            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
   555
            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
   556
            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
   557
            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
   558
            contact_customer = customer_id
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   559
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   560
            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
   561
                # 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
   562
                contact_name = customer_name
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   563
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   564
            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
   565
                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
   566
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   567
            return self.process_multifield(db.contacts,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   568
                ('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
   569
                (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   570
                    ('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
   571
                    ('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
   572
                    ('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
   573
                    ('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
   574
                ),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   575
            )
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   576
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   577
        except FormError, e :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   578
            # list it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   579
            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
   580
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   581
            return None, None, None, None, None
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   582
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   583
    def process_event (self) :
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   584
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   585
            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
   586
                (event_name, event_description, event_start, event_end)
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   587
        """
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   588
        
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   589
        try :
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   590
            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
   591
            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
   592
            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
   593
            event_end = self.process_datetime_field('event_end')
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   594
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   595
            if event_end < event_start :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   596
                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
   597
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   598
            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
   599
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   600
        except FormError, e :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   601
            # list it
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   602
            self.fail_field(e)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   603
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   604
            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
   605
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   606
    def process (self, data) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   607
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   608
            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
   609
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   610
                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
   611
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   612
            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
   613
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   614
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   615
        # bind the raw post data
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   616
        self.data = data
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   617
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   618
        # customer
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   619
        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
   620
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   621
        # contact
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   622
        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
   623
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   624
        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
   625
            # TODO: be really smart?
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   626
            pass
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   627
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   628
        # event
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   629
        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
   630
    
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   631
        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
   632
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   633
    def load (self, order) :
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   634
        """
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   635
            Load our field values from the given Order.
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   636
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   637
        
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   638
        if order.customer :
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   639
            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
   640
            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
   641
        
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   642
        if order.contact :
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   643
            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
   644
            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
   645
            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
   646
            self.contact_email      = order.contact.email
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   647
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   648
        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
   649
        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
   650
        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
   651
        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
   652
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   653
    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
   654
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   655
            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
   656
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   657
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   658
        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
   659
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   660
        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
   661
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   662
    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
   663
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   664
            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
   665
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   666
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   667
        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
   668
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   669
        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
   670
            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
   671
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   672
        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
   673
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   674
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   675
    def render_customer_input (self) :
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   676
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   677
            Render HTML for customer_id/name field inputs.
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   678
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   679
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   680
        # all known customers
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   681
        customers = list(self.build_customer_list())
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   682
        
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   683
        return (
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   684
            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
   685
            self.render_text_input('customer_name', self.customer_name),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   686
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   687
            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
   688
        )
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   689
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   690
    def render_contact_input (self) :
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   691
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   692
            Render HTML for contact name field <input>s
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   693
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   694
        # 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
   695
        contacts = list(self.build_contact_list(self.customer_id))
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   696
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   697
        return (
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   698
            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
   699
            self.render_text_input('contact_name', self.contact_name),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   700
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   701
            tags.script("""\
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   702
$(document).ready(function () { 
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   703
    contact_phones = %(phones)s;
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   704
    contact_emails = %(emails)s;
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   705
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   706
    $('#contact_id').formSelectsPreset({
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   707
        textTarget: $('#contact_name'),
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   708
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   709
        mapTargets: [
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   710
            [$('#contact_phone'), contact_phones],
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   711
            [$('#contact_email'), contact_emails]
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   712
        ]
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   713
    });
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   714
});
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   715
""" %       dict(
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   716
                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
   717
                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
   718
            )),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   719
        )
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   720
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   721
    def render_event_input (self) :
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   722
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   723
            Render HTML for event start/end field <input>s
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   724
        """
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   725
        
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   726
        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
   727
            self.render_datetime_input('event_start', self.event_start),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   728
            " - ",
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
   729
            self.render_datetime_input('event_end', self.event_end),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   730
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   731
            tags.script(r"""
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   732
$(document).ready(function () { 
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   733
    var event_start = $('#event_start');
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   734
    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
   735
    
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   736
    // XXX: datetimepicker breaks beforeShow completely (event having one breaks)
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   737
    event_start.change(function () {
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   738
        // copy value as default
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   739
        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
   740
        
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   741
        if (start_date) {
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   742
            event_end.datetimepicker("option", {
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   743
                defaultDate: start_date,
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   744
                minDate: start_date,
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   745
            });
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   746
        }
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   747
    });
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   748
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   749
    // init default as well
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   750
    event_start.change();
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   751
});"""      ),
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   752
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   753
        )
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   754
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   755
    def render (self, action, submit=u"Tallenna") :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   756
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   757
            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
   758
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   759
                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
   760
                submit          - label for the submit button
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   761
        """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   762
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   763
        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
   764
            (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   765
                tags.h3(u"Lomakkeessa oli virheitä"),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   766
                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
   767
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   768
                tags.ul(class_='errors')(
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   769
                    tags.li(tags.a(href='#' + error.field)(
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   770
                        tags.em(error.field),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   771
                        error.message,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   772
                    )) 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
   773
                ),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   774
            ) if self.errors else None,
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   775
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   776
            tags.fieldset(
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   777
                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
   778
                
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   779
                tags.ol(
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   780
                    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
   781
                        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
   782
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   783
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   784
                    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
   785
                        self.render_contact_input()
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   786
                    )),
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   787
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   788
                    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
   789
                        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
   790
                    )),
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   791
18
5d06a3658699 order: Implement correct form preset values for phone/email
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   792
                    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
   793
                        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
   794
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   795
                ),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   796
            ),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   797
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   798
            tags.fieldset(
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   799
                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
   800
           
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   801
                tags.ol(
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   802
                    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
   803
                        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
   804
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   805
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   806
                    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
   807
                        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
   808
                    )),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   809
21
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   810
                    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
   811
                        (
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   812
                            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
   813
                            tags.br(), 
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   814
                            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
   815
                        ), 
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   816
                        (self.render_event_input()),
3510b9092bc4 js: Work around some (?) datetimepicker() buggyness; our $.fn.empty collided
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   817
                    ),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   818
                ),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   819
            ),
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   820
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   821
            tags.input(type='submit', value=submit),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   822
        )
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   823
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   824
class OrderContractForm (BaseForm) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   825
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   826
        Form for generating an order's contract document
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   827
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   828
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   829
    DEFAULT_PLACE = u"Otaniemi"
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   830
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   831
    DEFAULT_TEXT = u"""\
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   832
# Vuokrasopimus
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   833
### Teekkarispeksi ry AV-tekniikka
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   834
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   835
## Sopimusehdot
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   836
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   837
1.  ## Osapuolet
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   838
    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
   839
    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
   840
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   841
2.  ## Kaluston lainaaminen
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   842
    1.  ### Yleistä
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   843
        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
   844
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   845
    2.  ### Vuokranantajan velvollisuudet
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   846
        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
   847
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   848
    3.  ### Blaa Blaa
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   849
        Etc.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   850
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   851
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
   852
    1.  ### Sopimuksen voimassaolo
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   853
        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
   854
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   855
    2.  ### Muutosten tekeminen
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   856
        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
   857
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   858
    3.  ### Blaa Blaa
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   859
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   860
        Etc.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   861
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   862
## Nouto
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   863
    Aika: _______________       Paikka: _______________
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   864
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   865
## Palautus
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   866
    Aika: _______________       Paikka: _______________
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   867
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   868
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   869
    # 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
   870
    edit = None
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   871
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   872
    def defaults (self) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   873
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   874
        today = datetime.date.today()
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   875
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   876
        self.prefill_placetime = False
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   877
        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
   878
        self.prefill_ourname = False
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   879
        self.prefill_ourname_default = None
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   880
        
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   881
        self.edit = False
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   882
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   883
        self.contract_text = self.DEFAULT_TEXT
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   884
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   885
    def render (self, action, submit=u"Tulosta Vuokrasopimus") :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   886
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   887
        # self.url_for(OrderContractDocument, id=id)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   888
        return tags.form(action=action, method='POST')(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   889
            tags.fieldset(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   890
                tags.legend(u"Vuokrasopimus"),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   891
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   892
                tags.ol(
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   893
                    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
   894
                        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
   895
                    )),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   896
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   897
                    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
   898
                        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
   899
                    )),
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   900
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   901
                    (
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   902
                        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
   903
                            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
   904
                        )),
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   905
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   906
                    ) if self.edit else None,
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   907
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   908
                    tags.li(
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   909
                        tags.input(type='submit', value=submit),
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   910
                        tags.input(type='submit', name='edit', value=u"Muokkaa lisää"),
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   911
                    ),
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   912
                ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   913
            ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   914
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   915
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   916
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   917
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   918
    def process (self, data) :
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   919
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   920
            Bind incoming data.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   921
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   922
            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
   923
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   924
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   925
        # bind the raw post data
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   926
        self.data = data
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   927
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   928
        self.prefill_placetime = self.process_armed_text_field('prefill_placetime')
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   929
        self.prefill_ourname = self.process_armed_text_field('prefill_ourname')
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   930
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   931
        self.edit = self.process_checkbox_field('edit')
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   932
        
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   933
        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
   934
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   935
        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
   936
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   937
class OrdersView (PageHandler) :
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   938
    """
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   939
        Render overview list of all orders in database.
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   940
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   941
        Currently divided into current/upcoming/past listings
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   942
    """
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   943
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   944
    def process (self) :
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   945
        """
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   946
            prepare
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   947
        """
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   948
        
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   949
        # database sesssion
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   950
        self.session = self.app.session()
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   951
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   952
    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
   953
        """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   954
            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
   955
        """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   956
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   957
        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
   958
    
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   959
    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
   960
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   961
            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
   962
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   963
            Returns a
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   964
                (past, current, future)
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   965
            set of order summary items.
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   966
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   967
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   968
        past = []
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   969
        current = []
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   970
        future = []
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   971
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   972
        today = datetime.date.today()
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   973
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   974
        def _classify (order) :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   975
            """
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   976
                Return list to append order to
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   977
            """
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   978
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   979
            if order.event_end.date() < today :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   980
                return past
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   981
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   982
            elif order.event_start.date() <= today :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   983
                return current
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   984
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   985
            else :
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   986
                return future
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   987
        
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   988
        for order in orders :
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   989
            # resolve list for order
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   990
            category = _classify(order)
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   991
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   992
            category.append(order)
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   993
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   994
        return past, current, future
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   995
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   996
    # columns for sorting
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   997
    # XXX: sorting not actually implemented...
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   998
    COLUMNS = (
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   999
        ('order_id',        u"ID",              Order.id),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1000
        ('customer_name',   u"Tilaaja",         Customer.name),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1001
        ('event_name',      u"Tapahtuma",       Order.event_name),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1002
        ('contact_name',    u"Yhteyshenkilö",   Contact.name),
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1003
        ('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
  1004
    )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1005
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1006
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1007
    def render_orders_list_rows (self, orders) :
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1008
        """
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1009
            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
  1010
        """
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1011
        
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1012
        # XXX: still broken
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1013
        from svv import urls
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1014
        
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1015
        # track each row's year/month
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1016
        last_date = None
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1017
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1018
        # alternating rows
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1019
        row_counter = 0
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1020
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1021
        for order in orders :
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1022
            # 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
  1023
            date = order.event_start.date()
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1024
            
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1025
            # month changed?
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1026
            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
  1027
                # sub-caption
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1028
                yield tags.tr(class_='sub-caption')(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1029
                    tags.th(colspan=len(self.COLUMNS))(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1030
                        date.strftime("%B %Y")
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1031
                    )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1032
                )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1033
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1034
                # reset
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1035
                row_counter = 0
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1036
            
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1037
            # track
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1038
            last_date = date
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1039
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1040
            # actual row
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1041
            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
  1042
                # Id
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1043
                tags.td(class_='row-header')(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1044
                    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
  1045
                        u"#%d" % (order.id)
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1046
                    )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1047
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1048
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1049
                # Tilaaja
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1050
                tags.td(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1051
                    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
  1052
                        order.customer.name
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1053
                    ) if order.customer else "-"
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1054
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1055
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1056
                # Tapahtuma
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1057
                tags.td(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1058
                    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
  1059
                        order.event_name
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1060
                    )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1061
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1062
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1063
                # Yhteyshenkilö
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1064
                tags.td(
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1065
                    tags.a(href='#')(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1066
                        order.contact.name
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1067
                    ) if order.contact else "-"
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1068
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1069
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1070
                # Ajankohta
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1071
                tags.td(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1072
                    order.format_event_time(),
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1073
                ),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1074
            )
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1075
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1076
            row_counter += 1
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1077
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1078
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1079
    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
  1080
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1081
            Render HTML for sorted order list
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1082
        """
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1083
        
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1084
        return tags.table(cellspacing="0")(
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1085
            tags.caption(caption),
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1086
            tags.thead(
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1087
                tags.tr(
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1088
                    tags.th(
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
  1089
                        title
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1090
                    ) for name, title, col in self.COLUMNS
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1091
                ),
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1092
            ),
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1093
            tags.tbody(
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1094
                # 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
  1095
                self.render_orders_list_rows(orders)
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1096
            )
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1097
        )
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1098
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
  1099
    def render_content (self) :
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1100
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1101
        # full order list
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1102
        orders_full = self.build_orders_list()
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1103
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1104
        # categorize
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1105
        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
  1106
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1107
        return (
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1108
            tags.h1("Tilauslista"),
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1109
14
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1110
            (
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1111
                (
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1112
                    self.render_orders_list(orders, title),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1113
                ) for title, orders in (
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1114
                    (u"Tämänhetkiset", current),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1115
                    (u"Tulevat", future),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1116
                    (u"Menneet", past),
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1117
                ) if orders
5b2cc88412f7 Better grouping of orders list, instead of sorting...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
  1118
            ),
13
cb18f86e38d9 Implement OrdersView
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
  1119
        )
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
  1120
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
  1121
class OrderView (PageHandler) :
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1122
    """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1123
        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
  1124
    """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1125
    
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
  1126
    def update (self, order, form) :
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1127
        """
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
  1128
            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
  1129
        """
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
  1130
        
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
  1131
        # 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
  1132
        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
  1133
        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
  1134
        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
  1135
        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
  1136
        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
  1137
        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
  1138
        
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
  1139
        # 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
  1140
        self.session.commit()
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1141
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1142
    def process (self, id) :
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1143
        """
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
  1144
            Set up our object 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
  1145
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
  1146
            Process incoming POST data.
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1147
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1148
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
  1149
        # 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
  1150
        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
  1151
        
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
  1152
        # order object
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
  1153
        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
  1154
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
  1155
        # form
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1156
        self.form = OrderForm(self.app)
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1157
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
  1158
        # load object data
28
1bfe14d74dcf orders: fix OrderForm.load to take an Order object
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
  1159
        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
  1160
        
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
  1161
        # update order?
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1162
        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
  1163
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1164
            # feed form our POST data
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1165
            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
  1166
                # 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
  1167
                self.update(self.order, self.form)
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1168
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1169
            else :
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1170
                # errors
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1171
                pass
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1172
        
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1173
    def render_contract_form (self, id) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1174
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1175
            Render the contract panel for our view
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1176
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1177
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1178
        form = OrderContractForm(self.app)
20
ca92daf72d2f Fix OrderView UPDATE case
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
  1179
        form.defaults()
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1180
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1181
        # prefilled values?
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1182
        if self.POST :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1183
            # feed form POST data
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1184
            form.process(self.POST)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1185
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1186
        # render
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1187
        return form.render(action=self.url_for(OrderContractDocument, id=id))
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1188
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
  1189
    def render_content (self, id) :
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1190
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1191
            Render our form
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1192
        """
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1193
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1194
        return (
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1195
            tags.h1(u"Tilaus #%d" % (id, )),
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1196
            tags.h3(u"%s - %s (%s)" % (self.form.customer_name, self.form.event_name, self.form.event_start.strftime('%d.%m.%Y'))),
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1197
            
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1198
            self.render_contract_form(id),
12
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1199
            self.form.render(action=self.url_for(OrderView, id=id))
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1200
        )
2d3fb967cd30 Implement OrderView
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
  1201
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
  1202
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
  1203
class NewOrderView (PageHandler) :
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
  1204
    """
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1205
        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
  1206
    """
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
  1207
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1208
    def create (self, form) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1209
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1210
            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
  1211
        """
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
  1212
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
  1213
        # 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
  1214
        session = self.app.session()
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1215
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
  1216
        # 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
  1217
        order = Order()
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1218
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
  1219
        # 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
  1220
        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
  1221
        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
  1222
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
  1223
        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
  1224
        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
  1225
        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
  1226
        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
  1227
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
  1228
        # 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
  1229
        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
  1230
        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
  1231
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
  1232
        # 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
  1233
        return order.id
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1234
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1235
    def process (self) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1236
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1237
            Set up up our form.
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1238
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1239
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1240
        self.form = OrderForm(self.app)
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1241
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1242
        # use either POST data or defaults
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1243
        if self.POST :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1244
            # 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
  1245
            if self.form.process(self.POST) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1246
                # should be good, create it!
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1247
                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
  1248
                
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1249
                # 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
  1250
                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
  1251
            
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1252
            else :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1253
                # errors in form input
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1254
                pass
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
  1255
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1256
        else :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1257
            # init from defaults
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1258
            self.form.defaults()
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1259
    
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1260
    def render_content (self) :
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1261
        """
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1262
            Render our form
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1263
        """
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
  1264
11
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1265
        return (
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1266
            tags.h1(u"Uusi tilaus"),
90a3c570c227 NewOrderView now works ~fully, including error handling
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
  1267
            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
  1268
        )
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
  1269
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1270
class OrderContractDocument (DocumentHandler) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1271
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1272
        Generate and return PDF document for rental contract.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1273
    """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1274
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1275
    def process (self, id):
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1276
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1277
            Return OrderModel object for given ID
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1278
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1279
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1280
        # db session
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1281
        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
  1282
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1283
        # order object
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1284
        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
  1285
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1286
        # form
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1287
        self.form = OrderContractForm(self.app)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1288
        self.form.defaults()
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1289
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1290
        # XXX: also use GET data?
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1291
        data = self.request.values
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1292
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1293
        if self.form.process(data) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1294
            # render PDF
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1295
            pass
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1296
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1297
        else :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1298
            # show form again
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1299
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1300
            # 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
  1301
            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
  1302
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1303
            # monkey-map
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1304
            handler.render_content = self.render_content
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1305
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1306
            log.warn("Monkeyhack %r -> %r", self, handler)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1307
            
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1308
            # XXX: this invokes handler.process(), but...
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1309
            return handler.respond(id=id)
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1310
    
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1311
    def render_content (self, id) :
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1312
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1313
            Display PDF gen form.
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1314
        """
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1315
        
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1316
        return (
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1317
            tags.h1(u"Vuokrasopimus"),
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1318
            self.form.render(action=self.url_for(OrderContractDocument, id=id)),
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1319
        )
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1320
    
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1321
    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
  1322
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1323
            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
  1324
        """
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1325
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1326
        order = self.order
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1327
        params = self.form
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1328
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1329
        title = "Teekkarispeksi Ry - Vuokrasopimus"
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1330
        author = "Teekkarispeksi Ry"
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1331
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1332
        tpl = pdf.PageTemplate('page',
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1333
            header_columns  = (
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1334
                ("", ""),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1335
                ("", ""),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1336
                ("", ""),
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1337
                ("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
  1338
            ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1339
            footer_columns  = (
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
  1340
                ("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
  1341
                ("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
  1342
                ("Varastovastaava", ("Joel Pirttimaa", "045 xxx yyzz", "jhpirtti@cc.hut.fi")),
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1343
                ("", ""),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1344
            ),
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1345
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1346
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1347
        doc = pdf.DocumentTemplate([tpl],
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1348
            title = title, author = author,
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1349
        )
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1350
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1351
        # stylesheet
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1352
        styles = pdf.Styles()
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1353
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1354
        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
  1355
        
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1356
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1357
        # format
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
  1358
        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
  1359
            order       = order,
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1360
        )
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1361
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1362
        # 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
  1363
        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
  1364
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1365
        # format to flowables
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1366
        text_elements = list(pdf.Markup(styles).render(root))
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1367
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1368
        sig_prefill = {}
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1369
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1370
        if params.prefill_placetime :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1371
            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
  1372
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1373
        if params.prefill_ourname :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1374
            sig_prefill[('Vuokranantaja', 'Nimen selvennys')] = params.prefill_ourname
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1375
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
  1376
        elements = text_elements + [
33
471837eb3d96 orders: Fix signature block alignment
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
  1377
                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
  1378
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1379
        ]
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1380
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1381
        # ok
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1382
        return doc, elements
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1383
       
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
  1384