From a118d9d1a86983d8c75b4ca9da115c3fd5bfdcfc Mon Sep 17 00:00:00 2001 From: Kazuhiko Shiozaki <kazuhiko@nexedi.com> Date: Wed, 18 Nov 2009 13:48:59 +0000 Subject: [PATCH] initial implement of new string divergence tester. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@30729 20353a03-c40f-0410-a6d1-a30d3c3de9de --- .../ERP5/Document/StringDivergenceTester.py | 76 +++++++++++++++++-- 1 file changed, 70 insertions(+), 6 deletions(-) diff --git a/product/ERP5/Document/StringDivergenceTester.py b/product/ERP5/Document/StringDivergenceTester.py index f4705e7d12..7fd3852050 100644 --- a/product/ERP5/Document/StringDivergenceTester.py +++ b/product/ERP5/Document/StringDivergenceTester.py @@ -32,14 +32,14 @@ import zope.interface from AccessControl import ClassSecurityInfo from Products.ERP5.Document.Predicate import Predicate -from Products.ERP5Type.DivergenceMessage import DivergenceMessage from Products.ERP5Type import Permissions, PropertySheet, interfaces +from Products.ERP5.mixin.divergence_tester import DivergenceTesterMixin -class StringDivergenceTester(Predicate): +class StringDivergenceTester(Predicate, DivergenceTesterMixin): """ The purpose of this divergence tester is to check the consistency between delivery movement and simulation movement - for some specific properties. + for a specific property. """ meta_type = 'ERP5 String Divergence Tester' portal_type = 'String Divergence Tester' @@ -49,9 +49,6 @@ class StringDivergenceTester(Predicate): security = ClassSecurityInfo() security.declareObjectProtected(Permissions.AccessContentsInformation) - # Declarative interfaces - zope.interface.implements( interfaces.IDivergenceTester, ) - # Declarative properties property_sheets = ( PropertySheet.Base , PropertySheet.XMLObject @@ -60,3 +57,70 @@ class StringDivergenceTester(Predicate): , PropertySheet.DivergenceTester , PropertySheet.SolverSelection ) + + # Declarative interfaces + zope.interface.implements( interfaces.IDivergenceTester, ) + + + def _compare(self, prevision_movement, decision_movement): + """ + If prevision_movement and decision_movement don't match, it returns a + list : (prevision_value, decision_value, message, mapping) + """ + tested_property = self.getTestedProperty() + decision_value = decision_movement.getProperty(tested_property) + if prevision_movement.isPropertyRecorded(tested_property): + prevision_value = prevision_movement.getRecordedProperty(tested_property) + if isinstance(prevision_value, (list, tuple)): + prevision_value = prevision_value[0] + else: + prevision_value = prevision_movement.getProperty(tested_property) + + # XXX do we have configurable parameter for this divergence tester ? + # like ambiguity... + if decision_value != prevision_value: + return ( + prevision_value, decision_value, + 'The value of ${prperty_name} is different between decision and prevision.', + dict(property_name=tested_property)) + return None + + def getUpdatablePropertyDict(self, prevision_movement, decision_movement): + """ + Returns a list of properties to update on decision_movement + prevision_movement so that next call to compare returns True. + + prevision_movement -- a simulation movement (prevision) + + decision_movement -- a delivery movement (decision) + """ + tested_property = self.getTestedProperty() + if prevision_movement.isPropertyRecorded(tested_property): + prevision_value = prevision_movement.getRecordedProperty(tested_property) + if isinstance(prevision_value, (list, tuple)): + prevision_value = prevision_value[0] + else: + prevision_value = prevision_movement.getProperty(tested_property) + return {tested_property:prevision_value} + + def accept(self, simulation_movement): + """ + Copies the properties handled by the divergence tester + from the related delivery movement to simulation_movement. + + NOTE: the future existence of this method is still unknown + because it is likely to be implemented in TargetSolver + instead. + """ + raise NotImplementedError + + def adopt(self, simulation_movement): + """ + Copies the properties handled by the divergence tester + from simulation_movement to the related delivery movement + + NOTE: the future existence of this method is still unknown + because it is likely to be implemented in TargetSolver + instead. + """ + raise NotImplementedError -- 2.30.9