[Erp5-report] r30363 - /erp5/trunk/products/ERP5/Document/SolverProcess.py

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Nov 6 12:50:13 CET 2009


Author: jp
Date: Fri Nov  6 12:50:10 2009
New Revision: 30363

URL: http://svn.erp5.org?rev=30363&view=rev
Log:
Initial pseudo-code

Modified:
    erp5/trunk/products/ERP5/Document/SolverProcess.py

Modified: erp5/trunk/products/ERP5/Document/SolverProcess.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/SolverProcess.py?rev=30363&r1=30362&r2=30363&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/SolverProcess.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/SolverProcess.py [utf8] Fri Nov  6 12:50:10 2009
@@ -71,4 +71,62 @@
                     , PropertySheet.XMLObject
                     , PropertySheet.CategoryCore
                     , PropertySheet.DublinCore
-                    )
+                    )
+
+  def buildTargetSolverList(self):
+    """
+      Builds target solvers from solver decisions
+    """
+    solver_dict = {}
+    movement_dict = {}
+    types_tool = context.portal_types
+
+    # First create a mapping between delivery movements and solvers
+    #   in order to know for each movements which solvers are needed
+    #   and which parameters with
+    for decision in context.contentValues(portal_type="Solver Decision"):
+      solver = decision.getSolverValue()
+      solver_type = solver.getId() # ex. Postpone Production Solver
+      solver_conviguration_dict = decision.getConfigurationPropertyDict()
+      solver_conviguration_key = solver_conviguration_dict.items()
+      for movement in decision.getDeliveryValueList():
+        # Detect incompatibilities
+        movement_solver_dict = movement_dict.setdefault(movement.getRelativeUrl(), {})
+        movement_solver_configuration_dict = movement_solver_dict.setdefault(solver_type, {})
+        movement_solver_configuration_dict[solver_key] = None
+
+    # Second, make sure solvers do not conflict and configuration is valid
+    for movement_url, movement_solver_dict in movement_dict.items():
+      for solver_type, movement_solver_configuration_dict in movement_solver_dict.items():
+        solver = types_tool[solver_type]
+        for other_solver in movement_solver_dict.keys():
+          if solver.conflictsWithSolver(other_solver):
+            raise "Solver %s conflicts with solver %s on movement %s" % (solver_type, other_solver, movement_url)
+        # Make sure multiple configuration are possible
+        try:
+          # Solver key contains only those properties which differentiate
+          # solvers (ex. there should be only Production Reduction Solver)
+          solver_key = solver.reduceConfigurationList(movement_solver_configuration_dict.keys())
+        except:
+          raise
+        solver_key_dict = solver_dict.setdefault(solver_type, {})
+        solver_movement_dict = solver_key_dict.setdefault(solver_key, {})
+        solver_movement_dict[movement_url] = movement_solver_configuration_dict.keys()
+
+    # Third, build target solvers
+    for portal_type, solver_key_dict in solver_dict.items():
+      for solver_key, solver_movement_dict in solver_key_dict.items():
+         solver_instance = self.newContent(portal_type=solver_type)
+         solver_instance._setDeliveryList(solver_movement_dict.keys())
+         for movement_url, configuration_list:
+           for configuration_kw in configuration_list:
+            solver_instance.updateConfiguration(**configuration_kw)
+
+  # Solver Process Workflow Interface 
+  #  NOTE: how can we consider that a workflow defines or provides an interface ?
+  def solve(self):
+    """
+      Start solving
+    """
+    for solver in self.contentValues(portal_type=self.getPortalObject().getPortalTargetSolverTypeList()):
+      solver.activate(active_process=self).solve()




More information about the Erp5-report mailing list