[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