Source code for stoqlib.gui.search.searchcolumns

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

##
## Copyright (C) 2005-2013 Async Open Source
##
## 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>
##
""" Special columns definition for kiwi lists """

import decimal

import gobject
import gtk
from kiwi.ui.objectlist import Column

from stoqlib.lib.formatters import format_quantity
from stoqlib.lib.translation import stoqlib_gettext

_ = stoqlib_gettext


[docs]class AccessorColumn(Column): def __init__(self, attribute, accessor, *args, **kwargs): if not accessor: raise TypeError('AccessorColumn needs an accessor argument') self.accessor = accessor assert callable(self.accessor) Column.__init__(self, attribute=attribute, *args, **kwargs)
[docs] def get_attribute(self, instance, name, default=None): return self.accessor(instance)
[docs]class SearchColumn(Column): """ I am a column that should be used in conjunction with :class:`stoqlib.gui.search.searchslave.SearchSlave` :param long_title: The title to display in the combo for this field. This is usefull if you need to display a small description on the column header, but still want a full description on the advanced search. :param valid_values: This should be a list of touples (display value, db value). If provided, then a combo with only this values will be shown, instead of a free text entry. :param search_attribute: Use this if the name of the db column that should be searched is different than the attribute of the model. """ #: overrides the function that generates the query to process the search search_func = gobject.property(type=object, default=None) #: names the search interface differently from the column search_label = gobject.property(type=object, default=None) #: use the query on the *having* part instead of the *where*'s on use_having = gobject.property(type=bool, default=False) #: if we should allow filtering by multiple values multiple_selection = gobject.property(type=bool, default=False) #: the search attribute to use when filtering by this column search_attribute = gobject.property(type=object, default=None) #: valid values to select when filtering by this column valid_values = gobject.property(type=object, default=None) #: long title to use in this column long_title = gobject.property(type=str, default=None) def __init__(self, attribute, title=None, data_type=None, **kwargs): kwargs.setdefault('search_attribute', attribute) Column.__init__(self, attribute, title, data_type, **kwargs) search_func = kwargs.get('search_func') if search_func and not callable(search_func): raise TypeError("search_func must be callable")
[docs] def get_search_label(self): """Get the search label for this column. This is normally used when constructing a search filter for this column. :returns: the search label """ return self.search_label or self.long_title or self.title
[docs]class IdentifierColumn(SearchColumn): """A column for :class:`stoqlib.database.properties.IdentifierCol` This is :class:`stoqlib.gui.search.searchcolumns.SearchColumn`, but with some properties adjusted to properly display identifiers, avoiding lots of code duplication. One can still overwrite some of those properties, but do that only if necessary! We want identifier to look alike everywhere. """ def __init__(self, attribute, title=None, data_type=int, format_func=str, width=80, justify=None, **kwargs): if title is None: title = _(u"#") if justify is None: justify = gtk.JUSTIFY_RIGHT super(IdentifierColumn, self).__init__( attribute=attribute, title=title, data_type=data_type, format_func=format_func, width=width, justify=justify, **kwargs)
[docs]class QuantityColumn(SearchColumn): """A column for product quantities This is :class:`stoqlib.gui.search.searchcolumns.SearchColumn`, but will also display the unit of the product if available in the object """ def __init__(self, attribute, title=None, width=60, **kwargs): super(QuantityColumn, self).__init__(attribute=attribute, title=title, data_type=decimal.Decimal, format_func=self._format_func, format_func_data=True, width=width, justify=gtk.JUSTIFY_RIGHT, **kwargs) def _format_func(self, obj, data): quantity = getattr(obj, self.attribute) or 0 quantity_str = format_quantity(quantity) sellable = getattr(obj, 'sellable', None) product = getattr(obj, 'product', None) # If the product does not manage stock and the quantity is 0, show an # infinite symbol istead if product and not product.manage_stock and not quantity: return u"\u221E" if sellable and sellable.unit: unit_desc = obj.sellable.unit.description elif hasattr(obj, 'unit'): unit_desc = obj.unit or '' else: unit_desc = '' data = '%s %s' % (quantity_str, unit_desc) return data.strip()