[Zope-CMF] Zope 3 events from workflow
Chris Withers
chris at simplistix.co.uk
Wed Jan 3 09:07:25 EST 2007
Martin Aspeli wrote:
> To subscribe only to particular transitions, you would need for each
> transition object to provide a specific interface.
Unless you could leverage the same kind of thing that makes named
adapters work...
> zope.event?), it registers a general subscriber for IObjectEvent and then
> redispatches for multi-subscribers based on (obj, event), i.e. you register
> a handler for the object type and for the event type.
I actually don't like this pattern, it seems needlessly inefficient. Why
not just set the right damned event going from the start? ;-)
> We could do the same for a transition event, e.g. re-dispatching based on
> object type, workflow type and/or transition type.
Sounds like it would fit the idiom, even if I don't like it...
> However, in DCWorkflow, transitions are all of the same type, just with
> different ids, and in WorkflowTool, actions (of which DCWorkflow transitions
> are one common type) are also identified by a string only.
See my comment about named thingies above, although this is largely hand
waving on my part...
> It would be possible to define some kind of re-dispatch that used named
> adapters, but even though subscribers are just adapter factories under the
> hood (you'll see the slightly odd syntax of a loop that just retrieves all
> possible adapters from the component registry, doing nothing with the return
> values, because the event subscriber registry is using the same mechanism as
> the adapter factory registry, but the "factory" that is called normally does
> the event work), I don't think there's any natural syntax for registering
> named subscribers. You *could* do this though:
>
> @zope.component.adapter(Interface, IWorkflowTransitionEvent)
> def dispatch_transitions(obj, event):
> transition = event.transition.id
> factory = getMultiAdapter((obj, event),
> provides=INamedTransitionSubscriber, name=transition)
>
> <subscriber handler=".dispatch.dispatch_transitions" />
>
> - which would be generic and only be needed once.
>
> and then for each transition:
>
> @zope.component.implementer(INamedTransitionSubscriber)
> @zope.component.adapter(IMyObject, IWorkflowTransitionEvent)
> def react_to_published(obj, event):
> ...
>
> and in ZCML:
>
> <adapter factory=".subscribers.react_to_published" name="publish" />
>
> I'm not sure this is any easier or less hacky than doing the subscriber
> like:
>
> @zope.component.adapter(Interface, IWorkflowTransitionEvent)
> def dispatch_transitions(obj, event):
> transition = event.transition.id
> if transition == 'publish':
> ...
Yeah, decorators suck when abused and zcml just sucks ;-)
*sigh*
Chris
--
Simplistix - Content Management, Zope & Python Consulting
- http://www.simplistix.co.uk
More information about the Zope-CMF
mailing list