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
_______________________________________________
Zope-CMF maillist  -  Zope-CMF@lists.zope.org
http://mail.zope.org/mailman/listinfo/zope-cmf

See http://collector.zope.org/CMF for bug reports and feature requests

Reply via email to