svv/items.py
author Tero Marttila <terom@fixme.fi>
Mon, 10 Jan 2011 17:51:08 +0200
changeset 53 06dad873204d
parent 48 06fa83c8c0bb
child 55 433842c04ab1
permissions -rw-r--r--
items: use DeleteItemForm for ItemView as well
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
# coding: utf-8
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
from svv import database as db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
from svv.controllers import PageHandler
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
from svv.html import tags as html
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
from svv.forms import BaseForm, FormError
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
import logging
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
log = logging.getLogger('svv.items')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
class Item (object) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
        Data-mapping for the items table
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
db.mapper(Item, db.items, properties=dict(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    # forward ref to parent
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    parent      = db.relation(Item, remote_side=db.items.c.id, 
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        backref     = db.backref('children', remote_side=db.items.c.parent_id)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
))
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
class ItemForm (BaseForm) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        Form for editing item
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    def __init__ (self, session) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
            Use given database session for rendering form.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        super(ItemForm, self).__init__()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        self.session = session
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    def defaults (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        self.item_id = None
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        self.item_name = None
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
        self.item_detail = None
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        self.item_quantity = None
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        self.item_parent_id = None
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    def load (self, item) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
            Load info from existing item for editing
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        self.item_id = item.id
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        self.item_name = item.name
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        self.item_detail = item.detail
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        self.item_quantity = item.quantity
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        self.item_parent_id = item.parent.id if item.parent else None
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    def render_parent_select (self, name, parent_id) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
            Render <select> for parent
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        # existing items suitable as parents
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
        # XXX: currently only top-level items, as a heuristic
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        parent_items = self.session.query(Item.id, Item.name).filter(Item.parent == None).all()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
            # <select> with options and selected=
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
            self.render_select_input(name, [(0, u"---")] + parent_items, parent_id)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    73
    def render (self, action, legend=u"Laitetiedot", return_url=None) :
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
            Render <form> HTML
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
                return_url          - URL for reset button
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    80
        return html.form(action=action, method='POST')(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    81
            html.fieldset(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    82
                html.legend(legend),
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    84
                html.ol(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    85
                    self.render_form_field('item_parent', u"Case", u"Missä laite sijaitsee", (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    86
                        self.render_parent_select('item_parent', self.item_parent_id)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    87
                    )),
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    89
                    self.render_form_field('item_name', u"Nimi", u"Lyhyt nimi", (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    90
                        self.render_text_input('item_name', self.item_name)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    91
                    )),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    92
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    93
                    self.render_form_field('item_detail', u"Kuvaus", u"Tarkempi kuvaus", (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    94
                        self.render_text_input('item_detail', self.item_detail, multiline=True)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    95
                    )),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    96
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    97
                    self.render_form_field('item_quantity', u"Kappalemäärä", u"Jos on esim. useampi piuha/adapter, kirjaa niitten määrä; muuten jätä tyhjäksi", (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    98
                        self.render_text_input('item_quantity', self.item_quantity)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    99
                    )),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   100
                    
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   101
                    html.li(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   102
                        self.render_submit_button(u"Tallenna"),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   103
                        self.render_reset_button(u"Palaa inventaariin", return_url) if return_url else None,
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
                    ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
                ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
            ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    def process (self, data) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
            Process incoming POST data
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        # bind
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
        self.data = data
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
        self.do_delete = self.process_action_field('delete')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        if not self.do_delete :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
            try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
                # XXX: self.process_id_field?
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
                self.item_parent_id = self.process_integer_field('item_parent')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
            except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
                self.fail_field(e, 'item_parent')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
            try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
                self.item_name = self.process_text_field('item_name', required=True)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
            except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
                self.fail_field(e, 'item_name')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
            try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
                self.item_detail = self.process_text_field('item_detail')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
            except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
                self.fail_field(e, 'item_detail')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
            try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
                self.item_quantity = self.process_integer_field('item_quantity')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
            except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
                self.fail_field(e, 'item_quantity')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        # ok? 
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        return not self.errors
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
class DeleteItemForm (BaseForm) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        Display a list of items to delete, and confirm
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
    def __init__ (self, session) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
            Use given database session for rendering form.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
        super(DeleteItemForm, self).__init__()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        self.session = session
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
        # list of items to delete
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        self.items = []
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
    
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   166
    def load (self, items) :
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
        """
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   168
            Init set of items to delete
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   171
        self.items = items
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   173
    def render_items_list (self, name, items, visible=None) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   174
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   175
            Render list of items to delete.
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   176
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   177
                visible         - display list of items in addition the rendering the <input>'s
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   178
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   179
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   180
        def render_items (items, visible) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   181
            if not items :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   182
                # blank
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   183
                return None
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   184
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   185
            elif visible :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   186
                # nested list
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   187
                return html.ul(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   188
                    render_item(item, True) for item in items
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   189
                )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   190
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   191
            else :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   192
                # just the controls
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   193
                return [render_item(item, False) for item in items]
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   194
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   195
        def render_item (item, visible) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   196
            # the form field
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   197
            field = html.input(type='hidden', name='items', value=item.id),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   198
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   199
            if visible :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   200
                return html.li(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   201
                    field,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   202
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   203
                    item.name if visible else None,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   204
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   205
                    render_items(item.children, visible),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   206
                )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   207
            else :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   208
                # just the input
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   209
                return field
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   210
        
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   211
        if visible :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   212
            # div with nested <li>s
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   213
            return html.div(class_='value')(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   214
                render_items(items, True),
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
            )
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   216
        else :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   217
            # just the <input>s
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   218
            return render_items(items, False)
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   220
    def render (self, legend=None, delete_action=None, confirm_action=None, return_url=None, item_listing=None) :
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
            Render form with list of target items, and a confirm button
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   223
                
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   224
                legend              - form title
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   225
                delete_action       - URL for initial confirm stage submit
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   226
                confirm_action      - URL for final delete stage submit
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   227
                reutrn_url          - URL for cancel button
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   228
                item_listing        - display recursive item listing for confirmation
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   229
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   230
            Supply either delete_action or confirm_action, but not both
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   233
        action = delete_action or confirm_action
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   234
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
        return html.form(action=action, method='POST')(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
            html.fieldset(
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   237
                html.legend(legend),
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
                html.ol(
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   240
                    (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   241
                        # full UI field
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   242
                        (self.render_form_field('items', u"Poistettavat laitteet", u"Kaikki listatut laitteet poistetaan inventaarista", (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   243
                            self.render_items_list('items', self.items, visible=True)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   244
                        ))) 
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   245
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   246
                            if item_listing else 
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   247
                        
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   248
                        # raw field with just the <input>s
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   249
                        (self.render_items_list('items', self.items, visible=False))
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   250
                    ),
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
                    html.li(
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   253
                        self.render_submit_button(u"Poista") if delete_action else None,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   254
                        self.render_submit_button(u"Varmista", 'confirm') if confirm_action else None,
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
                        
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   256
                        self.render_reset_button(u"Peruuta", return_url) if return_url else None,
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
                    ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
                )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
            )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
    def process_items_list (self, name) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
            Uses the incoming list of id's to build the list of Item's to delete.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
        # incoming ids
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
        item_ids = self.process_list_field('items', type=int)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
        # look up
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
        items = self.session.query(Item).filter(Item.id.in_(item_ids)).all()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
        # make sure they all exist
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
        found = [item_id for item_id in item_ids if item_id in set(item.id for item in items)]
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
        if set(found) != set(item_ids) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
            raise FormError(name, found, "Some items were not found")
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
        if not items :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
            raise FormError(name, [], "No items were given")
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
        # ok
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
        return items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
    def process (self, data) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
            Look up list of Item's to delete.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
            Returns True if the delete is confirmed, False otherwise.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
        # bind
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
        self.data = data
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
        # load items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
        try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
            self.items = self.process_items_list('items')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
        except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
            self.fail_field(e, 'items')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
        # confirm?
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
        confirm = self.process_action_field('confirm')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
        return not self.errors and confirm
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   306
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   307
class ItemView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   309
        Display/edit info for a single item
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   310
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   311
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
    def update (self, item, form) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   313
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   314
            Update item data from form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   316
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   317
        # lookup
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   318
        item.parent = self.session.query(Item).get(form.item_parent_id)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   319
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   320
        # modify
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   321
        item.name = form.item_name
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   322
        item.detail = form.item_detail
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   323
        item.quantity = form.item_quantity
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   324
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   325
        # update
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   326
        self.session.commit()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   327
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   328
    def process (self, id) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   329
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   330
            Update item data if POST'd
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   331
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   333
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   334
        self.session = self.app.session()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   335
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   336
        # item in concern
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   337
        self.item = self.session.query(Item).get(id)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   338
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   339
        # form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   340
        self.form = ItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   341
        self.form.load(self.item)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   342
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   343
        # process?
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   344
        if self.POST :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
            if self.form.process(self.POST) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
                # update
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
                self.update(self.item, self.form)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   348
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
                # ok, done with item, redirect to full list view...
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
                return self.redirect_for(InventoryView, fragment=('item-%d' % self.item.id))
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
            
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   352
            else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
                # re-render form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
                return
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   356
    def render_subitems_table (self, subitems) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   357
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   358
            Render listing of child items in this item
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   359
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   360
            
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   361
        return ItemTable(self).render(subitems, parent=self.item)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   362
        
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   363
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   364
    def render_delete_form (self) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   365
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   366
            Render delete form for this item
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   367
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   368
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   369
        form = DeleteItemForm(self.session)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   370
        form.load([self.item])
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   371
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   372
        return form.render(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   373
            legend          = u"Poistaminen",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   374
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   375
            delete_action  = self.url_for(DeleteItemView),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   376
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   377
            item_listing    = False,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   378
        )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   379
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   380
    def render_content (self, id) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   381
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   382
            View item's info
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   383
        """
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   384
        
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   385
        # ourselves
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   386
        item = self.item
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   387
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   388
        # items in this item
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   389
        subitems = item.children
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   390
        
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
        return (
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   392
            html.h1("(#%d) %s" % (item.id, item.name)),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   393
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   394
            html.h3(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   395
                html.raw(u"Sijaitsee %s:ssa" % (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   396
                    html.a(href=self.url_for(ItemView, id=item.parent.id))(item.parent.name)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   397
                )),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   398
            ) if item.parent else None,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   399
            
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   400
            self.render_subitems_table(subitems) if subitems else None,
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   401
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   402
            self.form.render(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   403
                action          = self.url_for(ItemView, id=id), 
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   404
                return_url      = self.url_for(InventoryView),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
            ),
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   406
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   407
            # delete form
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   408
            self.render_delete_form(),
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   409
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   410
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
class NewItemView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
        Create new item
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   415
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   416
    def create (self, form) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   417
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
            Create and return new item from ItemForm data.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   419
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   420
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
        item = Item()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   422
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   423
        # validate and lookup parent
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   424
        item.parent = self.session.query(Item).get(form.item_parent_id)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   425
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
        # store
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
        item.name = form.item_name
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
        item.detail = form.item_detail
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
        item.quantity = form.item_quantity
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
        # insert
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   432
        self.session.add(item)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   433
        self.session.commit()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   434
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   435
        # ok
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   436
        return item
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   437
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   438
    def process (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   439
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   440
        self.session = self.app.session()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   441
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   442
        self.form = ItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   443
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   444
        # load POST
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   445
        if self.POST :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
            if self.form.process(self.POST) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
                # create
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   448
                item = self.create(self.form)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   449
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   450
                # redirect to full list view...
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   451
                return self.redirect_for(InventoryView, fragment=('item-%d' % item.id))
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   452
            
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   453
            else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
                # fail, just render...
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   455
                return
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   456
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   457
        else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   458
            # render blank form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   459
            self.form.defaults()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   460
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   461
    def render_content (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   462
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   463
            Render the proecss()'d form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   464
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   465
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   466
        return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   467
            self.form.render(action=self.url_for(NewItemView), legend=u"Lisää uusi", delete=True)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   468
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   469
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   470
class DeleteItemView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   471
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   472
        Confirm deletion of items.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   473
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   474
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   475
    def delete (self, form) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   476
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   477
            Delete items from form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   478
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   479
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   480
        # list of root Item's to delete, along with children
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   481
        items = form.items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   482
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   483
        for item in items :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   484
            self.session.delete(item)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   485
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   486
        # ok
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   487
        self.session.commit()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   488
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   489
    def process (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   490
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   491
        self.session = self.app.session()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   492
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   493
        # form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   494
        self.form = DeleteItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   495
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   496
        # process
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   497
        if self.form.process(self.POST) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   498
            # delete
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   499
            self.delete(self.form)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   500
                
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   501
            # redirect back
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   502
            return self.redirect_for(InventoryView)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   503
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   504
        else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   505
            # render
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   506
            pass
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   507
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   508
    def render_content (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   509
        return (
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   510
            self.form.render(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   511
                legend          = u"Poistettavat laitteet",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   512
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   513
                confirm_action   = self.url_for(DeleteItemView),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   514
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   515
                return_url      = self.url_for(InventoryView),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   516
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   517
                item_listing    = True,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   518
            )
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   519
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   520
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   521
class ItemTable (object) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   522
    """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   523
        Table of items
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   524
    """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   525
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   526
    def __init__ (self, handler) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   527
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   528
                handler         - the AppHandler we are running under, used for url_for etc.
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   529
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   530
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   531
        self.handler = handler
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   532
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   533
    def url_for (self, *args, **kwargs) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   534
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   535
            Proxy to handler
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   536
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   537
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   538
        return self.handler.url_for(*args, **kwargs)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   539
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   540
    def render (self, items, parent=None) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   541
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   542
            Render table for given set of items. If parent is given, those items are assumed to be the children of that
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   543
            item.
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   544
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   545
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   546
        return html.table(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   547
            html.caption(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   548
                u"Kalustolistaus",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   549
                (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   550
                    html.a(href=self.url_for(ItemView, id=parent.id))(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   551
                        parent.name
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   552
                    ) if parent else None
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   553
                ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   554
            ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   555
        
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   556
            html.thead(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   557
                html.tr(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   558
                    html.th(title) for title in (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   559
                        u"#ID",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   560
                        u"Case" if not parent else None,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   561
                        u"Nimi",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   562
                        u"Kuvaus",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   563
                        u"Määrä",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   564
                    ) if title
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   565
                ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   566
            ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   567
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   568
            html.tbody(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   569
                html.tr(id=('item-%d' % item.id))(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   570
                    html.td(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   571
                        html.a(href=self.url_for(ItemView, id=item.id))(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   572
                            u'#%d' % item.id
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   573
                        )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   574
                    ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   575
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   576
                    html.td(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   577
                        html.a(href=self.url_for(ItemView, id=item.parent.id))(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   578
                            item.parent.name
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   579
                        ) if item.parent else None
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   580
                    ) if not parent else None,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   581
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   582
                    html.td(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   583
                        html.a(href=self.url_for(ItemView, id=item.id))(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   584
                            item.name
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   585
                        )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   586
                    ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   587
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   588
                    html.td(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   589
                        item.detail
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   590
                    ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   591
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   592
                    html.td(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   593
                        "%d kpl" % item.quantity if item.quantity else None
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   594
                    ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   595
                ) for item in items
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   596
            )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   597
        )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   598
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   599
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   600
class InventoryView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   601
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   602
        Display overview of all items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   603
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   604
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   605
    def process (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   606
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   607
        self.session = self.app.session()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   608
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   609
    def render_item_table (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   610
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   611
            Render HTML for full <table> of all items, sorted heirarchially (by parent)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   612
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   613
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   614
        # listing of inventory items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   615
        items = self.session.query(Item).order_by(Item.parent).all()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   616
        
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   617
        return ItemTable(self).render(items)
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   618
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   619
    def render_item_form (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   620
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   621
            Render ItemForm for creating a new item
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   622
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   623
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   624
        form = ItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   625
        form.defaults()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   626
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   627
        return form.render(action=self.url_for(NewItemView), legend=u"Lisää uusi")
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   628
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   629
    def render_content (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   630
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   631
            Full listing of all inventory
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   632
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   633
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   634
        return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   635
            html.h1(u"Inventaari"),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   636
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   637
            self.render_item_table(),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   638
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   639
            self.render_item_form(),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   640
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   641