[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