[Erp5-report] r35143 jerome - in /erp5/trunk/products/ERP5: ./ Tool/
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon May 10 19:00:54 CEST 2010
Author: jerome
Date: Mon May 10 19:00:53 2010
New Revision: 35143
URL: http://svn.erp5.org?rev=35143&view=rev
Log:
split solver tool into two different tools:
- portal_solver_processes contains solver processes
- portal_solvers provides the API of solving and contains solver types
Added:
erp5/trunk/products/ERP5/Tool/SolverProcessTool.py
- copied, changed from r34788, erp5/trunk/products/ERP5/Tool/SolverTool.py
Modified:
erp5/trunk/products/ERP5/Tool/SolverTool.py
erp5/trunk/products/ERP5/__init__.py
Copied: erp5/trunk/products/ERP5/Tool/SolverProcessTool.py (from r34788, erp5/trunk/products/ERP5/Tool/SolverTool.py)
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Tool/SolverProcessTool.py?p2=erp5/trunk/products/ERP5/Tool/SolverProcessTool.py&p1=erp5/trunk/products/ERP5/Tool/SolverTool.py&r1=34788&r2=35143&rev=35143&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Tool/SolverTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Tool/SolverProcessTool.py [utf8] Mon May 10 19:00:53 2010
@@ -29,97 +29,32 @@
import zope.interface
-from Products.CMFCore.utils import getToolByName
-
from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass, DTMLFile
+from Globals import DTMLFile
from Products.ERP5Type import Permissions, interfaces
from Products.ERP5Type.Tool.BaseTool import BaseTool
-from Products.ERP5Type.Message import translateString
-from Products.ERP5 import DeliverySolver
from Products.ERP5 import _dtmldir
-from zLOG import LOG
-
-class SolverTool(BaseTool):
+class SolverProcessTool(BaseTool):
+ """ Container for solver processes.
"""
- The SolverTool provides API to find out which solver can
- be applied in which case and contains SolverProcess instances
- which are used to keep track of solver decisions, solver
- history and global optimisation.
-
- NOTE: this class is experimental and is subject to be removed
- """
- id = 'portal_solvers'
- meta_type = 'ERP5 Solver Tool'
- portal_type = 'Solver Tool'
+ id = 'portal_solver_processes'
+ meta_type = 'ERP5 Solver Process Tool'
+ portal_type = 'Solver Process Tool'
allowed_types = ( 'ERP5 Solver Process', )
# Declarative Security
security = ClassSecurityInfo()
+
+ # Declarative interfaces
+ zope.interface.implements(interfaces.IDivergenceController, )
#
# ZMI methods
#
security.declareProtected( Permissions.ManagePortal, 'manage_overview' )
manage_overview = DTMLFile( 'explainSolverTool', _dtmldir )
-
- # Declarative interfaces
- zope.interface.implements(interfaces.IDeliverySolverFactory,
- interfaces.IDivergenceController,
- )
-
- # Implementation
- def filtered_meta_types(self, user=None):
- # Filters the list of available meta types.
- all = SolverTool.inheritedAttribute('filtered_meta_types')(self)
- meta_types = []
- for meta_type in self.all_meta_types():
- if meta_type['name'] in self.allowed_types:
- meta_types.append(meta_type)
- return meta_types
-
- def tpValues(self) :
- """ show the content in the left pane of the ZMI """
- return self.objectValues()
-
- # IDeliverySolverFactory implementation
- def newDeliverySolver(self, class_name, movement_list):
- """
- """
- __import__('%s.%s' % (DeliverySolver.__name__, class_name))
- solver_class = getattr(getattr(DeliverySolver, class_name), class_name)
- return solver_class(movement_list)
-
- def getDeliverySolverClassNameList(self):
- """
- """
- # XXX Hardcoded for now. We need a new registration system for
- # delivery solvers.
- return ['FIFO', 'LIFO', 'MinPrice',]
-
- def getDeliverySolverTranslatedItemList(self, class_name_list=None):
- """
- """
- return sorted([(self.getDeliverySolverTranslatedTitle(x), x) \
- for x in self.getDeliverySolverClassNameList() \
- if class_name_list is None or x in class_name_list],
- key=lambda x:str(x[0]))
-
- def getDeliverySolverTranslatedTitle(self, class_name):
- """
- """
- __import__('%s.%s' % (DeliverySolver.__name__, class_name))
- return translateString(
- getattr(getattr(DeliverySolver, class_name), class_name).title)
-
- def getDeliverySolverTranslatedDescription(self, class_name):
- """
- """
- __import__('%s.%s' % (DeliverySolver.__name__, class_name))
- return translateString(
- getattr(getattr(DeliverySolver, class_name), class_name).__doc__)
# IDivergenceController implementation
def isDivergent(self, delivery_or_movement=None):
@@ -165,111 +100,3 @@
delivery.setSolverValueList(solver_list)
return new_solver
- def getSolverProcessValueList(self, delivery_or_movement=None, validation_state=None):
- """
- Returns the list of solver processes which are
- are in a given state and which apply to delivery_or_movement.
- This method is useful to find applicable solver processes
- for a delivery.
-
- delivery_or_movement -- a movement, a delivery,
- or a list thereof
-
- validation_state -- a state of a list of states
- to filter the result
- """
-
- def getSolverDecisionValueList(self, delivery_or_movement=None, validation_state=None):
- """
- Returns the list of solver decisions which apply
- to a given movement.
-
- delivery_or_movement -- a movement, a simulation movement, a delivery,
- or a list thereof
-
- validation_state -- a state of a list of states
- to filter the result
- """
-
- def getSolverDecisionApplicationValueList(self, movement, divergence_tester=None):
- """
- Returns the list of documents at which a given divergence resolution
- can be resolved at. For example, in most cases, date divergences can
- only be resolved at delivery level whereas quantities are usually
- resolved at cell level.
-
- The result of this method is a list of ERP5 documents.
-
- NOTE: renaming probably required. I do not like this name nor the one
- of the interface definition.
- """
- # Short Term Implementation Approach
- # XXX tested_property can be multiple for some testers like Net
- # Converted Quantity Divergence Tester or Variation Divergence
- # Tester.
- test_property = divergence_tester.getTestedProperty()
- application_value = movement
- try:
- while not application_value.hasProperty(test_property):
- application_value = application_value.getParentValue()
- except AttributeError:
- # if missing, it should be in Delivery level ?
- application_value = movement.getDeliveryValue()
- return [application_value]
-
- # Alternate short Term Implementation Approach
- return self.SolverTool_getSolverDecisionApplicationValueList(movement, divergence_tester)
-
- # Alternate short Term Implementation Approach
- return divergence_tester.getTypeBasedMethod('getSolverDecisionApplicationValueList')(
- movement, divergence_tester)
-
- # Mid-term implementation (we suppose movement is a delivery)
- # use delivery builders to find out at which level the given
- # property can be modified
- test_property = divergence_tester.getTestedProperty()
- application_value_level = {}
- for simulation_movement in movement.getDeliveryRelatedValueList():
- business_path = simulation_movement.getCausalityValue()
- for delivery_builder in business_path.getDeliveryBuilderValueList():
- for movement_group in delivery_builder.contentValues(): # filter missing
- if test_property in movement_group.getTestedPropertyList():
- application_value_level[movement_group.getCollectGroupOrder()] = None
- result = []
- # Delivery level
- if 'delivery' in application_value_level:
- result.append(movement.getDeliveryValue())
- # Line level
- if 'line' in application_value_level and not movement.isLine():
- result.append(movement)
- elif 'line' in application_value_level and not movement.isLine():
- result.append(movement.getParentValue())
- # Cell level
- if 'cell' in application_value_level and movement.isCell():
- result.append(movement)
- # Group of lines level (we try to find the most appropriate enclosing group)
- if 'group' in application_value_level:
- application_value = movement
- while not application_value.hasProperty(test_property):
- application_value = application_value.getParentValue()
- if application_value not in result: result.append(application_value)
- # Group of lines level (we try to find the most appropriate enclosing group)
- if 'all_group' in application_value_level:
- application_value = movement
- while not application_value.hasProperty(test_property):
- application_value = application_value.getParentValue()
- if application_value not in result: result.append(application_value)
- return result
-
- # Longer-term implementation (we suppose movement is a delivery)
- # use delivery builders to find out at which level the given
- # property can be modified
- test_property = divergence_tester.getTestedProperty()
- application_value_level = {}
- for simulation_movement in movement.getDeliveryRelatedValueList():
- business_path = simulation_movement.getCausalityValue()
- for delivery_builder in business_path.getDeliveryBuilderValueList():
- for property_group in delivery_builder.contentValues(portal_type="Property group"):
- if test_property in property_group.getTestedPropertyList():
- application_value_level[property_group.getCollectGroupOrder()] = None
- # etc. same
Modified: erp5/trunk/products/ERP5/Tool/SolverTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Tool/SolverTool.py?rev=35143&r1=35142&r2=35143&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Tool/SolverTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Tool/SolverTool.py [utf8] Mon May 10 19:00:53 2010
@@ -29,60 +29,29 @@
import zope.interface
-from Products.CMFCore.utils import getToolByName
-
from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass, DTMLFile
from Products.ERP5Type import Permissions, interfaces
-from Products.ERP5Type.Tool.BaseTool import BaseTool
+from Products.ERP5Type.Tool.TypesTool import TypeProvider
+from Products.ERP5 import DeliverySolver
from Products.ERP5Type.Message import translateString
-from Products.ERP5 import DeliverySolver
-
-from Products.ERP5 import _dtmldir
-
-from zLOG import LOG
-
-class SolverTool(BaseTool):
- """
- The SolverTool provides API to find out which solver can
- be applied in which case and contains SolverProcess instances
- which are used to keep track of solver decisions, solver
- history and global optimisation.
-
- NOTE: this class is experimental and is subject to be removed
+
+
+class SolverTool(TypeProvider):
+ """ The SolverTool provides API to find out which solver can be applied in
+ which case and contains SolverProcess instances which are used to keep track
+ of solver decisions, solver history and global optimisation.
+ It also contains solvers.
"""
id = 'portal_solvers'
meta_type = 'ERP5 Solver Tool'
portal_type = 'Solver Tool'
- allowed_types = ( 'ERP5 Solver Process', )
+ allowed_types = ( 'ERP5 Solver Type', )
# Declarative Security
security = ClassSecurityInfo()
-
- #
- # ZMI methods
- #
- security.declareProtected( Permissions.ManagePortal, 'manage_overview' )
- manage_overview = DTMLFile( 'explainSolverTool', _dtmldir )
-
+
# Declarative interfaces
- zope.interface.implements(interfaces.IDeliverySolverFactory,
- interfaces.IDivergenceController,
- )
-
- # Implementation
- def filtered_meta_types(self, user=None):
- # Filters the list of available meta types.
- all = SolverTool.inheritedAttribute('filtered_meta_types')(self)
- meta_types = []
- for meta_type in self.all_meta_types():
- if meta_type['name'] in self.allowed_types:
- meta_types.append(meta_type)
- return meta_types
-
- def tpValues(self) :
- """ show the content in the left pane of the ZMI """
- return self.objectValues()
+ zope.interface.implements(interfaces.IDeliverySolverFactory, )
# IDeliverySolverFactory implementation
def newDeliverySolver(self, class_name, movement_list):
@@ -120,50 +89,6 @@
__import__('%s.%s' % (DeliverySolver.__name__, class_name))
return translateString(
getattr(getattr(DeliverySolver, class_name), class_name).__doc__)
-
- # IDivergenceController implementation
- def isDivergent(self, delivery_or_movement=None):
- """
- Returns True if any of the movements provided
- in delivery_or_movement is divergent
-
- delivery_or_movement -- a movement, a delivery,
- or a list thereof
- """
- if not isinstance(delivery_or_movement, (tuple, list)):
- delivery_or_movement = [delivery_or_movement]
- for movement in delivery_or_movement:
- if movement.isDivergent():
- return True
- return False
-
- def newSolverProcess(self, delivery_or_movement=None, temp_object=False):
- """
- Builds a new solver process from the divergence
- analaysis of delivery_or_movement. All movements
- which are not divergence are placed in a Solver
- Decision with no Divergence Tester specified.
-
- delivery_or_movement -- a movement, a delivery,
- or a list thereof
- """
- # Do not create a new solver process if no divergence
- if not self.isDivergent(delivery_or_movement=delivery_or_movement):
- return None
-
- # Create an empty solver process
- new_solver = self.newContent(portal_type='Solver Process',
- temp_object=temp_object)
- # And build decisions
- new_solver.buildSolverDecisionList(delivery_or_movement=delivery_or_movement,
- temp_object=temp_object)
-
- # Append the solver process into the delivery's solver category
- delivery = delivery_or_movement.getRootDeliveryValue()
- solver_list = delivery.getSolverValueList()
- solver_list.append(new_solver)
- delivery.setSolverValueList(solver_list)
- return new_solver
def getSolverProcessValueList(self, delivery_or_movement=None, validation_state=None):
"""
Modified: erp5/trunk/products/ERP5/__init__.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/__init__.py?rev=35143&r1=35142&r2=35143&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/__init__.py [utf8] (original)
+++ erp5/trunk/products/ERP5/__init__.py [utf8] Mon May 10 19:00:53 2010
@@ -49,7 +49,8 @@
TestTool, DomainTool, AlarmTool, OrderTool, DeliveryTool,\
TrashTool, ContributionTool, NotificationTool, PasswordTool,\
GadgetTool, ContributionRegistryTool, IntrospectionTool,\
- AcknowledgementTool, SolverTool, ConversionTool, RoundingTool
+ AcknowledgementTool, SolverTool, SolverProcessTool,\
+ ConversionTool, RoundingTool
import ERP5Site
object_classes = ( ERP5Site.ERP5Site,
)
@@ -72,6 +73,7 @@
IntrospectionTool.IntrospectionTool,
AcknowledgementTool.AcknowledgementTool,
SolverTool.SolverTool,
+ SolverProcessTool.SolverProcessTool,
ConversionTool.ConversionTool,
RoundingTool.RoundingTool,
)
More information about the Erp5-report
mailing list