[Checkins] SVN: Products.CMFCore/trunk/Products/CMFCore/ Merge in adapterize-wfstatus-wfhistory branch

Laurence Rowe l at lrowe.co.uk
Tue Oct 19 11:17:49 EDT 2010


Log message for revision 117773:
  Merge in adapterize-wfstatus-wfhistory branch

Changed:
  U   Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
  U   Products.CMFCore/trunk/Products/CMFCore/CMFCatalogAware.py
  U   Products.CMFCore/trunk/Products/CMFCore/WorkflowTool.py
  U   Products.CMFCore/trunk/Products/CMFCore/interfaces/_tools.py
  U   Products.CMFCore/trunk/Products/CMFCore/testing.py
  U   Products.CMFCore/trunk/Products/CMFCore/tests/test_WorkflowTool.py
  U   Products.CMFCore/trunk/Products/CMFCore/tool.zcml

-=-
Modified: Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2010-10-19 14:40:49 UTC (rev 117772)
+++ Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2010-10-19 15:17:48 UTC (rev 117773)
@@ -4,6 +4,11 @@
 2.3.0-alpha (unreleased)
 ------------------------
 
+- notifyWorkflowCreated only to IWorkflowAware, possibly following adaption on
+  IObjectAddedEvent.
+
+- Adapterize workflow storage lookups.
+
 - utils: Added FakeExecutableObject.
   It can be used to set proxy roles in trusted code.
 

Modified: Products.CMFCore/trunk/Products/CMFCore/CMFCatalogAware.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/CMFCatalogAware.py	2010-10-19 14:40:49 UTC (rev 117772)
+++ Products.CMFCore/trunk/Products/CMFCore/CMFCatalogAware.py	2010-10-19 15:17:48 UTC (rev 117773)
@@ -262,7 +262,9 @@
     """ Event subscriber for (IContentish, IObjectEvent) events.
     """
     if IObjectAddedEvent.providedBy(event):
-        ob.notifyWorkflowCreated()
+        wfaware = IWorkflowAware(ob, None)
+        if wfaware is not None:
+            wfaware.notifyWorkflowCreated()
         ob.indexObject()
 
     elif IObjectMovedEvent.providedBy(event):

Modified: Products.CMFCore/trunk/Products/CMFCore/WorkflowTool.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/WorkflowTool.py	2010-10-19 14:40:49 UTC (rev 117772)
+++ Products.CMFCore/trunk/Products/CMFCore/WorkflowTool.py	2010-10-19 15:17:48 UTC (rev 117773)
@@ -27,10 +27,18 @@
 from Persistence import PersistentMapping
 from zope.event import notify
 from zope.interface import implements
+from zope.interface import implementer
+from zope.component import adapts
+from zope.component import adapter
+from zope.component import getMultiAdapter
+from zope.component import queryMultiAdapter
 
 from Products.CMFCore.ActionProviderBase import ActionProviderBase
 from Products.CMFCore.interfaces import IConfigurableWorkflowTool
+from Products.CMFCore.interfaces import IWorkflowAware
 from Products.CMFCore.interfaces import IWorkflowDefinition
+from Products.CMFCore.interfaces import IWorkflowHistory
+from Products.CMFCore.interfaces import IWorkflowStatus
 from Products.CMFCore.interfaces import IWorkflowTool
 from Products.CMFCore.permissions import ManagePortal
 from Products.CMFCore.utils import _dtmldir
@@ -321,39 +329,26 @@
     def getHistoryOf(self, wf_id, ob):
         """ Get the history of an object for a given workflow.
         """
-        if hasattr(aq_base(ob), 'workflow_history'):
-            wfh = ob.workflow_history
-            return wfh.get(wf_id, None)
-        return ()
+        wf = self.getWorkflowById(wf_id)
+        return queryMultiAdapter((ob, wf), IWorkflowHistory, default=())
 
     security.declarePrivate('getStatusOf')
     def getStatusOf(self, wf_id, ob):
         """ Get the last element of a workflow history for a given workflow.
         """
-        wfh = self.getHistoryOf(wf_id, ob)
-        if wfh:
-            return wfh[-1]
+        wf = self.getWorkflowById(wf_id)
+        wfs = queryMultiAdapter((ob, wf), IWorkflowStatus, default=None)
+        if wfs is not None:
+            return wfs.get()
         return None
 
     security.declarePrivate('setStatusOf')
     def setStatusOf(self, wf_id, ob, status):
         """ Append a record to the workflow history of a given workflow.
         """
-        wfh = None
-        has_history = 0
-        if hasattr(aq_base(ob), 'workflow_history'):
-            history = ob.workflow_history
-            if history is not None:
-                has_history = 1
-                wfh = history.get(wf_id, None)
-                if wfh is not None:
-                    wfh = list(wfh)
-        if not wfh:
-            wfh = []
-        wfh.append(status)
-        if not has_history:
-            ob.workflow_history = PersistentMapping()
-        ob.workflow_history[wf_id] = tuple(wfh)
+        wf = self.getWorkflowById(wf_id)
+        wfs = getMultiAdapter((ob, wf), IWorkflowStatus)
+        wfs.set(status)
 
     #
     #   'IConfigurableWorkflowTool' interface methods
@@ -622,3 +617,34 @@
             ob.reindexObjectSecurity()
 
 InitializeClass(WorkflowTool)
+
+
+class DefaultWorkflowStatus(object):
+    implements(IWorkflowStatus)
+    adapts(IWorkflowAware, IWorkflowDefinition)
+
+    def __init__(self, context, workflow):
+        self.context = aq_base(context)
+        self.wf_id = workflow.getId()
+
+    def get(self):
+        history = getattr(self.context, 'workflow_history', {})
+        wfh = history.get(self.wf_id)
+        if wfh:
+            return wfh[-1]
+        return None
+
+    def set(self, status):
+        history = getattr(self.context, 'workflow_history', None)
+        if history is None:
+            history = self.context.workflow_history = PersistentMapping()
+        wfh = list(history.get(self.wf_id, ()))
+        wfh.append(status)
+        history[self.wf_id] = tuple(wfh)
+
+
+ at implementer(IWorkflowHistory)
+ at adapter(IWorkflowAware, IWorkflowDefinition)
+def default_workflow_history(context, workflow):
+        history = getattr(aq_base(context), 'workflow_history', {})
+        return history.get(workflow.getId(), ())

Modified: Products.CMFCore/trunk/Products/CMFCore/interfaces/_tools.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/interfaces/_tools.py	2010-10-19 14:40:49 UTC (rev 117772)
+++ Products.CMFCore/trunk/Products/CMFCore/interfaces/_tools.py	2010-10-19 15:17:48 UTC (rev 117773)
@@ -1864,6 +1864,10 @@
     """Plugin interface for workflow definitions managed by IWorkflowTool.
     """
 
+    def getId():
+        """ Return the id of the workflow definition.
+        """
+
     def getCatalogVariablesFor(ob):
         """ Return a mapping of attributes relevant to this workflow.
 
@@ -2035,6 +2039,22 @@
         """
 
 
+class IWorkflowStatus(Interface):
+
+    def get():
+        """Return the current workflow status or None
+        """
+
+    def set(status):
+        """Update the current workflow status to `status`
+        """
+
+
+class IWorkflowHistory(Interface):
+    """A sequence of workflow status dictionaries
+    """
+
+
 class ILinebreakNormalizer(Interface):
 
     """ Interface for a utility to normalize line breaks in plain text

Modified: Products.CMFCore/trunk/Products/CMFCore/testing.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/testing.py	2010-10-19 14:40:49 UTC (rev 117772)
+++ Products.CMFCore/trunk/Products/CMFCore/testing.py	2010-10-19 15:17:48 UTC (rev 117773)
@@ -140,6 +140,7 @@
         zcml.load_config('configure.zcml', zope.traversing)
         zcml.load_config('event.zcml', Products.Five)
         zcml.load_config('event.zcml', Products.CMFCore)
+        zcml.load_config('tool.zcml', Products.CMFCore)
         setHooks()
 
     @classmethod

Modified: Products.CMFCore/trunk/Products/CMFCore/tests/test_WorkflowTool.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/tests/test_WorkflowTool.py	2010-10-19 14:40:49 UTC (rev 117772)
+++ Products.CMFCore/trunk/Products/CMFCore/tests/test_WorkflowTool.py	2010-10-19 15:17:48 UTC (rev 117773)
@@ -27,7 +27,9 @@
 from Products.CMFCore.interfaces import IActionSucceededEvent
 from Products.CMFCore.interfaces import IActionWillBeInvokedEvent
 from Products.CMFCore.interfaces import IContentish
+from Products.CMFCore.interfaces import IWorkflowAware
 from Products.CMFCore.interfaces import IWorkflowDefinition
+from Products.CMFCore.testing import TraversingEventZCMLLayer
 
 
 class Dummy( SimpleItem ):
@@ -124,7 +126,7 @@
 
 class DummyContent( Dummy ):
 
-    implements(IContentish)
+    implements(IContentish, IWorkflowAware)
     meta_type = 'Dummy'
 
     def getPortalTypeName(self):
@@ -154,6 +156,8 @@
 
 class WorkflowToolTests(unittest.TestCase):
 
+    layer = TraversingEventZCMLLayer
+
     def _makeOne( self, workflow_ids=() ):
         from Products.CMFCore.WorkflowTool import WorkflowTool
 

Modified: Products.CMFCore/trunk/Products/CMFCore/tool.zcml
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/tool.zcml	2010-10-19 14:40:49 UTC (rev 117772)
+++ Products.CMFCore/trunk/Products/CMFCore/tool.zcml	2010-10-19 15:17:48 UTC (rev 117773)
@@ -41,4 +41,8 @@
       name="MemberData"
       />
 
+  <adapter factory=".WorkflowTool.DefaultWorkflowStatus" />
+
+  <adapter factory=".WorkflowTool.default_workflow_history" />
+
 </configure>



More information about the checkins mailing list