Source code for stoqlib.gui.dialogs.stockcostdialog

# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4

##
## Copyright (C) 2009 Async Open Source <http://www.async.com.br>
## All rights reserved
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU Lesser General Public License for more details.
##
## You should have received a copy of the GNU Lesser General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
## Author(s): Stoq Team <stoq-devel@async.com.br>
##
""" Dialog to edit the stock average cost for products on a certain branch """

from kiwi import ValueUnset
from kiwi.currency import currency
from kiwi.enums import ListType
from kiwi.ui.objectlist import Column
from kiwi.ui.listdialog import ListSlave

from stoqlib.api import api
from stoqlib.domain.views import ProductWithStockView
from stoqlib.gui.editors.baseeditor import BaseEditor
from stoqlib.lib.formatters import get_formatted_cost
from stoqlib.lib.translation import stoqlib_gettext

_ = stoqlib_gettext


class _TemporaryItem(object):
    def __init__(self, item):
        self.obj = item
        self.code = item.code
        self.description = item.description
        self.old_stock_cost = item.stock_cost
        self.stock_cost = item.stock_cost


# FIXME: Create a generic (spreadsheet like) table editor
[docs]class StockCostDialog(BaseEditor): gladefile = "StockCostDialog" model_type = object title = _(u"Product - Stock Cost") size = (750, 450) def __init__(self, store, branch=None): if branch is None: self._branch = api.get_current_branch(store) else: self._branch = branch BaseEditor.__init__(self, store, model=object()) self._setup_widgets() def _setup_widgets(self): self.branch_label.set_markup( _(u"Fixing stock cost for products in <b>%s</b>") % api.escape(self._branch.get_description())) items = ProductWithStockView.find_by_branch(self.store, self._branch) self._storables = [_TemporaryItem(s) for s in items] self.slave.listcontainer.add_items(self._storables) def _get_columns(self): return [Column("code", title=_(u"Code"), data_type=str, sorted=True, width=120), Column("description", title=_(u"Description"), data_type=str, expand=True), Column("stock_cost", title=_(u"Stock Cost"), width=120, data_type=currency, format_func=get_formatted_cost, editable=True)] # # BaseEditorSlave #
[docs] def setup_slaves(self): self.slave = ListSlave(self._get_columns()) self.slave.set_list_type(ListType.READONLY) self.slave.listcontainer.list.connect( "cell-edited", self._on_objectlist__cell_edited) self.attach_slave("on_slave_holder", self.slave)
[docs] def on_confirm(self): self.retval = [] with api.new_store() as store: for item in self._storables: if (item.stock_cost is ValueUnset or item.stock_cost == item.old_stock_cost or item.stock_cost == 0): continue storable = store.fetch(item.obj.product.storable) # TODO: add batch information here. Should we edit the the cost of # each batch individually, or one cost for all the batches? storable.update_stock_cost(item.stock_cost, self.store.fetch(self._branch)) self.retval.append(item.obj.product.sellable)
# # Callbacks # def _on_objectlist__cell_edited(self, objectlist, item, attr): # After filling a value, jump to the next cell or to the ok # button if we are at the last one treeview = objectlist.get_treeview() rows, column = treeview.get_cursor() next_row = rows[0] + 1 nitems = len(self._storables) if next_row < nitems: treeview.set_cursor(next_row, column) else: objectlist.unselect_all() self.main_dialog.ok_button.grab_focus()