svv/orders.py
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--
html: Implement selfclosing and whitespace_sensitive options (for <textarea>s)
# 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"),
        )