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