[Erp5-report] r25611 - in /erp5/trunk/products/ERP5: Document/ PropertySheet/
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Feb 18 18:31:02 CET 2009
Author: jerome
Date: Wed Feb 18 18:31:00 2009
New Revision: 25611
URL: http://svn.erp5.org?rev=25611&view=rev
Log:
Simplify budget model variations, only 2 simple class are used:
- NodeBudgetVariation that explicitly lists the possible values one by one,
either by selecting them of specifying a script to return this list of
values
- CategoryBudgetVariation that uses a base category
for each one, you specify what will be the "axis" used for getInventory (node,
mirror_node, node_category etc)
"SectionCategoryBudgetVariation" is therefore useless, it's a
CategoryBudgetVariation where the axis is "section_category"
Budget Cell, Budget Line and now Budget itself can be variated
Added:
erp5/trunk/products/ERP5/Document/CategoryBudgetVariation.py
Removed:
erp5/trunk/products/ERP5/Document/SectionCategoryBudgetVariation.py
Modified:
erp5/trunk/products/ERP5/Document/Budget.py
erp5/trunk/products/ERP5/Document/BudgetModel.py
erp5/trunk/products/ERP5/Document/BudgetVariation.py
erp5/trunk/products/ERP5/Document/NodeBudgetVariation.py
erp5/trunk/products/ERP5/PropertySheet/BudgetVariation.py
Modified: erp5/trunk/products/ERP5/Document/Budget.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Budget.py?rev=25611&r1=25610&r2=25611&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Budget.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/Budget.py [utf8] Wed Feb 18 18:31:00 2009
@@ -31,12 +31,13 @@
from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
from Products.ERP5.Document.Predicate import Predicate
+from Products.ERP5.Variated import Variated
from Products.ERP5.Document.Delivery import Delivery
from Products.ERP5.Document.Inventory import Inventory
from zLOG import LOG
-class Budget(Predicate):
+class Budget(Predicate, Variated):
"""
Budget means a kind of budget stock.
"""
@@ -52,6 +53,7 @@
, PropertySheet.Arrow
, PropertySheet.Budget
, PropertySheet.Path
+ , PropertySheet.VariationRange
)
# CMF Type Definition
Modified: erp5/trunk/products/ERP5/Document/BudgetModel.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BudgetModel.py?rev=25611&r1=25610&r2=25611&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/BudgetModel.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/BudgetModel.py [utf8] Wed Feb 18 18:31:00 2009
@@ -65,7 +65,7 @@
for budget_variation in sorted(self.contentValues(
portal_type=self.getPortalBudgetVariationTypeList(),),
key=lambda x:x.getIntIndex()):
- if not budget_variation.isMemberOf('budget_variation/cell'):
+ if not budget_variation.isMemberOf('budget_variation/budget_cell'):
continue
variation_cell_range = budget_variation.getCellRangeForBudgetLine(
budget_line, matrixbox=matrixbox)
@@ -107,8 +107,24 @@
for budget_variation in sorted(self.contentValues(
portal_type=self.getPortalBudgetVariationTypeList()),
key=lambda x:x.getIntIndex()):
+ if budget_variation.isMemberOf('budget_variation/budget'):
+ continue
variation_range = \
budget_variation.getBudgetLineVariationRangeCategoryList(budget_line)
+ if variation_range and variation_range not in\
+ variation_range_category_list:
+ variation_range_category_list.extend(variation_range)
+ return variation_range_category_list
+
+ def getBudgetVariationRangeCategoryList(self, budget):
+ variation_range_category_list = []
+ for budget_variation in sorted(self.contentValues(
+ portal_type=self.getPortalBudgetVariationTypeList()),
+ key=lambda x:x.getIntIndex()):
+ if not budget_variation.isMemberOf('budget_variation/budget'):
+ continue
+ variation_range = \
+ budget_variation.getBudgetVariationRangeCategoryList(budget)
if variation_range and variation_range not in\
variation_range_category_list:
variation_range_category_list.extend(variation_range)
@@ -118,5 +134,13 @@
for budget_variation in sorted(self.contentValues(
portal_type=self.getPortalBudgetVariationTypeList()),
key=lambda x:x.getIntIndex()):
- budget_variation.initializeBudgetLine(budget_line)
+ if not budget_variation.isMemberOf('budget_variation/budget'):
+ budget_variation.initializeBudgetLine(budget_line)
+ def initializeBudget(self, budget):
+ for budget_variation in sorted(self.contentValues(
+ portal_type=self.getPortalBudgetVariationTypeList()),
+ key=lambda x:x.getIntIndex()):
+ if budget_variation.isMemberOf('budget_variation/budget'):
+ budget_variation.initializeBudget(budget)
+
Modified: erp5/trunk/products/ERP5/Document/BudgetVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BudgetVariation.py?rev=25611&r1=25610&r2=25611&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/BudgetVariation.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/BudgetVariation.py [utf8] Wed Feb 18 18:31:00 2009
@@ -37,6 +37,7 @@
class BudgetVariation(Predicate):
"""Base class for budget variations.
+
"""
# Default Properties
@@ -65,7 +66,15 @@
"""
def initializeBudgetLine(self, budget_line):
- """Initialize a budget line
+ """Initialize a budget line.
+
+ Called when a new budget line is created.
+ """
+
+ def initializeBudget(self, budget):
+ """Initialize a budget.
+
+ Called when a budget is associated to a budget model.
"""
def getBudgetLineVariationRangeCategoryList(self, budget_line):
@@ -73,8 +82,13 @@
"""
return []
+ def getBudgetVariationRangeCategoryList(self, budget):
+ """Returns the variation range categories for this budget
+ """
+ return []
+
def getCellRangeForBudgetLine(self, budget_line, matrixbox=0):
- """Return the cell range to use for the budget.
+ """Return the cell range to use for the budget line
"""
return []
Added: erp5/trunk/products/ERP5/Document/CategoryBudgetVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/CategoryBudgetVariation.py?rev=25611&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/Document/CategoryBudgetVariation.py (added)
+++ erp5/trunk/products/ERP5/Document/CategoryBudgetVariation.py [utf8] Wed Feb 18 18:31:00 2009
@@ -1,0 +1,164 @@
+##############################################################################
+#
+# Copyright (c) 2008 Nexedi SA and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+from AccessControl import ClassSecurityInfo
+
+from AccessControl.ZopeGuards import guarded_getattr
+from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
+from Products.ERP5.Document.BudgetVariation import BudgetVariation
+
+
+class CategoryBudgetVariation(BudgetVariation):
+ """ A budget variation based on a category
+ """
+ # Default Properties
+ property_sheets = ( PropertySheet.Base
+ , PropertySheet.XMLObject
+ , PropertySheet.SimpleItem
+ , PropertySheet.SortIndex
+ , PropertySheet.Path
+ , PropertySheet.Predicate
+ , PropertySheet.BudgetVariation
+ )
+
+ # CMF Type Definition
+ meta_type = 'ERP5 Category Budget Variation'
+ portal_type = 'Category Budget Variation'
+ add_permission = Permissions.AddPortalContent
+ isPortalContent = 1
+ isRADContent = 1
+
+ # Declarative security
+ security = ClassSecurityInfo()
+ security.declareObjectProtected(Permissions.AccessContentsInformation)
+
+ # __implements__ = (BudgetVariation, )
+
+ def asBudgetPredicate(self):
+ """This budget variation in a predicate
+ """
+
+ def getCellRangeForBudgetLine(self, budget_line, matrixbox=0):
+ """The cell range added by this variation
+ """
+ item_list = self.getBudgetLineVariationRangeCategoryList(budget_line)
+ variation_category_list = budget_line.getVariationCategoryList()
+ if matrixbox:
+ return [[(i[1], i[0]) for i in item_list if i[1] in variation_category_list]]
+ return [[i[1] for i in item_list if i[1] in variation_category_list]]
+
+ def getInventoryQueryDict(self, budget_cell):
+ """ Query dict to pass to simulation query
+ """
+ if not self.getInventoryAxis():
+ return dict()
+ base_category = self.getProperty('variation_base_category')
+ if not base_category:
+ return dict()
+ # XXX pass base_category= ...
+ for criterion_category in budget_cell.getMembershipCriterionCategoryList():
+ if '/' not in criterion_category: # safe ...
+ continue
+ criterion_base_category, category_url = criterion_category.split('/', 1)
+
+ # Different possible inventory axis here
+ axis = self.getInventoryAxis()
+ if axis == 'movement':
+ return {'default_%s_uid' % base_category:
+ self.getPortalObject().portal_categories.getCategoryUid(criterion_category)}
+
+ if criterion_base_category == base_category:
+ return {axis: criterion_category}
+ return dict()
+
+ def getBudgetVariationRangeCategoryList(self, context):
+ """Returns the Variation Range Category List that can be applied to this
+ budget.
+ """
+ base_category = self.getProperty('variation_base_category')
+ if not base_category:
+ return []
+
+ portal = self.getPortalObject()
+ item_list_method = portal.portal_preferences.getPreference(
+ 'preferred_category_child_item_list_method_id',
+ 'getCategoryChildCompactLogicalPathItemList')
+
+ return getattr(portal.portal_categories._getOb(base_category),
+ item_list_method)(
+ base=1,
+ local_sort_id=('int_index',
+ 'translated_title'),
+ checked_permission='View')
+
+
+ def getBudgetLineVariationRangeCategoryList(self, budget_line):
+ """Returns the Variation Range Category List that can be applied to this
+ budget line.
+ """
+ base_category = self.getProperty('variation_base_category')
+ if not base_category:
+ return []
+
+ portal = self.getPortalObject()
+ item_list_method = portal.portal_preferences.getPreference(
+ 'preferred_category_child_item_list_method_id',
+ 'getCategoryChildCompactLogicalPathItemList')
+
+ # If this category is defined on budget level, only show subcategories.
+ budget = budget_line.getParentValue()
+ if base_category in budget.getVariationBaseCategoryList():
+ for budget_variation_category in budget.getVariationCategoryList():
+ if budget_variation_category.split('/')[0] == base_category:
+ base_category = budget_variation_category
+ break
+
+ return getattr(portal.portal_categories.unrestrictedTraverse(base_category),
+ item_list_method)(
+ base=1,
+ local_sort_id=('int_index',
+ 'translated_title'),
+ checked_permission='View')
+
+ def initializeBudgetLine(self, budget_line):
+ """Initialize a budget line
+ """
+ budget_line_variation_category_list =\
+ list(budget_line.getVariationBaseCategoryList() or [])
+ base_category = self.getProperty('variation_base_category')
+ if base_category:
+ budget_line_variation_category_list.append(base_category)
+ budget_line.setVariationBaseCategoryList(
+ budget_line_variation_category_list)
+
+ def initializeBudget(self, budget):
+ """Initialize a budget.
+ """
+ # same as budget line
+ return self.initializeBudgetLine(budget)
+
+
Modified: erp5/trunk/products/ERP5/Document/NodeBudgetVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/NodeBudgetVariation.py?rev=25611&r1=25610&r2=25611&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/NodeBudgetVariation.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/NodeBudgetVariation.py [utf8] Wed Feb 18 18:31:00 2009
@@ -34,6 +34,9 @@
class NodeBudgetVariation(BudgetVariation):
""" A budget variation for node
+
+ A script will return the list of possible nodes, or they will be configured
+ explicitly on the budget variation.
"""
# Default Properties
property_sheets = ( PropertySheet.Base
@@ -42,6 +45,7 @@
, PropertySheet.SortIndex
, PropertySheet.Path
, PropertySheet.Predicate
+ , PropertySheet.BudgetVariation
)
# CMF Type Definition
@@ -67,7 +71,8 @@
node_select_method_id = self.getProperty('node_select_method_id')
if node_select_method_id:
return guarded_getattr(context, node_select_method_id)()
- return ()
+ # no script defined, used the explicitly selected values
+ return self.getAggregateValueList()
def _getNodeTitle(self, node):
"""Returns the title of a node
@@ -94,17 +99,26 @@
def getInventoryQueryDict(self, budget_cell):
""" Query dict to pass to simulation query
"""
+ if not self.getInventoryAxis():
+ return dict()
base_category = self.getProperty('variation_base_category')
if not base_category:
return dict()
+ # TODO: pass base_category_list instead of stupidly iterating !
for criterion_category in budget_cell.getMembershipCriterionCategoryList():
if '/' not in criterion_category: # safe ...
continue
criterion_base_category, node_url = criterion_category.split('/', 1)
if criterion_base_category == base_category:
- return dict(
- node_uid=self.getPortalObject().unrestrictedTraverse(node_url).getUid())
+ axis = self.getInventoryAxis()
+ if axis == 'movement':
+ axis = 'default_%s' % base_category
+ axis = '%s_uid' % axis
+ return {axis:
+ self.getPortalObject().unrestrictedTraverse(node_url).getUid()}
+
return dict()
+
def getBudgetLineVariationRangeCategoryList(self, budget_line):
"""Returns the Variation Range Category List that can be applied to this
@@ -117,6 +131,17 @@
return [(self._getNodeTitle(node), '%s%s' % (prefix, node.getRelativeUrl()))
for node in self._getNodeList(budget_line)]
+ def getBudgetVariationRangeCategoryList(self, budget):
+ """Returns the Variation Range Category Listhat can be applied to this
+ budget.
+ """
+ base_category = self.getProperty('variation_base_category')
+ prefix = ''
+ if base_category:
+ prefix = '%s/' % base_category
+ return [(self._getNodeTitle(node), '%s%s' % (prefix, node.getRelativeUrl()))
+ for node in self._getNodeList(budget)]
+
def initializeBudgetLine(self, budget_line):
"""Initialize a budget line
"""
@@ -128,3 +153,10 @@
budget_line.setVariationBaseCategoryList(
budget_line_variation_category_list)
+ def initializeBudget(self, budget):
+ """Initialize a budget.
+ """
+ # same as budget line
+ return self.initializeBudgetLine(budget)
+
+
Removed: erp5/trunk/products/ERP5/Document/SectionCategoryBudgetVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/SectionCategoryBudgetVariation.py?rev=25610&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/Document/SectionCategoryBudgetVariation.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/SectionCategoryBudgetVariation.py (removed)
@@ -1,127 +1,0 @@
-##############################################################################
-#
-# Copyright (c) 2008 Nexedi SA and Contributors. All Rights Reserved.
-#
-# WARNING: This program as such is intended to be used by professional
-# programmers who take the whole responsability of assessing all potential
-# consequences resulting from its eventual inadequacies and bugs
-# End users who are looking for a ready-to-use solution with commercial
-# garantees and support are strongly adviced to contract a Free Software
-# Service Company
-#
-# This program is Free Software; you can redistribute it and/or
-# modify it under the terms of the GNU 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-##############################################################################
-
-from AccessControl import ClassSecurityInfo
-
-from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
-from Products.ERP5.Document.BudgetVariation import BudgetVariation
-
-
-class SectionCategoryBudgetVariation(BudgetVariation):
- """A budget variation for section category.
- """
- # Default Properties
- property_sheets = ( PropertySheet.Base
- , PropertySheet.XMLObject
- , PropertySheet.SimpleItem
- , PropertySheet.SortIndex
- , PropertySheet.Path
- , PropertySheet.Predicate
- )
-
- # CMF Type Definition
- meta_type = 'ERP5 Section Category Budget Variation'
- portal_type = 'Section Category Budget Variation'
- add_permission = Permissions.AddPortalContent
- isPortalContent = 1
- isRADContent = 1
-
- # Declarative security
- security = ClassSecurityInfo()
- security.declareObjectProtected(Permissions.AccessContentsInformation)
-
- # __implements__ = (BudgetVariation, )
-
- def asBudgetPredicate(self):
- """This budget variation in a predicate
- """
-
- def getCellRangeForBudgetLine(self, budget_line, matrixbox=0):
- """The cell range added by this variation
- """
- portal = self.getPortalObject()
- resolveCategory = portal.portal_categories.resolveCategory
-
- cell_range_dict = dict()
- for variation_base_category in \
- self.getProperty('variation_base_category_list'):
- for category in budget_line.getVariationCategoryList():
- if category.startswith(variation_base_category):
- if matrixbox:
- cell_range_dict.setdefault(
- variation_base_category, []).append(
- (category,
- resolveCategory(category).getTranslatedLogicalPath(),))
- else:
- cell_range_dict.setdefault(
- variation_base_category, []).append(category)
-
- return cell_range_dict.values()
-
- def getInventoryQueryDict(self, budget_cell):
- """ Query dict to pass to simulation query
- """
- section_category_list = []
- for variation_base_category in \
- self.getProperty('variation_base_category_list'):
- for category in budget_cell.getMembershipCriterionCategoryList():
- if category.startswith(variation_base_category):
- section_category_list.append(category)
-
- # FIXME: this should be a AND, but passing this to inventory API:
- # section_category=dict(query=section_category_list,
- # operator='AND')
- # just generates an impossible query
- return dict(section_category=section_category_list)
-
- def getBudgetLineVariationRangeCategoryList(self, budget_line):
- portal = self.getPortalObject()
- variation_range_category_list = []
- category_tool = portal.portal_categories
- item_list_method_id = portal.portal_preferences\
- .getPreferredCategoryChildItemListMethodId()
- for variation_base_category in \
- self.getProperty('variation_base_category_list'):
- if variation_base_category in category_tool.objectIds():
- base_category = category_tool._getOb(variation_base_category)
- variation_range_category_list.extend(
- getattr(base_category, item_list_method_id)(base=1))
- return variation_range_category_list
-
- def initializeBudgetLine(self, budget_line):
- """Initialize a budget line
- """
- budget_line_variation_category_list =\
- list(budget_line.getVariationBaseCategoryList() or [])
- for variation_base_category in \
- self.getProperty('variation_base_category_list'):
- if variation_base_category not in budget_line_variation_category_list:
- budget_line_variation_category_list.append(variation_base_category)
- budget_line.setVariationBaseCategoryList(
- budget_line_variation_category_list)
-
-
Modified: erp5/trunk/products/ERP5/PropertySheet/BudgetVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/PropertySheet/BudgetVariation.py?rev=25611&r1=25610&r2=25611&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/PropertySheet/BudgetVariation.py [utf8] (original)
+++ erp5/trunk/products/ERP5/PropertySheet/BudgetVariation.py [utf8] Wed Feb 18 18:31:00 2009
@@ -1,6 +1,6 @@
##############################################################################
#
-# Copyright (c) 2005 Nexedi SARL and Contributors. All Rights Reserved.
+# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
@@ -30,4 +30,4 @@
Budget variation properties
"""
- _categories = ( 'budget_variation', )
+ _categories = ( 'inventory_axis', 'budget_variation')
More information about the Erp5-report
mailing list