[Erp5-report] r25042 - /erp5/trunk/products/ERP5/Document/
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Jan 8 11:59:07 CET 2009
Author: jerome
Date: Thu Jan 8 11:59:06 2009
New Revision: 25042
URL: http://svn.erp5.org?rev=25042&view=rev
Log:
new classes for budget models and budget variations
Added:
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/Document/SectionCategoryBudgetVariation.py
Added: erp5/trunk/products/ERP5/Document/BudgetModel.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BudgetModel.py?rev=25042&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/Document/BudgetModel.py (added)
+++ erp5/trunk/products/ERP5/Document/BudgetModel.py [utf8] Thu Jan 8 11:59:06 2009
@@ -1,0 +1,121 @@
+##############################################################################
+#
+# 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.Predicate import Predicate
+
+class BudgetModel(Predicate):
+ """A model of budget, with all budget variation
+ """
+
+ # Default Properties
+ property_sheets = ( PropertySheet.Base
+ , PropertySheet.XMLObject
+ , PropertySheet.SimpleItem
+ , PropertySheet.Folder
+ , PropertySheet.Predicate
+ , PropertySheet.SortIndex
+ , PropertySheet.Task
+ , PropertySheet.Arrow
+ , PropertySheet.Budget
+ , PropertySheet.Path
+ )
+
+ # CMF Type Definition
+ meta_type = 'ERP5 Budget Model'
+ portal_type = 'Budget Model'
+ add_permission = Permissions.AddPortalContent
+ isPortalContent = 1
+ isRADContent = 1
+
+ # Declarative security
+ security = ClassSecurityInfo()
+ security.declareObjectProtected(Permissions.AccessContentsInformation)
+
+ def getCellRangeForBudgetLine(self, budget_line, matrixbox=0):
+ """Return the cell range to use for the budget.
+ """
+ cell_range = []
+ for budget_variation in sorted(self.contentValues(
+ portal_type=self.getPortalBudgetVariationTypeList(),),
+ key=lambda x:x.getIntIndex()):
+ if not budget_variation.isMemberOf('budget_variation/cell'):
+ continue
+ variation_cell_range = budget_variation.getCellRangeForBudgetLine(
+ budget_line, matrixbox=matrixbox)
+ print budget_variation, variation_cell_range
+ if variation_cell_range and variation_cell_range not in cell_range:
+ cell_range.extend(variation_cell_range)
+ return cell_range
+
+ def getInventoryQueryDict(self, budget_cell):
+ """Returns the query dict to pass to simulation query
+ """
+ query_dict = dict()
+ for budget_variation in sorted(self.contentValues(
+ portal_type=self.getPortalBudgetVariationTypeList()),
+ key=lambda x:x.getIntIndex()):
+ query_dict.update(
+ budget_variation.getInventoryQueryDict(budget_cell))
+ return query_dict
+
+ def asBudgetPredicate(self):
+ " "
+ # XXX predicate for line / cell ?
+
+
+ def getBudgetConsumptionMethod(self, budget_cell):
+ # XXX return the method, or compute directly ?
+ budget_consumption_method = None
+ for budget_variation in sorted(self.contentValues(
+ portal_type=self.getPortalBudgetVariationTypeList()),
+ key=lambda x:x.getIntIndex()):
+ if budget_variation.getBudgetConsumptionMethod(budget_cell):
+ budget_consumption_method = \
+ budget_variation.getBudgetConsumptionMethod(budget_cell)
+ return budget_consumption_method
+
+ def getBudgetLineVariationRangeCategoryList(self, budget_line):
+ variation_range_category_list = []
+ for budget_variation in sorted(self.contentValues(
+ portal_type=self.getPortalBudgetVariationTypeList()),
+ key=lambda x:x.getIntIndex()):
+ 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 initializeBudgetLine(self, budget_line):
+ for budget_variation in sorted(self.contentValues(
+ portal_type=self.getPortalBudgetVariationTypeList()),
+ key=lambda x:x.getIntIndex()):
+ budget_variation.initializeBudgetLine(budget_line)
+
Added: erp5/trunk/products/ERP5/Document/BudgetVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BudgetVariation.py?rev=25042&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/Document/BudgetVariation.py (added)
+++ erp5/trunk/products/ERP5/Document/BudgetVariation.py [utf8] Thu Jan 8 11:59:06 2009
@@ -1,0 +1,85 @@
+##############################################################################
+#
+# 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.Predicate import Predicate
+
+from Products.ERP5.Document.Delivery import Delivery
+from Products.ERP5.Document.Inventory import Inventory
+
+from zLOG import LOG
+
+class BudgetVariation(Predicate):
+ """Base class for budget variations.
+ """
+
+ # Default Properties
+ property_sheets = ( PropertySheet.Base
+ , PropertySheet.XMLObject
+ , PropertySheet.SimpleItem
+ , PropertySheet.SortIndex
+ , PropertySheet.Path
+ , PropertySheet.Predicate
+ , PropertySheet.BudgetVariation
+ )
+
+ # CMF Type Definition
+ meta_type='ERP5 Budget Variation'
+ portal_type='Budget Variation'
+ add_permission = Permissions.AddPortalContent
+ isPortalContent = 1
+ isRADContent = 1
+
+ # Declarative security
+ security = ClassSecurityInfo()
+ security.declareObjectProtected(Permissions.AccessContentsInformation)
+
+ def asBudgetPredicate(self):
+ """This budget variation in a predicate
+ """
+
+ def initializeBudgetLine(self, budget_line):
+ """Initialize a budget line
+ """
+
+ def getBudgetLineVariationRangeCategoryList(self, budget_line):
+ """Returns the variation range categories for this budget line
+ """
+ return []
+
+ def getCellRangeForBudgetLine(self, budget_line, matrixbox=0):
+ """Return the cell range to use for the budget.
+ """
+ return []
+
+ def getInventoryQueryDict(self, budget_cell):
+ """Returns the query dict to pass to simulation query
+ """
+ return {}
+
Added: erp5/trunk/products/ERP5/Document/NodeBudgetVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/NodeBudgetVariation.py?rev=25042&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/Document/NodeBudgetVariation.py (added)
+++ erp5/trunk/products/ERP5/Document/NodeBudgetVariation.py [utf8] Thu Jan 8 11:59:06 2009
@@ -1,0 +1,130 @@
+##############################################################################
+#
+# 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 NodeBudgetVariation(BudgetVariation):
+ """ A budget variation for node
+ """
+ # Default Properties
+ property_sheets = ( PropertySheet.Base
+ , PropertySheet.XMLObject
+ , PropertySheet.SimpleItem
+ , PropertySheet.SortIndex
+ , PropertySheet.Path
+ , PropertySheet.Predicate
+ )
+
+ # CMF Type Definition
+ meta_type = 'ERP5 Node Budget Variation'
+ portal_type = 'Node 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 _getNodeList(self):
+ """Returns the list of possible nodes
+ """
+ node_select_method_id = self.getProperty('node_select_method_id')
+ if node_select_method_id:
+ return guarded_getattr(self, node_select_method_id)()
+ return ()
+
+ def _getNodeTitle(self, node):
+ """Returns the title of a node
+ """
+ node_title_method_id = self.getProperty('node_title_method_id', 'getTitle')
+ return guarded_getattr(node, node_title_method_id)()
+
+ def getCellRangeForBudgetLine(self, budget_line, matrixbox=0):
+ """The cell range added by this variation
+ """
+ base_category = self.getProperty('variation_base_category')
+ prefix = ''
+ if base_category:
+ prefix = '%s/' % base_category
+
+ node_item_list = [('%s%s' % (prefix, node.getRelativeUrl()),
+ self._getNodeTitle(node))
+ for node in self._getNodeList()]
+ variation_category_list = budget_line.getVariationCategoryList()
+ if matrixbox:
+ return [[i for i in node_item_list if i[0] in variation_category_list]]
+ return [[i[0] for i in node_item_list if i[0] in variation_category_list]]
+
+ def getInventoryQueryDict(self, budget_cell):
+ """ Query dict to pass to simulation query
+ """
+ base_category = self.getProperty('variation_base_category')
+ if not base_category:
+ return dict()
+ 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())
+ return dict()
+
+ 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')
+ prefix = ''
+ if base_category:
+ prefix = '%s/' % base_category
+ return [(self._getNodeTitle(node), '%s%s' % (prefix, node.getRelativeUrl()))
+ for node in self._getNodeList()]
+
+ 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)
+
Added: erp5/trunk/products/ERP5/Document/SectionCategoryBudgetVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/SectionCategoryBudgetVariation.py?rev=25042&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/Document/SectionCategoryBudgetVariation.py (added)
+++ erp5/trunk/products/ERP5/Document/SectionCategoryBudgetVariation.py [utf8] Thu Jan 8 11:59:06 2009
@@ -1,0 +1,127 @@
+##############################################################################
+#
+# 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)
+
+
More information about the Erp5-report
mailing list