From a021f476b33eee9315fcbc9b1b9bdf47dc7d9376 Mon Sep 17 00:00:00 2001
From: Kazuhiko Shiozaki <kazuhiko@nexedi.com>
Date: Wed, 9 Dec 2009 15:09:21 +0000
Subject: [PATCH] Rule should be IDivergenceController.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@31196 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5/mixin/rule.py | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/product/ERP5/mixin/rule.py b/product/ERP5/mixin/rule.py
index 11fa3bddb7..02d0d83251 100644
--- a/product/ERP5/mixin/rule.py
+++ b/product/ERP5/mixin/rule.py
@@ -50,6 +50,7 @@ class RuleMixin:
 
   # Declarative interfaces
   zope.interface.implements(interfaces.IRule,
+                            interfaces.IDivergenceController,
                             interfaces.IMovementCollectionUpdater,)
 
   # Portal Type of created children
@@ -101,6 +102,40 @@ class RuleMixin:
     for movement in applied_rule.getMovementList():
       movement.expand(**kw)
 
+  # Implementation of IDivergenceController
+  security.declareProtected( Permissions.AccessContentsInformation,
+                            'isDivergent')
+  def isDivergent(self, movement, ignore_list=[]):
+    """
+    Returns true if the Simulation Movement is divergent comparing to
+    the delivery value
+    """
+    delivery = movement.getDeliveryValue()
+    if delivery is None:
+      return False
+    if len(self.getDivergenceList(movement)) == 0:
+      return False
+    else:
+      return True
+
+  security.declareProtected(Permissions.View, 'getDivergenceList')
+  def getDivergenceList(self, movement):
+    """
+    Returns a list of divergences of the movements provided
+    in delivery_or_movement.
+
+    movement -- a movement, a delivery, a simulation movement,
+                or a list thereof
+    """
+    result_list = []
+    for divergence_tester in self._getDivergenceTesterList():
+      result = divergence_tester.explain(movement)
+      if isinstance(result, (list, tuple)): # for compatibility
+        result_list.extend(result)
+      elif result is not None:
+        result_list.append(result)
+    return result_list
+
   # Implementation of IMovementCollectionUpdater
   def getMovementCollectionDiff(self, context, rounding=False, movement_generator=None):
     """
-- 
2.30.9