[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