svv/items.py
author Tero Marttila <terom@fixme.fi>
Tue, 11 Jan 2011 01:12:50 +0200
changeset 57 7a48e9d96ec8
parent 56 18e7b78813bd
child 59 de6abcbd3c03
permissions -rw-r--r--
items: fix NewOrderView
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(
56
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
    85
                    self.render_form_field('item_parent', u"Sijainti", u"Missä laite sijaitsee", (
53
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
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   180
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   181
        def render_items (items, with_list, with_input) :
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   182
            """ Item <ul> or <input>s """
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   183
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   184
            if not items :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   185
                # blank
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   186
                return None
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   187
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   188
            elif with_list :
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   189
                # nested list
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   190
                return html.ul(
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   191
                    render_item(item, True, with_input) for item in items
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   192
                )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   193
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   194
            else :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   195
                # just the controls
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   196
                return [render_item(item, False, with_input) for item in items]
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   197
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   198
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   199
        def render_item (item, with_list, with_input) :
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   200
            """ Item <li> or <input> """
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   201
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   202
            if with_input :
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   203
                # the form field
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   204
                input = html.input(type='hidden', name='items', value=item.id),
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   205
            else :
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   206
                # no field
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   207
                input = None
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   208
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   209
            if with_list :
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   210
                return html.li(
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   211
                    input,
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   212
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   213
                    item.name if visible else None,
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   214
                    
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   215
                    # don't recurse inputs
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   216
                    render_items(item.children, with_list, with_input=False),
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   217
                )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   218
            else :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   219
                # just the input
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   220
                return input
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   221
       
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   222
        ## Render <div> or <input>s
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   223
        if visible :
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   224
            # <div> with nested <li>s
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   225
            return html.div(class_='value')(
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   226
                render_items(items, with_list=True, with_input=True),
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
            )
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   228
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   229
        else :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   230
            # just the <input>s
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   231
            return render_items(items, with_list=False, with_input=True)
48
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
    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
   234
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
            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
   236
                
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   237
                legend              - form title
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   238
                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
   239
                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
   240
                reutrn_url          - URL for cancel button
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   241
                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
   242
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   243
            Supply either delete_action or confirm_action, but not both
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   246
        action = delete_action or confirm_action
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   247
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
        return html.form(action=action, method='POST')(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
            html.fieldset(
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   250
                html.legend(legend),
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   252
                # raw field with just the <input>s
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   253
                (self.render_items_list('items', self.items, visible=False)) if not item_listing else None,
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   254
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
                html.ol(
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   256
                    # full UI field
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   257
                    (self.render_form_field('items', u"Poistettavat laitteet", u"Kaikki listatut laitteet poistetaan inventaarista", (
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   258
                        self.render_items_list('items', self.items, visible=True)
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   259
                    )) if item_listing else None),
48
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
                    html.li(
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   262
                        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
   263
                        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
   264
                        
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   265
                        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
   266
                    ),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
                )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
            )
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
    def process_items_list (self, name) :
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
            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
   274
        """
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
        # incoming ids
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
        item_ids = self.process_list_field('items', type=int)
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
        # look up
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
        items = self.session.query(Item).filter(Item.id.in_(item_ids)).all()
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
        # make sure they all exist
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
        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
   284
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
        if set(found) != set(item_ids) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
            raise FormError(name, found, "Some items were not found")
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
        if not items :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
            raise FormError(name, [], "No items were given")
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
        # ok
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
        return items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
    def process (self, data) :
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
            Look up list of Item's to delete.
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
            Returns True if the delete is confirmed, False otherwise.
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
        # bind
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
        self.data = data
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
        # load items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
        try :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   306
            self.items = self.process_items_list('items')
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   307
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
        except FormError, e :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   309
            self.fail_field(e, 'items')
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
        # confirm?
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
        confirm = self.process_action_field('confirm')
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
        return not self.errors and confirm
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
class ItemView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   317
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   318
        Display/edit info for a single item
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   321
    def update (self, item, form) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   322
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   323
            Update item data from form
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   326
        # lookup
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   327
        item.parent = self.session.query(Item).get(form.item_parent_id)
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
        # modify
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   330
        item.name = form.item_name
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   331
        item.detail = form.item_detail
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
        item.quantity = form.item_quantity
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   333
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   334
        # update
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   335
        self.session.commit()
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
    def process (self, 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
            Update item data if POST'd
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
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   342
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   343
        self.session = self.app.session()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   344
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
        # item in concern
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
        self.item = self.session.query(Item).get(id)
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
        # form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
        self.form = ItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
        self.form.load(self.item)
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
        # process?
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
        if self.POST :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
            if self.form.process(self.POST) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
                # update
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
                self.update(self.item, self.form)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
                # ok, done with item, redirect to full list view...
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   359
                return self.redirect_for(InventoryView, fragment=('item-%d' % self.item.id))
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
            
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   361
            else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   362
                # re-render form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   363
                return
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   364
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   365
    def render_subitems_table (self, subitems) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   366
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   367
            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
   368
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   369
            
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   370
        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
   371
        
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   372
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   373
    def render_delete_form (self) :
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
            Render delete form for this item
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
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   378
        form = DeleteItemForm(self.session)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   379
        form.load([self.item])
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   380
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   381
        return form.render(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   382
            legend          = u"Poistaminen",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   383
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   384
            delete_action  = self.url_for(DeleteItemView),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   385
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   386
            item_listing    = False,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   387
        )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   388
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
    def render_content (self, id) :
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
            View item's info
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   392
        """
53
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
        # ourselves
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   395
        item = self.item
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   396
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   397
        # items in this item
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   398
        subitems = item.children
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   399
        
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   400
        return (
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   401
            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
   402
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   403
            html.h3(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   404
                html.raw(u"Sijaitsee %s:ssa" % (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   405
                    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
   406
                )),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   407
            ) if item.parent else None,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   408
            
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   409
            self.render_subitems_table(subitems) if subitems else None,
48
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
            self.form.render(
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
                action          = self.url_for(ItemView, id=id), 
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
                return_url      = self.url_for(InventoryView),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
            ),
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   415
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   416
            # delete form
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   417
            self.render_delete_form(),
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
        )
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
class NewItemView (PageHandler) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   422
        Create new item
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   425
    def create (self, form) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
            Create and return new item from ItemForm data.
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
        item = Item()
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
        # validate and lookup parent
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   433
        item.parent = self.session.query(Item).get(form.item_parent_id)
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
        # store
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   436
        item.name = form.item_name
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   437
        item.detail = form.item_detail
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   438
        item.quantity = form.item_quantity
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
        # insert
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   441
        self.session.add(item)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   442
        self.session.commit()
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
        # ok
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   445
        return item
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
    def process (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   448
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   449
        self.session = self.app.session()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   450
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   451
        self.form = ItemForm(self.session)
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
        # load POST
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
        if self.POST :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   455
            if self.form.process(self.POST) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   456
                # create
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   457
                item = self.create(self.form)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   458
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   459
                # redirect to full list view...
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   460
                return self.redirect_for(InventoryView, fragment=('item-%d' % item.id))
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   461
            
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   462
            else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   463
                # fail, just render...
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   464
                return
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
        else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   467
            # render blank form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   468
            self.form.defaults()
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
    def render_content (self) :
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
            Render the proecss()'d form
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
        return (
57
7a48e9d96ec8 items: fix NewOrderView
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   476
            self.form.render(action=self.url_for(NewItemView), legend=u"Lisää uusi")
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   477
        )
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
class DeleteItemView (PageHandler) :
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
        Confirm deletion of 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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   484
    def delete (self, form) :
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
            Delete items from form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   487
        """
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
        # list of root Item's to delete, along with children
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   490
        items = form.items
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
        for item in items :
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   493
            # XXX: we shouldn't actually DELETE these; rather, mark them as removed
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   494
            #      messes up existing orders like this...
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   495
            self.session.delete(item)
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
        # ok
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   498
        self.session.commit()
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
    def process (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   501
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   502
        self.session = self.app.session()
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
        # form
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   505
        self.form = DeleteItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   506
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   507
        # process
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   508
        if self.form.process(self.POST) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   509
            # delete
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   510
            self.delete(self.form)
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
            # redirect back
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   513
            return self.redirect_for(InventoryView)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   514
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   515
        else :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   516
            # render
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   517
            pass
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
    def render_content (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   520
        return (
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   521
            self.form.render(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   522
                legend          = u"Poistettavat laitteet",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   523
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   524
                confirm_action   = self.url_for(DeleteItemView),
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
                return_url      = self.url_for(InventoryView),
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
                item_listing    = True,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   529
            )
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   530
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   531
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   532
class ItemTable (object) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   533
    """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   534
        Table of items
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   535
    """
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
    def __init__ (self, handler) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   538
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   539
                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
   540
        """
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
        self.handler = handler
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   543
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   544
    def url_for (self, *args, **kwargs) :
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
            Proxy to handler
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   547
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   548
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   549
        return self.handler.url_for(*args, **kwargs)
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   550
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   551
    def render (self, items, parent=None) :
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   552
        """
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   553
            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
   554
            item.
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
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   557
        return html.table(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   558
            html.caption(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   559
                u"Kalustolistaus",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   560
                (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   561
                    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
   562
                        parent.name
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   563
                    ) if parent else None
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   564
                ),
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
            html.thead(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   568
                html.tr(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   569
                    html.th(title) for title in (
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   570
                        u"#ID",
56
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   571
                        u"Sijainti" if not parent else None,
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   572
                        u"Nimi",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   573
                        u"Kuvaus",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   574
                        u"Määrä",
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   575
                    ) if title
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   576
                ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   577
            ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   578
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   579
            html.tbody(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   580
                html.tr(id=('item-%d' % item.id))(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   581
                    html.td(
55
433842c04ab1 items: inventory table #id links, fix up DeleteItemForm
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   582
                        html.a(href=self.url_for(InventoryView, fragment=('item-%d' % item.id)))(
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   583
                            u'#%d' % item.id
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   584
                        )
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
                    html.td(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   588
                        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
   589
                            item.parent.name
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   590
                        ) if item.parent else None
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   591
                    ) if not parent else None,
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   592
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   593
                    html.td(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   594
                        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
   595
                            item.name
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
                    html.td(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   600
                        item.detail
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   601
                    ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   602
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   603
                    html.td(
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   604
                        "%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
   605
                    ),
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   606
                ) for item in items
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   607
            )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   608
        )
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   609
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   610
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   611
class InventoryView (PageHandler) :
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
        Display overview of all items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   614
    """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   615
    
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   616
    def process (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   617
        # db
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   618
        self.session = self.app.session()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   619
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   620
    def render_item_table (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   621
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   622
            Render HTML for full <table> of all items, sorted heirarchially (by parent)
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   625
        # listing of inventory items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   626
        items = self.session.query(Item).order_by(Item.parent).all()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   627
        
53
06dad873204d items: use DeleteItemForm for ItemView as well
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   628
        return ItemTable(self).render(items)
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   629
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   630
    def render_item_form (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   631
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   632
            Render ItemForm for creating a new item
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
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   635
        form = ItemForm(self.session)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   636
        form.defaults()
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   637
        
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   638
        return form.render(action=self.url_for(NewItemView), legend=u"Lisää uusi")
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   639
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   640
    def render_content (self) :
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   641
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   642
            Full listing of all inventory
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   643
        """
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   644
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   645
        return (
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   646
            html.h1(u"Inventaari"),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   647
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   648
            self.render_item_table(),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   649
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   650
            self.render_item_form(),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   651
        )
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   652