author | Tero Marttila <terom@fixme.fi> |
Wed, 22 Dec 2010 21:30:27 +0200 | |
changeset 8 | 27e37082625e |
parent 7 | bbac4b0f4320 |
child 9 | 0327b83959e9 |
permissions | -rw-r--r-- |
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 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
6 |
from svv.controllers import PageHandler |
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 |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
9 |
|
7 | 10 |
import datetime |
11 |
||
6
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
12 |
class OrdersView (PageHandler) : |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
13 |
def render (self) : |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
14 |
return tags.h1("Orders list") |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
15 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
16 |
class OrderView (PageHandler) : |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
17 |
def render (self) : |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
18 |
return tags.h1("Order info") |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
19 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
20 |
class NewOrderView (PageHandler) : |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
21 |
def render_form_field (self, title, description, name, input) : |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
22 |
return tags.li(class_='field')( |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
23 |
tags.label(title, for_=name), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
24 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
25 |
input, |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
26 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
27 |
# tags.span("Error!"), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
28 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
29 |
tags.p(description), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
30 |
) |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
31 |
|
7 | 32 |
def get_customer_list (self) : |
33 |
""" |
|
34 |
Get (id, name) list of customers |
|
35 |
""" |
|
36 |
||
37 |
return self.app.query(db.select([db.customers.c.id, db.customers.c.name])) |
|
38 |
||
39 |
def get_contact_list (self, customer_id=None) : |
|
40 |
""" |
|
41 |
Get (id, name, phone, email) list of contacts, optionally for given customer if given. |
|
42 |
""" |
|
43 |
||
44 |
query = db.select([db.contacts.c.id, db.contacts.c.name, db.contacts.c.phone, db.contacts.c.email]) |
|
45 |
||
46 |
if customer_id : |
|
47 |
query = query.where((db.contacts.c.customer == customer_id)) |
|
48 |
||
49 |
return self.app.query(query) |
|
50 |
||
51 |
def render_customer_input (self) : |
|
52 |
""" |
|
53 |
Render HTML for customer field <input>s |
|
54 |
""" |
|
55 |
||
56 |
# pre-selected values? |
|
57 |
customer_id = self.POST.get('customer_id') |
|
58 |
customer_name = self.POST.get('customer_name') |
|
59 |
||
60 |
# available values |
|
61 |
customers = self.get_customer_list() |
|
62 |
||
63 |
return ( |
|
64 |
tags.select(name='customer_id', id='customer_id')( |
|
65 |
tags.option(value=0)(u"Luo uusi"), |
|
66 |
||
67 |
[( |
|
68 |
tags.option(value=id, selected=('selected' if id == customer_id or name == customer_name else None))(name) |
|
69 |
) for id, name in customers], |
|
70 |
), |
|
71 |
tags.input(type='text', name='customer_name', id='customer_name'), |
|
72 |
||
73 |
tags.script(r"$(document).ready(function () { $('#customer_id').formSelectPreset({textTarget: $('#customer_name')}); });"), |
|
74 |
) |
|
75 |
||
76 |
def render_contact_input (self) : |
|
77 |
""" |
|
78 |
Render HTML for contact name field <input>s |
|
79 |
""" |
|
80 |
||
81 |
# pre-selected values |
|
82 |
customer_id = self.POST.get('customer_id') |
|
83 |
contact_id = self.POST.get('contact_id') |
|
84 |
contact_name = self.POST.get('contact_name') |
|
85 |
contact_phone = self.POST.get('contact_phone') |
|
86 |
contact_email = self.POST.get('contact_email') |
|
87 |
||
88 |
# available values |
|
89 |
contacts = self.get_contact_list() |
|
90 |
||
91 |
return ( |
|
92 |
tags.select(name='contact_id', id='contact_id')( |
|
93 |
tags.option(value=0)(u"Luo uusi"), |
|
94 |
||
95 |
[( |
|
96 |
tags.option(value=id, selected=('selected' if id == contact_id else None))(name) |
|
97 |
) for id, name, phone, email in contacts], |
|
98 |
), |
|
99 |
||
100 |
tags.input(type='text', name='contact_name', id='contact_name'), |
|
101 |
||
102 |
tags.script(r"$(document).ready(function () { $('#contact_id').formSelectPreset({textTarget: $('#contact_name')}); });"), |
|
103 |
) |
|
104 |
||
105 |
DATETIME_FORMAT = "%d.%m.%Y %H:%M" |
|
106 |
||
107 |
def get_POST_datetime (self, name, default=None) : |
|
108 |
""" |
|
109 |
Return a datetime for something the client POST'd |
|
110 |
""" |
|
111 |
||
112 |
value = self.POST.get(name) |
|
113 |
||
114 |
if value : |
|
115 |
# XXX: handle invalid format.. |
|
116 |
return datetime.datetime.strptime(value, self.DATETIME_FORMAT) |
|
117 |
||
118 |
else : |
|
119 |
return default |
|
120 |
||
121 |
def render_event_input (self) : |
|
122 |
""" |
|
123 |
Render HTML for event start/end field <input>s |
|
124 |
""" |
|
125 |
||
126 |
# XXX: sensible defaults? |
|
127 |
tomorrow = datetime.date.today() + datetime.timedelta(days=1) |
|
128 |
default_start = datetime.datetime.combine(tomorrow, datetime.time(16, 00)) |
|
129 |
||
130 |
# automatically determined once start is set |
|
131 |
default_end = None |
|
132 |
||
133 |
# pre-selected values |
|
134 |
event_start = self.get_POST_datetime('event_start', default_start) |
|
135 |
event_end = self.get_POST_datetime('event_end', default_end) |
|
136 |
||
137 |
return ( |
|
138 |
tags.input(type='text', name='event_start', id='event_start', value=(event_start.strftime(self.DATETIME_FORMAT) if event_start else None)), |
|
139 |
" - ", |
|
140 |
tags.input(type='text', name='event_end', id='event_end', value=(event_end.strftime(self.DATETIME_FORMAT) if event_end else None)), |
|
141 |
||
142 |
tags.script(r""" |
|
143 |
$(document).ready(function () { |
|
144 |
var event_start = $('#event_start'); |
|
145 |
var event_end = $('#event_end'); |
|
146 |
||
147 |
event_start.datetimepicker(); |
|
148 |
event_end.datetimepicker(); |
|
149 |
||
150 |
event_start.change(function () { |
|
151 |
// copy value as default |
|
152 |
var start_date = event_start.datetimepicker("getDate"); |
|
153 |
||
154 |
event_end.datetimepicker("option", "defaultDate", start_date); |
|
155 |
}); |
|
156 |
||
157 |
// init default as well |
|
158 |
event_start.change(); |
|
159 |
});""" ), |
|
160 |
||
161 |
) |
|
162 |
||
6
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
163 |
def render (self) : |
7 | 164 |
return tags.form(action=self.build_url(NewOrderView), method='POST')( |
6
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
165 |
tags.h1(u"Uusi tilaus"), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
166 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
167 |
tags.fieldset( |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
168 |
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
|
169 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
170 |
tags.ol( |
7 | 171 |
self.render_form_field(u"Tilaaja", u"Tilaavan yhdistyksen/henkilön nimi", 'customer_name', 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
|
172 |
|
7 | 173 |
self.render_form_field(u"Yhteyshenkilö", u"Yhteyshenkilön nimi, jos eri kun tilaaja", 'contact_name', self.render_contact_input()), |
6
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
174 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
175 |
self.render_form_field(u"Puhelin", u"Yhteyshenkilön puhelinnumero", 'contact_phone', ( |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
176 |
tags.input(type='text', name='contact_phone') |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
177 |
)), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
178 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
179 |
self.render_form_field(u"Sähköposti", u"Yhteyshenkilön sähköpostiosoite", 'contact_email', ( |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
180 |
tags.input(type='text') |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
181 |
)), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
182 |
), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
183 |
), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
184 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
185 |
tags.fieldset( |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
186 |
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
|
187 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
188 |
tags.ol( |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
189 |
self.render_form_field(u"Tapahtuma", u"Tapahtuman lyhyt nimi", 'event_name', ( |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
190 |
tags.input(type='text', name='event_name') |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
191 |
)), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
192 |
|
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
193 |
self.render_form_field(u"Lisätiedot", u"Tapahtuman tarkemmat tiedot", 'event_description', ( |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
194 |
tags.textarea("", rows=8, name='event_description') |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
195 |
)), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
196 |
|
7 | 197 |
self.render_form_field(u"Ajankohta", u"Tapahtuman ajankohta (kamat noudetaan - palautetaan)", 'event_start', self.render_event_input()), |
6
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
198 |
), |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
199 |
), |
7 | 200 |
|
201 |
tags.input(type='submit', value="Tallenna"), |
|
6
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
202 |
) |
72c73df76db2
Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
203 |