svv/items.py
author Tero Marttila <terom@fixme.fi>
Mon, 10 Jan 2011 17:04:15 +0200
changeset 48 06fa83c8c0bb
child 53 06dad873204d
permissions -rw-r--r--
items: Inventory management
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    def render (self, action, legend=u"Laitejuttu", return_url=None, delete_action=None) :
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
                delete_action       - (optional) URL to delete-item option
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
            html.form(action=action, method='POST')(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
                html.fieldset(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
                    html.legend(legend),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
                    html.ol(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
                        self.render_form_field('item_parent', u"Case", u"Missä laite sijaitsee", (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
                            self.render_parent_select('item_parent', self.item_parent_id)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
                        )),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
                        self.render_form_field('item_name', u"Nimi", u"Lyhyt nimi", (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
                            self.render_text_input('item_name', self.item_name)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
                        )),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
                        self.render_form_field('item_detail', u"Kuvaus", u"Tarkempi kuvaus", (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
                            self.render_text_input('item_detail', self.item_detail, multiline=True)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
                        )),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
                        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", (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
                            self.render_text_input('item_quantity', self.item_quantity)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
                        )),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
                        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
                        html.li(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
                            self.render_submit_button(u"Tallenna"),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
                            self.render_reset_button(u"Palaa inventaariin", return_url) if return_url else None,
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
            ),
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
            html.form(action=delete_action, method='POST')(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
                html.fieldset(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
                    html.legend(u"Poistaminen"),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
                    html.input(type='hidden', name='items', value=self.item_id),
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
                    html.ol(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
                        html.li(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
                            html.input(type='submit', name='delete', value=u"Poista"),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
                        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
                    )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
                ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
            ) if delete_action else None
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    def process (self, data) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
            Process incoming POST data
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
        # bind
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
        self.data = data
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        self.do_delete = self.process_action_field('delete')
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
        if not self.do_delete :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
            try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
                # XXX: self.process_id_field?
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
                self.item_parent_id = self.process_integer_field('item_parent')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
            except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
                self.fail_field(e, 'item_parent')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
            try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
                self.item_name = self.process_text_field('item_name', required=True)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
            except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
                self.fail_field(e, 'item_name')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
            try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
                self.item_detail = self.process_text_field('item_detail')
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
            except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
                self.fail_field(e, 'item_detail')
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
            try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
                self.item_quantity = self.process_integer_field('item_quantity')
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
            except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
                self.fail_field(e, 'item_quantity')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
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
        # ok? 
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        return not self.errors
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
class DeleteItemForm (BaseForm) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        Display a list of items to delete, and confirm
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    def __init__ (self, session) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
            Use given database session for rendering form.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        super(DeleteItemForm, self).__init__()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        self.session = session
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
        # list of items to delete
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
        self.items = []
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
    def render_items_list (self, name, items) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
            Render list of items to delete.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        def render_items (items) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
            return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
                html.ul(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
                    render_item(item) for item in items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
                ) if items else None
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
            )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
        def render_item (item) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
            return html.li(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
                html.input(type='hidden', name='items', value=item.id),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
                item.name,
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
                render_items(item.children),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
            )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
        return html.div(class_='value')(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
            render_items(items),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
    def render (self, action, return_url) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
            Render form with list of target items, and a confirm button
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
        return html.form(action=action, method='POST')(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
            html.fieldset(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
                html.legend(u"Poistettavat laitteet"),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
                html.ol(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
                    self.render_form_field('items', u"Poistettavat laitteet", u"Kaikki listatut laitteet poistetaan inventaarista", (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
                        self.render_items_list('items', self.items)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
                    )),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
                    html.li(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
                        self.render_submit_button(u"Varmista", 'confirm'),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
                        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
                        self.render_reset_button(u"Peruuta", return_url),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
                    ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
                )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
            )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    def process_items_list (self, name) :
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
            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
   233
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
        # incoming ids
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
        item_ids = self.process_list_field('items', type=int)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
        # look up
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
        items = self.session.query(Item).filter(Item.id.in_(item_ids)).all()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
        # make sure they all exist
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
        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
   243
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
        if set(found) != set(item_ids) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
            raise FormError(name, found, "Some items were not found")
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
        if not items :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
            raise FormError(name, [], "No items were given")
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
        # ok
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
        return items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
    def process (self, data) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
            Look up list of Item's to delete.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
            Returns True if the delete is confirmed, False otherwise.
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
        # bind
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
        self.data = data
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
        # load items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
        try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
            self.items = self.process_items_list('items')
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
        except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
            self.fail_field(e, 'items')
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
        # confirm?
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
        confirm = self.process_action_field('confirm')
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
        return not self.errors and confirm
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
class ItemView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
        Display/edit info for a single item
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
    def update (self, item, form) :
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
            Update item data from form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
        """
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
        # lookup
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
        item.parent = self.session.query(Item).get(form.item_parent_id)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
        # modify
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
        item.name = form.item_name
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
        item.detail = form.item_detail
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
        item.quantity = form.item_quantity
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
        # update
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
        self.session.commit()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
    def process (self, id) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
            Update item data if POST'd
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
        self.session = self.app.session()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
        # item in concern
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
        self.item = self.session.query(Item).get(id)
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
        # form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
        self.form = ItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   309
        self.form.load(self.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
        # process?
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
        if self.POST :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   313
            if self.form.process(self.POST) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   314
                # update
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
                self.update(self.item, self.form)
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
                # ok, done with item, redirect to full list view...
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   318
                return self.redirect_for(InventoryView, fragment=('item-%d' % self.item.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
            else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   321
                # re-render form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   322
                return
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   323
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   324
    def render_content (self, id) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   325
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   326
            View item's info
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   329
        return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   330
            html.h1(u"Laite #%d" % self.item.id),
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
            self.form.render(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   333
                action          = self.url_for(ItemView, id=id), 
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   334
                return_url      = self.url_for(InventoryView),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   335
                delete_action   = self.url_for(DeleteItemView),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   336
            ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   337
        )
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
class NewItemView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   340
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   341
        Create new 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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   344
    def create (self, form) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
            Create and return new item from ItemForm data.
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
        """
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
        item = Item()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
        # validate and lookup parent
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   352
        item.parent = self.session.query(Item).get(form.item_parent_id)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
        # store
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
        item.name = form.item_name
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
        item.detail = form.item_detail
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
        item.quantity = form.item_quantity
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   359
        # insert
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
        self.session.add(item)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   361
        self.session.commit()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   362
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   363
        # ok
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   364
        return item
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   365
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   366
    def process (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   367
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   368
        self.session = self.app.session()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   369
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   370
        self.form = ItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   371
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   372
        # load POST
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   373
        if self.POST :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   374
            if self.form.process(self.POST) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   375
                # create
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   376
                item = self.create(self.form)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   377
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   378
                # redirect to full list view...
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   379
                return self.redirect_for(InventoryView, fragment=('item-%d' % item.id))
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   380
            
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   381
            else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   382
                # fail, just render...
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   383
                return
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   384
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   385
        else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   386
            # render blank form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   387
            self.form.defaults()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   388
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
    def render_content (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   390
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
            Render the proecss()'d form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   392
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   393
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   394
        return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   395
            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
   396
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   397
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   398
class DeleteItemView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   399
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   400
        Confirm deletion of items.
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   403
    def delete (self, form) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   404
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
            Delete items from form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   406
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   408
        # list of root Item's to delete, along with children
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   409
        items = form.items
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
        for item in items :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
            self.session.delete(item)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
        # ok
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   415
        self.session.commit()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   416
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   417
    def process (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   419
        self.session = self.app.session()
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
        # form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   422
        self.form = DeleteItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   423
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   424
        # process
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   425
        if self.form.process(self.POST) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
            # delete
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
            self.delete(self.form)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
                
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
            # redirect back
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
            return self.redirect_for(InventoryView)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   432
        else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   433
            # render
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   434
            pass
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   435
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   436
    def render_content (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   437
        return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   438
            self.form.render(action=self.url_for(DeleteItemView), return_url=self.url_for(InventoryView))
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   439
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   440
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   441
class InventoryView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   442
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   443
        Display overview of all items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   444
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   445
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
    def process (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   448
        self.session = self.app.session()
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
    def render_item_table (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   451
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   452
            Render HTML for full <table> of all items, sorted heirarchially (by parent)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   453
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   455
        # listing of inventory items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   456
        items = self.session.query(Item).order_by(Item.parent).all()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   457
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   458
        return html.table(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   459
            html.caption("Kalustolistaus"),
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
            html.thead(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   462
                html.tr(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   463
                    html.th(title) for title in (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   464
                        u"#ID",
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   465
                        u"Case",
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   466
                        u"Nimi",
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   467
                        u"Kuvaus",
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   468
                        u"Määrä",
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
                ),
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   473
            html.tbody(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   474
                html.tr(id=('item-%d' % item.id))(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   475
                    html.td(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   476
                        html.a(href=self.url_for(ItemView, id=item.id))(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   477
                            u'#%d' % item.id
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   481
                    html.td(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   482
                        html.a(href=self.url_for(ItemView, id=item.parent.id))(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   483
                            item.parent.name
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   484
                        ) if item.parent else None
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   487
                    html.td(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   488
                        html.a(href=self.url_for(ItemView, id=item.id))(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   489
                            item.name
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   490
                        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   491
                    ),
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
                    html.td(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   494
                        item.detail
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   497
                    html.td(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   498
                        "%d kpl" % item.quantity if item.quantity else None
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   499
                    ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   500
                ) for item in items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   501
            )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   502
        )
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
    def render_item_form (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   505
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   506
            Render ItemForm for creating a new item
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   509
        form = ItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   510
        form.defaults()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   511
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   512
        return form.render(action=self.url_for(NewItemView), legend=u"Lisää uusi")
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   513
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   514
    def render_content (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   515
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   516
            Full listing of all inventory
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   517
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   518
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   519
        return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   520
            html.h1(u"Inventaari"),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   521
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   522
            self.render_item_table(),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   523
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   524
            self.render_item_form(),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   525
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   526