# coding: utf-8
"""
Order data model/view/handler
"""
from svv.controllers import PageHandler
from svv.html import tags
from svv import database as db
import datetime
class OrdersView (PageHandler) :
def render (self) :
return tags.h1("Orders list")
class OrderView (PageHandler) :
def render (self) :
return tags.h1("Order info")
class NewOrderView (PageHandler) :
def render_form_field (self, title, description, name, input) :
return tags.li(class_='field')(
tags.label(title, for_=name),
input,
# tags.span("Error!"),
tags.p(description),
)
def get_customer_list (self) :
"""
Get (id, name) list of customers
"""
return self.app.query(db.select([db.customers.c.id, db.customers.c.name]))
def get_contact_list (self, customer_id=None) :
"""
Get (id, name, phone, email) list of contacts, optionally for given customer if given.
"""
query = db.select([db.contacts.c.id, db.contacts.c.name, db.contacts.c.phone, db.contacts.c.email])
if customer_id :
query = query.where((db.contacts.c.customer == customer_id))
return self.app.query(query)
def render_customer_input (self) :
"""
Render HTML for customer field <input>s
"""
# pre-selected values?
customer_id = self.POST.get('customer_id')
customer_name = self.POST.get('customer_name')
# available values
customers = self.get_customer_list()
return (
tags.select(name='customer_id', id='customer_id')(
tags.option(value=0)(u"Luo uusi"),
[(
tags.option(value=id, selected=('selected' if id == customer_id or name == customer_name else None))(name)
) for id, name in customers],
),
tags.input(type='text', name='customer_name', id='customer_name'),
tags.script(r"$(document).ready(function () { $('#customer_id').formSelectPreset({textTarget: $('#customer_name')}); });"),
)
def render_contact_input (self) :
"""
Render HTML for contact name field <input>s
"""
# pre-selected values
customer_id = self.POST.get('customer_id')
contact_id = self.POST.get('contact_id')
contact_name = self.POST.get('contact_name')
contact_phone = self.POST.get('contact_phone')
contact_email = self.POST.get('contact_email')
# available values
contacts = self.get_contact_list()
return (
tags.select(name='contact_id', id='contact_id')(
tags.option(value=0)(u"Luo uusi"),
[(
tags.option(value=id, selected=('selected' if id == contact_id else None))(name)
) for id, name, phone, email in contacts],
),
tags.input(type='text', name='contact_name', id='contact_name'),
tags.script(r"$(document).ready(function () { $('#contact_id').formSelectPreset({textTarget: $('#contact_name')}); });"),
)
DATETIME_FORMAT = "%d.%m.%Y %H:%M"
def get_POST_datetime (self, name, default=None) :
"""
Return a datetime for something the client POST'd
"""
value = self.POST.get(name)
if value :
# XXX: handle invalid format..
return datetime.datetime.strptime(value, self.DATETIME_FORMAT)
else :
return default
def render_event_input (self) :
"""
Render HTML for event start/end field <input>s
"""
# XXX: sensible defaults?
tomorrow = datetime.date.today() + datetime.timedelta(days=1)
default_start = datetime.datetime.combine(tomorrow, datetime.time(16, 00))
# automatically determined once start is set
default_end = None
# pre-selected values
event_start = self.get_POST_datetime('event_start', default_start)
event_end = self.get_POST_datetime('event_end', default_end)
return (
tags.input(type='text', name='event_start', id='event_start', value=(event_start.strftime(self.DATETIME_FORMAT) if event_start else None)),
" - ",
tags.input(type='text', name='event_end', id='event_end', value=(event_end.strftime(self.DATETIME_FORMAT) if event_end else None)),
tags.script(r"""
$(document).ready(function () {
var event_start = $('#event_start');
var event_end = $('#event_end');
event_start.datetimepicker();
event_end.datetimepicker();
event_start.change(function () {
// copy value as default
var start_date = event_start.datetimepicker("getDate");
event_end.datetimepicker("option", "defaultDate", start_date);
});
// init default as well
event_start.change();
});""" ),
)
def render (self) :
return tags.form(action=self.build_url(NewOrderView), method='POST')(
tags.h1(u"Uusi tilaus"),
tags.fieldset(
tags.legend(u"Tilaaja"),
tags.ol(
self.render_form_field(u"Tilaaja", u"Tilaavan yhdistyksen/henkilön nimi", 'customer_name', self.render_customer_input()),
self.render_form_field(u"Yhteyshenkilö", u"Yhteyshenkilön nimi, jos eri kun tilaaja", 'contact_name', self.render_contact_input()),
self.render_form_field(u"Puhelin", u"Yhteyshenkilön puhelinnumero", 'contact_phone', (
tags.input(type='text', name='contact_phone')
)),
self.render_form_field(u"Sähköposti", u"Yhteyshenkilön sähköpostiosoite", 'contact_email', (
tags.input(type='text')
)),
),
),
tags.fieldset(
tags.legend(u"Tapahtuma"),
tags.ol(
self.render_form_field(u"Tapahtuma", u"Tapahtuman lyhyt nimi", 'event_name', (
tags.input(type='text', name='event_name')
)),
self.render_form_field(u"Lisätiedot", u"Tapahtuman tarkemmat tiedot", 'event_description', (
tags.textarea("", rows=8, name='event_description')
)),
self.render_form_field(u"Ajankohta", u"Tapahtuman ajankohta (kamat noudetaan - palautetaan)", 'event_start', self.render_event_input()),
),
),
tags.input(type='submit', value="Tallenna"),
)