[Checkins] SVN: CMF/branches/martin_workflow_events/DCWorkflow/
Apply patch 3 from http://zope.org/Collectors/CMF/461
Wichert Akkerman
wichert at wiggy.net
Thu Dec 28 18:44:26 EST 2006
Log message for revision 71665:
Apply patch 3 from http://zope.org/Collectors/CMF/461
Changed:
U CMF/branches/martin_workflow_events/DCWorkflow/DCWorkflow.py
U CMF/branches/martin_workflow_events/DCWorkflow/interfaces.py
U CMF/branches/martin_workflow_events/DCWorkflow/tests/test_DCWorkflow.py
-=-
Modified: CMF/branches/martin_workflow_events/DCWorkflow/DCWorkflow.py
===================================================================
--- CMF/branches/martin_workflow_events/DCWorkflow/DCWorkflow.py 2006-12-28 23:41:36 UTC (rev 71664)
+++ CMF/branches/martin_workflow_events/DCWorkflow/DCWorkflow.py 2006-12-28 23:44:26 UTC (rev 71665)
@@ -26,6 +26,7 @@
from OFS.Folder import Folder
from OFS.ObjectManager import bad_id
from zope.interface import implements
+from zope.event import notify
# CMFCore
from Products.CMFCore.interfaces import IWorkflowDefinition
@@ -47,8 +48,8 @@
from Transitions import TRIGGER_USER_ACTION
from Expression import StateChangeInfo
from Expression import createExprContext
+from events import BeforeTransitionEvent, AfterTransitionEvent
-
def checkId(id):
res = bad_id(id)
if res != -1 and res is not None:
@@ -468,6 +469,9 @@
msg = _(u'Destination state undefined: ${state_id}',
mapping={'state_id': new_state})
raise WorkflowException(msg)
+
+ # Fire "before" event
+ notify(BeforeTransitionEvent(ob, self, old_sdef, new_sdef, tdef, former_status, kwargs))
# Execute the "before" script.
if tdef is not None and tdef.script_name:
@@ -532,6 +536,9 @@
ob, self, status, tdef, old_sdef, new_sdef, kwargs)
script(sci) # May throw an exception.
+ # Fire "after" event
+ notify(AfterTransitionEvent(ob, self, old_sdef, new_sdef, tdef, former_status, kwargs))
+
# Return the new state object.
if moved_exc is not None:
# Propagate the notification that the object has moved.
Modified: CMF/branches/martin_workflow_events/DCWorkflow/interfaces.py
===================================================================
--- CMF/branches/martin_workflow_events/DCWorkflow/interfaces.py 2006-12-28 23:41:36 UTC (rev 71664)
+++ CMF/branches/martin_workflow_events/DCWorkflow/interfaces.py 2006-12-28 23:44:26 UTC (rev 71665)
@@ -15,10 +15,34 @@
$Id$
"""
-from zope.interface import Interface
+from zope.interface import Interface, Attribute
+from zope.component.interfaces import IObjectEvent
-
class IDCWorkflowDefinition(Interface):
"""Web-configurable workflow definition.
"""
+
+class ITransitionEvent(Interface):
+
+ """An event that's fired upon a workflow transition.
+ """
+
+ workflow = Attribute(u"The workflow definition triggering the transition")
+ old_state = Attribute(u"The state definition of the workflow state before the transition")
+ new_state = Attribute(u"The state definition of the workflow state before after transition")
+ transition = Attribute(u"The transition definition taking place. "
+ "May be None if this is the 'transition' to the initial state.")
+ status = Attribute(u"The history/status dict of the object before the transition.")
+ kwargs = Attribute(u"Any keyword arguments passed to doActionFor() when the transition was invoked")
+
+class IBeforeTransitionEvent(ITransitionEvent):
+
+ """An event fired before a workflow transition.
+ """
+
+class IAfterTransitionEvent(ITransitionEvent):
+
+ """An event that's fired after a workflow transition.
+ """
+
\ No newline at end of file
Modified: CMF/branches/martin_workflow_events/DCWorkflow/tests/test_DCWorkflow.py
===================================================================
--- CMF/branches/martin_workflow_events/DCWorkflow/tests/test_DCWorkflow.py 2006-12-28 23:41:36 UTC (rev 71664)
+++ CMF/branches/martin_workflow_events/DCWorkflow/tests/test_DCWorkflow.py 2006-12-28 23:44:26 UTC (rev 71665)
@@ -23,6 +23,10 @@
from Products.CMFCore.tests.base.dummy import DummyTool
from Products.CMFCore.WorkflowTool import WorkflowTool
+from zope.interface import Interface
+from zope.component import provideHandler, adapter
+from Products.DCWorkflow.interfaces import IBeforeTransitionEvent
+from Products.DCWorkflow.interfaces import IAfterTransitionEvent
class DCWorkflowDefinitionTests(unittest.TestCase):
@@ -91,6 +95,65 @@
# XXX more
+ def test_events(self):
+
+ events = []
+
+ @adapter(IBeforeTransitionEvent)
+ def _handleBefore(event):
+ events.append(event)
+ provideHandler(_handleBefore)
+
+ @adapter(IAfterTransitionEvent)
+ def _handleAfter(event):
+ events.append(event)
+ provideHandler(_handleAfter)
+
+ wftool = self.site.portal_workflow
+ wf = self._getDummyWorkflow()
+
+ dummy = self.site._setObject( 'dummy', DummyContent() )
+ wftool.notifyCreated(dummy)
+ wf.doActionFor(dummy, 'publish', comment='foo', test='bar')
+
+ self.assertEquals(4, len(events))
+
+ evt = events[0]
+ self.failUnless(IBeforeTransitionEvent.providedBy(evt))
+ self.assertEquals(dummy, evt.object)
+ self.assertEquals('private', evt.old_state.id)
+ self.assertEquals('private', evt.new_state.id)
+ self.assertEquals(None, evt.transition)
+ self.assertEquals({}, evt.status)
+ self.assertEquals(None, evt.kwargs)
+
+ evt = events[1]
+ self.failUnless(IAfterTransitionEvent.providedBy(evt))
+ self.assertEquals(dummy, evt.object)
+ self.assertEquals('private', evt.old_state.id)
+ self.assertEquals('private', evt.new_state.id)
+ self.assertEquals(None, evt.transition)
+ self.assertEquals({}, evt.status)
+ self.assertEquals(None, evt.kwargs)
+
+ evt = events[2]
+ self.failUnless(IBeforeTransitionEvent.providedBy(evt))
+ self.assertEquals(dummy, evt.object)
+ self.assertEquals('private', evt.old_state.id)
+ self.assertEquals('published', evt.new_state.id)
+ self.assertEquals('publish', evt.transition.id)
+ self.assertEquals({'state': 'private', 'comments': ''}, evt.status)
+ self.assertEquals({'test' : 'bar', 'comment' : 'foo'}, evt.kwargs)
+
+ evt = events[3]
+ self.failUnless(IAfterTransitionEvent.providedBy(evt))
+ self.assertEquals(dummy, evt.object)
+ self.assertEquals('private', evt.old_state.id)
+ self.assertEquals('published', evt.new_state.id)
+ self.assertEquals('publish', evt.transition.id)
+ self.assertEquals({'state': 'private', 'comments': ''}, evt.status)
+ self.assertEquals({'test' : 'bar', 'comment' : 'foo'}, evt.kwargs)
+
def test_checkTransitionGuard(self):
wftool = self.site.portal_workflow
More information about the Checkins
mailing list