[Zope-CMF] [dev] content factories and events - a proposal
Wichert Akkerman
wichert at wiggy.net
Thu Jan 10 08:08:49 EST 2008
Previously yuppie wrote:
> Hi!
>
>
> We still have no easy way to use add views for CMF content. I tried to
> figure out what needs to be done to make CMF content creation more
> generic and to avoid duplicate notifyWorkflowCreated and (re)indexObject
> calls.
>
>
> CMF uses two kinds of factories:
>
> Oldstyle factories are used by FactoryTypeInformation if 'product' is
> specified and by ScriptableTypeInformation. They are black box factory
> methods that create unfinished content (no portal type set) and add it
> to the container.
>
> Newstyle factories are used by FactoryTypeInformation if 'product' is
> not specified. They are zope 3 style factories. The code using these
> factories is responsible for setting the portal type and adding the
> content object to its container.
>
> Both currently depend on the _finishConstruction() process that sets the
> portal type and calls notifyWorkflowCreated() and reindexObject().
>
>
> Here are my assertions:
>
> a) The right place for calling notifyWorkflowCreated() and indexObject()
> is the event handler for IObjectAddedEvent. _setObject() sends this
> event by default.
>
> b) Oldstyle factory methods are not responsible for setting the portal
> type. They call _setObject() to early for sending IObjectAddedEvent
> because the portal type might be wrong at that moment.
>
>
> Proposed changes:
>
> 1.) Let's get rid of _finishConstruction(): Using newstyle factories we
> should set the portal type *before* calling _setObject().
> notifyWorkflowCreated() and reindexObject() should be called by the
> event handler.
>
> 2.) Fix *all* oldstyle factories: They don't finish content creation, so
> they should not send the events. Since ScriptableTypeInformation factory
> methods don't call _setObject() directly, this affects only file system
> code.
> self._setObject(id, o)
> Has to be replaced by:
> self._setObject(id, o, suppress_events=True)
> In each factory of each third party content type. I don't like that, but
> it is the only solution I see that allows us to use the events correctly.
>
> 3.) For oldstyle factories, set the portal type after calling the
> factory and send events after that. Unfortunately We can't send the
> IObjectWillBeAddedEvent because we don't know the object before it is added.
>
> 4.) For newstyle factories, also set the portal type, but let
> _setObject() send the events.
>
> 5.) Modify handleContentishEvent(): Add the notifyWorkflowCreated() call
> for IObjectAddedEvent. indexObject() is already called.
>
>
> Any comments? Questions? Objections?
This change broke Plone: Plone has a routine that constructs new content
objects while bypassing parts of CMF which now breaks when it tries to
call _finishConstruction.
Wichert.
--
Wichert Akkerman <wichert at wiggy.net> It is simple to make things.
http://www.wiggy.net/ It is hard to make things simple.
More information about the Zope-CMF
mailing list