[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