Commit abb4fcb6 authored by Jérome Perrin's avatar Jérome Perrin

new classes for budget models and budget variations


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@25042 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 438d9dbd
##############################################################################
#
# 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)
##############################################################################
#
# 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 {}
##############################################################################
#
# 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)
##############################################################################
#
# 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)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment