[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