I want to create a subscriber that gets triggered when the user tries to access the resource (which is a custom content-type). So, the object is not being added, modified, nothing, is just being traversed. Something like a Zope View Event.
So, basically, suppose a custom content type has a custom workflow (two states: private
and viewed
). The initial state is private
. This content type is only going to be created programatically, using _createObjectByType
by anonymous users. Suppose an object called myobjet
was added, programatically, to the root folder of my Plone site.
What I want is: when the user access
http://localhost:8080/Plone/myobject
...it automatically changes the state of the workflow of this object to viewed
. The url http://localhost:8080/Plone/myobject
is going to be a custom view, not the default base_edit
.
Which event should I use? I tried IEndRequestEvent
and IBeforeTraverseEvent
from this list and none of them work: the handler is not being called for my custom object interface.
I've tried other events with my custom object interface (like IObjectEditedEvent), and, for this event, my handler is called when I edit an object that implements the interface. But using IEndRequestEvent
and IBeforeTraverseEvent
doesn't call the handler.
IEndRequestEvent
and IBeforeTraverseEvent
only work when I set the subscriber to all interfaces:
<subscriber
for="*
zope.app.publication.interfaces.IBeforeTraverseEvent"
handler=".subscriber.myhandler"
/>
And when I make myhandler print the object and the event in this situation, it shows:
<PloneSite at Plone>
<zope.app.publication.interfaces.BeforeTraverseEvent object at 0xd52618c>
If the solution is to write an event myself, is there an easy tutorial for this?