[Zope3-Users] adding indexes in a __init__ method

Darryl Cousins darryl at darrylcousins.net.nz
Tue Jul 25 06:10:03 EDT 2006


Hi Lorenzo,

The key reference adapter can only get a key reference **after** the
object is added to the database (because it uses _p_oid).

The problem could be fixed with a subscriber to IObjectAddedEvent::

  def FilterableContainerInitializationHandler(object, event):
      """Initialize container after its ObjectAddedEvent."""

	# I have checks here too (maybe unecessary)
	if not IObjectAddedEvent.providedBy(event):
		return
	if not IFilterableContainer.providedBy(object):
		return
      	# whatever needs to be done
	# self._catalog ...

This handler is configured::

  <!-- initialization handler -->
  <subscriber
    for=".IFilterableContainer
         zope.app.container.interfaces.IObjectAddedEvent"
    handler=".subscribers.FilterableContainerInitializationHandler"
    />

Hope that helps.

Best regards,
Darryl

On Tue, 2006-07-25 at 11:26 +0200, Lorenzo Gil Sanchez wrote:
> Hi,
> 
> I have a special Folder content. When an instance of this class is
> created I want to create a catalog and an index in its __init__ method.
> Something like:
> 
> class FilterableContainer(BTreeContainer):
> 
>     implements(IFilterableContainer)
> 
>     def __init__(self):
>         super(FilterableContainer, self).__init__()
>         self._catalog = LocalCatalog()
>         self._catalog['attr1'] = FieldIndex(field_name='attr1')
> 
> where LocalCatalog is a subclass of Catalog that only indexes objects
> that belong to its parent.
> 
> The problem arises when I add my FieldIndex to my internal catalog. Some
> events are triggered and at the end I got this exception:
> 
>   File "/opt/Zope-3.2.1/lib/python/zope/app/keyreference/persistent.py",
> line 41, in __init__
>     raise zope.app.keyreference.interfaces.NotYet(object)
> NotYet: <zope.app.catalog.field.FieldIndex object at 0x2aaab3609b90>
> 
> 
> It happens because the key reference adaptor to Persistent thinks my
> FieldIndex object is already stored in the database, which is not the
> case.
> 
> Anybody knows how should I add an index to my catalog in the __init__
> method?
> 
> Thanks in advance
> 
> Lorenzo
> 
> _______________________________________________
> Zope3-users mailing list
> Zope3-users at zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users



More information about the Zope3-users mailing list