[POS-commit] r3949 - in stoqlib/trunk: stoqlib/domain
stoqlib/domain/examples stoqlib/gui/editors
stoqlib/gui/search stoqlib/lib
Henrique Romano
henrique at async.com.br
Thu Jul 20 10:38:02 BRT 2006
Author: henrique
Date: Thu Jul 20 10:38:01 2006
New Revision: 3949
Modified:
stoqlib/trunk/data/glade/BaseSellableCategoryDataSlave.glade
stoqlib/trunk/data/glade/SellableCategoryDataSlave.glade
stoqlib/trunk/stoqlib/domain/examples/product.py
stoqlib/trunk/stoqlib/domain/sellable.py
stoqlib/trunk/stoqlib/gui/editors/category.py
stoqlib/trunk/stoqlib/gui/editors/sellable.py
stoqlib/trunk/stoqlib/gui/search/category.py
stoqlib/trunk/stoqlib/lib/parameters.py
Log:
Fix for bug #2695: Turn SellableCategory and BaseSellableCategory subclasses of AbstractSellableCategory.
r=jdahlin
Modified: stoqlib/trunk/data/glade/BaseSellableCategoryDataSlave.glade
==============================================================================
--- stoqlib/trunk/data/glade/BaseSellableCategoryDataSlave.glade (original)
+++ stoqlib/trunk/data/glade/BaseSellableCategoryDataSlave.glade Thu Jul 20 10:38:01 2006
@@ -1,10 +1,7 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://gazpacho.sicem.biz/gazpacho-0.1.dtd">
<glade-interface domain="stoqlib">
- <requires lib="kiwi"/>
- <requires lib="gtk+"/>
<widget class="GtkWindow" id="BaseSellableCategoryDataSlave">
- <property name="resize_mode">queue</property>
- <property name="type">toplevel</property>
<child>
<widget class="GtkTable" id="table1">
<property name="column_spacing">3</property>
@@ -13,86 +10,81 @@
<property name="row_spacing">5</property>
<property name="visible">True</property>
<child>
- <widget class="kiwi+ui+widgets+entry+Entry" id="description">
- <property name="can_focus">True</property>
- <property name="completion">False</property>
- <property name="data_type">unicode</property>
- <property name="events">button-press-mask | button-release-mask | key-press-mask</property>
- <property name="mandatory">True</property>
- <property name="model_attribute">category_data.description</property>
+ <widget class="GtkLabel" id="label3">
+ <property name="label" context="yes" translatable="yes">Description:</property>
<property name="visible">True</property>
+ <property name="xalign">1.0</property>
</widget>
<packing>
- <property name="left_attach">1</property>
+ <property name="x_options">fill</property>
<property name="y_options">fill</property>
- <property name="right_attach">2</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label4">
+ <widget class="GtkLabel" id="label5">
<property name="justify">right</property>
- <property name="label" translatable="True">Suggested Markup:</property>
- <property name="xalign">1.0</property>
+ <property name="label" context="yes" translatable="yes">Salesperson Commission:</property>
<property name="visible">True</property>
+ <property name="xalign">1.0</property>
</widget>
<packing>
- <property name="bottom_attach">3</property>
- <property name="y_options">fill</property>
+ <property name="bottom_attach">2</property>
+ <property name="top_attach">1</property>
<property name="x_options">fill</property>
- <property name="top_attach">2</property>
+ <property name="y_options">fill</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label5">
+ <widget class="GtkLabel" id="label4">
<property name="justify">right</property>
- <property name="label" translatable="True">Salesperson Commission:</property>
- <property name="xalign">1.0</property>
+ <property name="label" context="yes" translatable="yes">Suggested Markup:</property>
<property name="visible">True</property>
+ <property name="xalign">1.0</property>
</widget>
<packing>
- <property name="bottom_attach">2</property>
- <property name="y_options">fill</property>
+ <property name="bottom_attach">3</property>
+ <property name="top_attach">2</property>
<property name="x_options">fill</property>
- <property name="top_attach">1</property>
+ <property name="y_options">fill</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label3">
- <property name="label" translatable="True">Description:</property>
- <property name="xalign">1.0</property>
+ <widget class="ProxyEntry" id="description">
+ <property name="data_type">unicode</property>
+ <property name="is_focus">True</property>
+ <property name="mandatory">True</property>
+ <property name="model_attribute">description</property>
<property name="visible">True</property>
</widget>
<packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
<property name="y_options">fill</property>
- <property name="x_options">fill</property>
</packing>
</child>
<child>
- <widget class="GtkHBox" id="hbox3">
+ <widget class="GtkHBox" id="hbox2">
<property name="spacing">5</property>
<property name="visible">True</property>
<child>
- <widget class="kiwi+ui+widgets+spinbutton+SpinButton" id="markup">
- <property name="adjustment">0.000000 0.000000 100.000000 1.000000 10.000000 0.000000</property>
- <property name="can_focus">True</property>
+ <widget class="ProxySpinButton" id="commission">
+ <property name="adjustment">0 0 100 1 10 0</property>
<property name="data_type">Decimal</property>
<property name="digits">2</property>
- <property name="events">button-press-mask | button-release-mask | key-press-mask</property>
- <property name="model_attribute">category_data.suggested_markup</property>
- <property name="text">0,00</property>
- <property name="width_chars">7</property>
- <property name="xalign">1.0</property>
+ <property name="model_attribute">salesperson_commission</property>
+ <property name="text" context="yes" translatable="yes">0,00</property>
<property name="visible">True</property>
+ <property name="width_chars">7</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label2">
- <property name="label" translatable="True">%</property>
- <property name="xalign">0.0</property>
+ <widget class="GtkLabel" id="label1">
+ <property name="label" context="yes" translatable="yes">%</property>
<property name="visible">True</property>
+ <property name="xalign">0.0</property>
</widget>
<packing>
<property name="position">1</property>
@@ -100,39 +92,36 @@
</child>
</widget>
<packing>
+ <property name="bottom_attach">2</property>
<property name="left_attach">1</property>
- <property name="bottom_attach">3</property>
- <property name="y_options">fill</property>
- <property name="top_attach">2</property>
<property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="y_options">fill</property>
</packing>
</child>
<child>
- <widget class="GtkHBox" id="hbox2">
+ <widget class="GtkHBox" id="hbox3">
<property name="spacing">5</property>
<property name="visible">True</property>
<child>
- <widget class="kiwi+ui+widgets+spinbutton+SpinButton" id="commission">
- <property name="adjustment">0.000000 0.000000 100.000000 1.000000 10.000000 0.000000</property>
- <property name="can_focus">True</property>
+ <widget class="ProxySpinButton" id="markup">
+ <property name="adjustment">0 0 100 1 10 0</property>
<property name="data_type">Decimal</property>
<property name="digits">2</property>
- <property name="events">button-press-mask | button-release-mask | key-press-mask</property>
- <property name="model_attribute">category_data.salesperson_commission</property>
- <property name="text">0,00</property>
- <property name="width_chars">7</property>
- <property name="xalign">1.0</property>
+ <property name="model_attribute">suggested_markup</property>
+ <property name="text" context="yes" translatable="yes">0,00</property>
<property name="visible">True</property>
+ <property name="width_chars">7</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label1">
- <property name="label" translatable="True">%</property>
- <property name="xalign">0.0</property>
+ <widget class="GtkLabel" id="label2">
+ <property name="label" context="yes" translatable="yes">%</property>
<property name="visible">True</property>
+ <property name="xalign">0.0</property>
</widget>
<packing>
<property name="position">1</property>
@@ -140,11 +129,11 @@
</child>
</widget>
<packing>
+ <property name="bottom_attach">3</property>
<property name="left_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options">fill</property>
- <property name="top_attach">1</property>
<property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="y_options">fill</property>
</packing>
</child>
</widget>
Modified: stoqlib/trunk/data/glade/SellableCategoryDataSlave.glade
==============================================================================
--- stoqlib/trunk/data/glade/SellableCategoryDataSlave.glade (original)
+++ stoqlib/trunk/data/glade/SellableCategoryDataSlave.glade Thu Jul 20 10:38:01 2006
@@ -62,11 +62,11 @@
</packing>
</child>
<child>
- <widget class="kiwi+ui+widgets+entry+Entry" id="description">
+ <widget class="ProxyEntry" id="description">
<property name="data_type">unicode</property>
<property name="is_focus">True</property>
<property name="mandatory">True</property>
- <property name="model_attribute">category_data.description</property>
+ <property name="model_attribute">description</property>
<property name="visible">True</property>
</widget>
<packing>
@@ -76,7 +76,7 @@
</packing>
</child>
<child>
- <widget class="kiwi+ui+widgets+combobox+ComboBoxEntry" id="base_category">
+ <widget class="ProxyComboBoxEntry" id="base_category">
<property name="data_type">object</property>
<property name="mandatory">True</property>
<property name="model_attribute">base_category</property>
@@ -95,16 +95,15 @@
<property name="spacing">5</property>
<property name="visible">True</property>
<child>
- <widget class="kiwi+ui+widgets+spinbutton+SpinButton" id="commission">
+ <widget class="ProxySpinButton" id="commission">
<property name="adjustment">0 0 100 1 10 0</property>
<property name="data_type">Decimal</property>
<property name="digits">2</property>
<property name="is_focus">True</property>
- <property name="model_attribute">category_data.salesperson_commission</property>
- <property name="text" context="yes" translatable="yes">0.00</property>
+ <property name="model_attribute">salesperson_commission</property>
+ <property name="text" context="yes" translatable="yes">0,00</property>
<property name="visible">True</property>
<property name="width_chars">6</property>
- <property name="xalign">1.0</property>
</widget>
<packing>
<property name="expand">False</property>
@@ -134,16 +133,15 @@
<property name="spacing">5</property>
<property name="visible">True</property>
<child>
- <widget class="kiwi+ui+widgets+spinbutton+SpinButton" id="suggested_markup">
+ <widget class="ProxySpinButton" id="suggested_markup">
<property name="adjustment">0 0 100 1 10 0</property>
<property name="data_type">Decimal</property>
<property name="digits">2</property>
<property name="is_focus">True</property>
- <property name="model_attribute">category_data.suggested_markup</property>
- <property name="text" context="yes" translatable="yes">0.00</property>
+ <property name="model_attribute">suggested_markup</property>
+ <property name="text" context="yes" translatable="yes">0,00</property>
<property name="visible">True</property>
<property name="width_chars">6</property>
- <property name="xalign">1.0</property>
</widget>
<packing>
<property name="expand">False</property>
Modified: stoqlib/trunk/stoqlib/domain/examples/product.py
==============================================================================
--- stoqlib/trunk/stoqlib/domain/examples/product.py (original)
+++ stoqlib/trunk/stoqlib/domain/examples/product.py Thu Jul 20 10:38:01 2006
@@ -36,8 +36,8 @@
from stoqlib.domain.interfaces import ISellable, IStorable, ISupplier
from stoqlib.domain.sellable import (BaseSellableCategory,
SellableCategory,
- AbstractSellableCategory,
- BaseSellableInfo, SellableUnit)
+ SellableUnit,
+ BaseSellableInfo)
from stoqlib.lib.runtime import new_transaction, print_msg
@@ -99,24 +99,18 @@
base_cat_desc = base_category_data[index]
commission, markup = get_commission_and_markup()
- table = AbstractSellableCategory
- abstract_data = table(connection=conn, suggested_markup=markup,
- salesperson_commission=commission,
- description=base_cat_desc)
-
- base_cat = BaseSellableCategory(connection=conn,
- category_data=abstract_data)
+ base_cat = BaseSellableCategory(suggested_markup=markup,
+ salesperson_commission=commission,
+ description=base_cat_desc,
+ connection=conn)
cat_desc = category_data[index]
commission, markup = get_commission_and_markup()
- table = AbstractSellableCategory
- abstract_data = table(connection=conn, description=cat_desc,
- salesperson_commission=commission,
- suggested_markup=markup)
-
- cat = SellableCategory(connection=conn,
+ cat = SellableCategory(description=cat_desc,
+ salesperson_commission=commission,
+ suggested_markup=markup,
base_category=base_cat,
- category_data=abstract_data)
+ connection=conn)
description = descriptions[index]
price = random.randrange(*PRICE_RANGE)
Modified: stoqlib/trunk/stoqlib/domain/sellable.py
==============================================================================
--- stoqlib/trunk/stoqlib/domain/sellable.py (original)
+++ stoqlib/trunk/stoqlib/domain/sellable.py Thu Jul 20 10:38:01 2006
@@ -64,51 +64,35 @@
description = UnicodeCol()
index = IntCol()
-class AbstractSellableCategory(Domain):
+class AbstractSellableCategory(InheritableModel):
description = UnicodeCol()
suggested_markup = DecimalCol(default=0)
-
# A percentage commission suggested for all the sales which products
# belongs to this category or base category
salesperson_commission = DecimalCol(default=0)
- def get_commission(self):
- return self.salesperson_commission
-
-
-class BaseSellableCategory(Domain):
- category_data = ForeignKey('AbstractSellableCategory')
-
implements(IDescribable)
def get_commission(self):
- return self.category_data.get_commission()
-
- #
- # IDescribable implementation
- #
+ return self.salesperson_commission
def get_description(self):
- return self.category_data.description
+ return self.description
+class BaseSellableCategory(AbstractSellableCategory):
+ pass
-class SellableCategory(Domain):
- category_data = ForeignKey('AbstractSellableCategory')
+class SellableCategory(AbstractSellableCategory):
base_category = ForeignKey('BaseSellableCategory')
implements(IDescribable)
def get_markup(self):
- return (self.category_data.suggested_markup or
- self.base_category.category_data.suggested_markup)
-
- def get_commission(self):
- return self.category_data.get_commission()
-
- def get_description(self):
- return "%s %s" % (self.base_category.get_description(),
- self.category_data.description)
+ return self.suggested_markup or self.base_category.suggested_markup
+ def get_full_description(self):
+ return ("%s %s"
+ % (self.base_category.get_description(), self.description))
class AbstractSellableItem(InheritableModel):
"""Abstract representation of a concrete sellable."""
Modified: stoqlib/trunk/stoqlib/gui/editors/category.py
==============================================================================
--- stoqlib/trunk/stoqlib/gui/editors/category.py (original)
+++ stoqlib/trunk/stoqlib/gui/editors/category.py Thu Jul 20 10:38:01 2006
@@ -27,13 +27,10 @@
from stoqlib.gui.base.editors import BaseEditor
from stoqlib.lib.parameters import sysparam
-from stoqlib.domain.sellable import (AbstractSellableCategory,
- BaseSellableCategory,
- SellableCategory)
+from stoqlib.domain.sellable import BaseSellableCategory, SellableCategory
_ = stoqlib_gettext
-
class BaseSellableCategoryEditor(BaseEditor):
gladefile = 'BaseSellableCategoryDataSlave'
model_type = BaseSellableCategory
@@ -44,10 +41,7 @@
size = (400, 175)
def create_model(self, conn):
- category_data = AbstractSellableCategory(description='',
- connection=conn)
- return BaseSellableCategory(category_data=category_data,
- connection=conn)
+ return BaseSellableCategory(description=u"", connection=conn)
def get_title_model_attribute(self, model):
return model.get_description()
@@ -56,7 +50,6 @@
self.add_proxy(model=self.model,
widgets=BaseSellableCategoryEditor.proxy_widgets)
-
class SellableCategoryEditor(BaseEditor):
gladefile = 'SellableCategoryDataSlave'
model_type = SellableCategory
@@ -67,21 +60,17 @@
'commission')
def create_model(self, conn):
- category_data = AbstractSellableCategory(description='',
- connection=conn)
-
- suggested_base_cat = sysparam(conn).DEFAULT_BASE_CATEGORY
- return SellableCategory(base_category=suggested_base_cat,
- category_data=category_data,
- connection=conn)
+ return SellableCategory(
+ description=u"", base_category=sysparam(conn).DEFAULT_BASE_CATEGORY,
+ connection=conn)
def get_title_model_attribute(self, model):
return model.get_description()
def setup_combo(self):
base_category_list = BaseSellableCategory.select(connection=self.conn)
- items = [(base_cat.category_data.description, base_cat)
- for base_cat in base_category_list]
+ items = [(base_cat.description, base_cat)
+ for base_cat in base_category_list]
self.base_category.prefill(items)
def setup_proxies(self):
Modified: stoqlib/trunk/stoqlib/gui/editors/sellable.py
==============================================================================
--- stoqlib/trunk/stoqlib/gui/editors/sellable.py (original)
+++ stoqlib/trunk/stoqlib/gui/editors/sellable.py Thu Jul 20 10:38:01 2006
@@ -241,7 +241,7 @@
def setup_combos(self):
category_list = SellableCategory.select(connection=self.conn)
- items = [(cat.get_description(), cat) for cat in category_list]
+ items = [(cat.get_full_description(), cat) for cat in category_list]
self.category_combo.prefill(items)
query = SellableUnit.q.index != UNIT_CUSTOM
primitive_units = SellableUnit.select(query, connection=self.conn)
Modified: stoqlib/trunk/stoqlib/gui/search/category.py
==============================================================================
--- stoqlib/trunk/stoqlib/gui/search/category.py (original)
+++ stoqlib/trunk/stoqlib/gui/search/category.py Thu Jul 20 10:38:01 2006
@@ -28,10 +28,11 @@
import sets
-from sqlobject.sqlbuilder import INNERJOINOn
+from kiwi.ui.objectlist import Column
+
from stoqlib.lib.translation import stoqlib_gettext
from stoqlib.gui.base.search import SearchEditor
-from stoqlib.gui.base.columns import ForeignKeyColumn
+from stoqlib.gui.base.columns import AccessorColumn
from stoqlib.gui.editors.category import (BaseSellableCategoryEditor,
SellableCategoryEditor)
from stoqlib.domain.sellable import (AbstractSellableCategory,
@@ -40,84 +41,66 @@
_ = stoqlib_gettext
-
class BaseSellableCatSearch(SearchEditor):
size = (700, 500)
title = _('Base Sellable Category Search')
- table = BaseSellableCategory
- editor_class = BaseSellableCategoryEditor
def __init__(self, conn):
- SearchEditor.__init__(self, conn, self.table, self.editor_class)
+ SearchEditor.__init__(self, conn, BaseSellableCategory,
+ BaseSellableCategoryEditor)
self.set_searchbar_labels(_('Base Categories Matching:'))
self.set_result_strings(_('base category'), _('base categories'))
def get_columns(self):
- return [ForeignKeyColumn(AbstractSellableCategory,
- 'description', _('Description'), str,
- obj_field='category_data', sorted=True,
- expand=True),
- ForeignKeyColumn(AbstractSellableCategory,
- 'suggested_markup', _('Suggested Markup (%)'),
- float, obj_field='category_data', width=180),
- ForeignKeyColumn(AbstractSellableCategory,
- 'salesperson_commission',
- _('Suggested Commission (%)'),
- float, obj_field='category_data')]
-
- def get_query_args(self):
- return dict(join=INNERJOINOn(BaseSellableCategory,
- AbstractSellableCategory,
- AbstractSellableCategory.q.id==
- BaseSellableCategory.q.category_dataID))
-
+ return [Column("description", _("Description"), data_type=str,
+ sorted=True, expand=True),
+ Column("suggested_markup", _("Suggested Markup (%)"),
+ data_type=float, width=200),
+ Column("salesperson_commission",
+ _("Salesperson Commission (%)"), data_type=float,
+ width=200),
+ ]
class SellableCatSearch(SearchEditor):
size = (700, 500)
title = _('Sellable Category Search')
def __init__(self, conn):
- editor = SellableCategoryEditor
- SearchEditor.__init__(self, conn, AbstractSellableCategory, editor)
+ # I'm using AbstractSellableCategory here because I want to be able of
+ # to search in sellable category *and* its base category data as well.
+ SearchEditor.__init__(self, conn, AbstractSellableCategory,
+ SellableCategoryEditor)
self.set_result_strings(_('category'), _('categories'))
self.set_searchbar_labels(_('Categories Matching:'))
- #
- # Hooks
- #
-
def get_columns(self):
- return [ForeignKeyColumn(AbstractSellableCategory,
- 'description',
- _('Base Category'), str,
- obj_field='base_category.category_data',
- sorted=True, width=210),
- ForeignKeyColumn(AbstractSellableCategory,
- 'description', _('Description'), str,
- obj_field='category_data', expand=True),
- ForeignKeyColumn(AbstractSellableCategory,
- 'suggested_markup',
- _('Suggested Markup (%)'), str,
- obj_field='category_data', width=170),
- ForeignKeyColumn(AbstractSellableCategory,
- 'salesperson_commission',
- _('Suggested Commission (%)'), str,
- obj_field='category_data', )]
+ return [AccessorColumn("description",
+ SellableCategory.get_full_description,
+ title=_('Description'), data_type=str,
+ expand=True),
+ Column("suggested_markup", _("Suggested Markup (%)"),
+ data_type=str, width=170),
+ Column("salesperson_comission",
+ _("Suggested Commission (%)"), data_type=str,
+ width=190),
+ ]
def filter_results(self, abstract_objects):
sellable_objs = SellableCategory.select(connection=self.conn)
base_ids = sets.Set([s.base_category.id for s in sellable_objs])
+ # Discard all base categories that aren't used.
base_objs = BaseSellableCategory.select(connection=self.conn)
- reject = sets.Set([b.id for b in base_objs])
+ reject = sets.Set([base.id for base in base_objs])
reject = reject - (reject & base_ids)
+ # Discard all base categories that doesn't match the search criteria
abstract_ids = sets.Set([a.id for a in abstract_objects])
abstract_ids = abstract_ids - (abstract_ids & reject)
return [s for s in sellable_objs
- if (s.category_data.id in abstract_ids
- or s.base_category.category_data.id in abstract_ids)]
+ if (s.id in abstract_ids
+ or s.base_category.id in abstract_ids)]
# XXX: I need to overwrite SearchEditor's get_searchlist_model because
# its search_table differs from the objects in the Kiwi list -- but we
Modified: stoqlib/trunk/stoqlib/lib/parameters.py
==============================================================================
--- stoqlib/trunk/stoqlib/lib/parameters.py (original)
+++ stoqlib/trunk/stoqlib/lib/parameters.py Thu Jul 20 10:38:01 2006
@@ -505,16 +505,13 @@
self._set_schema(key, supplier.id)
def ensure_default_base_category(self):
- from stoqlib.domain.sellable import (BaseSellableCategory,
- AbstractSellableCategory)
+ from stoqlib.domain.sellable import BaseSellableCategory
key = "DEFAULT_BASE_CATEGORY"
if self.get_parameter_by_field(key, BaseSellableCategory):
return
- abstract_cat = AbstractSellableCategory(connection=self.conn,
- description=key)
- base_cat = BaseSellableCategory(connection=self.conn,
- category_data=abstract_cat)
- self._set_schema(key, base_cat.id)
+ base_category = BaseSellableCategory(description=key,
+ connection=self.conn)
+ self._set_schema(key, base_category.id)
def ensure_default_salesperson_role(self):
from stoqlib.domain.person import EmployeeRole
More information about the POS-commit
mailing list