Re: [Zope3-Users] adding indexes in a __init__ method

2006-07-25 Thread Lorenzo Gil Sanchez
Hi Darryl

El mié, 26-07-2006 a las 00:48 +1200, Darryl Cousins escribió:
> Hi Lorenzo,
> 
> Cool. Where is the `contained` imported from? There is some magic there
> because I couldn't get the test to work when creating the FieldIndex in
> your createIndexes method without it.

from zope.app.container.contained import contained

Regards

Lorenzo

___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


Re: [Zope3-Users] adding indexes in a __init__ method

2006-07-25 Thread Darryl Cousins
Hi Lorenzo,

Cool. Where is the `contained` imported from? There is some magic there
because I couldn't get the test to work when creating the FieldIndex in
your createIndexes method without it.

Thanks,
Darryl

On Tue, 2006-07-25 at 13:55 +0200, Lorenzo Gil Sanchez wrote:
> Hi Darryl,
> 
> this is how I ended implementing it:
> 
> 

___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


Re: [Zope3-Users] adding indexes in a __init__ method

2006-07-25 Thread Lorenzo Gil Sanchez
Hi Darryl,

this is how I ended implementing it:


class FilterableContainer(BTreeContainer):

implements(IFilterableContainer)

def __init__(self, catalog=None):
super(FilterableContainer, self).__init__()
self.catalog = contained(LocalCatalog(), self, 'catalog')

def createIndexes(self):
self.catalog['attr1'] = FieldIndex('attr1')
self.catalog['attr2'] = FieldIndex('attr2')


def onFilterableContainerAdded(obj, event):
if IFilterableContainer.providedBy(obj):
obj.createIndexes()


Thanks a lot for your help and suggestions!

Lorenzo

El mar, 25-07-2006 a las 22:38 +1200, Darryl Cousins escribió:
> Hi Lorenzo,
> 
> I got this test to work::
> 
> >>> class TestField(Persistent):
> ... pass
> 
> >>> class TestCase(Persistent):
> ... def __init__(self):
> ... self.fieldkey = KeyReferenceToPersistent(TestField())
> 
> >>> t = TestCase()
> Traceback (most recent call last):
> ...
> NotYet:...
> 
> >>> class TestCaseTwo(Persistent):
> ... def __init__(self):
> ... self.field = TestField()
> ... def initfield(self):
> ... self.fieldkey = KeyReferenceToPersistent(self.field)
> ... del(self.field)
> 
> >>> t = TestCaseTwo()
> >>> tc = root['t'] = t
> 
> >>> transaction.commit()
> >>> tc.initfield()
> >>> print tc.field
> Traceback (most recent call last):
> ...
> AttributeError:...
> 
> (Set up for test is shown in 
> 
> Which would mean that if you created the FieldIndex in __init__ and the
> catalog[key] part in the initialization handler then it should work.
> 
> I put the del(self.field) bit in as a test in case you don't want that
> attribute unecessarily hanging around.
> 
> Hope **that** helps.
> 
> Regards,
> Darryl
> 
> On Tue, 2006-07-25 at 12:24 +0200, Lorenzo Gil Sanchez wrote:
> > No worries, in fact I actually tried the same aproach and hit the same
> > problem
> > 
> > Thanks anyway
> > 
> > Lorenzo
> > 
> > El mar, 25-07-2006 a las 22:16 +1200, Darryl Cousins escribió:
> > > Hi again,
> > > 
> > > I was a too hasty. Because it is the FieldIndex that is missing the
> > > _p_oid attribute, and the fix I offered is for the container. Sorry
> > > about that.
> > > 
> > > I need more thinking.
> > > 
> > > Regards,
> > > Darryl
> > > 
> > > 
> > > On Tue, 2006-07-25 at 22:10 +1200, Darryl Cousins wrote:
> > > > 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::
> > > > 
> > > >   
> > > >> > > 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: 
> > > > > 
> > > > > 
> > > > > 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__
>

Re: [Zope3-Users] adding indexes in a __init__ method

2006-07-25 Thread Darryl Cousins
Hi All,

I was thinking about that del(self.field) that I threw in. Wouldn't that
remove the object too and therefore the key reference?

Apparently not (in the test anyway)::

>>> class TestField(Persistent):
... id = u''
... def __init__(self, id):
...  self.id = id

>>> class TestCaseTwo(Persistent):
... def __init__(self):
... self.field = TestField(id=u'test case two')
... def initfield(self):
... self.fieldkey = KeyReferenceToPersistent(self.field)
... del(self.field)

>>> t = TestCaseTwo()
>>> tc = root['t'] = t
>>> transaction.commit()
>>> tc.initfield()
>>> print tc.field
Traceback (most recent call last):
...
AttributeError:...
>>> print tc.fieldkey().id
test case two

>>> transaction.commit()
>>> print tc.fieldkey().id  # I thought this would fail
test case two

Best regards,
Darryl

___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


Re: [Zope3-Users] adding indexes in a __init__ method

2006-07-25 Thread Darryl Cousins
Hi Lorenzo,

I got this test to work::

>>> class TestField(Persistent):
... pass

>>> class TestCase(Persistent):
... def __init__(self):
... self.fieldkey = KeyReferenceToPersistent(TestField())

>>> t = TestCase()
Traceback (most recent call last):
...
NotYet:...

>>> class TestCaseTwo(Persistent):
... def __init__(self):
... self.field = TestField()
... def initfield(self):
... self.fieldkey = KeyReferenceToPersistent(self.field)
... del(self.field)

>>> t = TestCaseTwo()
>>> tc = root['t'] = t

>>> transaction.commit()
>>> tc.initfield()
>>> print tc.field
Traceback (most recent call last):
...
AttributeError:...

(Set up for test is shown in 

Which would mean that if you created the FieldIndex in __init__ and the
catalog[key] part in the initialization handler then it should work.

I put the del(self.field) bit in as a test in case you don't want that
attribute unecessarily hanging around.

Hope **that** helps.

Regards,
Darryl

On Tue, 2006-07-25 at 12:24 +0200, Lorenzo Gil Sanchez wrote:
> No worries, in fact I actually tried the same aproach and hit the same
> problem
> 
> Thanks anyway
> 
> Lorenzo
> 
> El mar, 25-07-2006 a las 22:16 +1200, Darryl Cousins escribió:
> > Hi again,
> > 
> > I was a too hasty. Because it is the FieldIndex that is missing the
> > _p_oid attribute, and the fix I offered is for the container. Sorry
> > about that.
> > 
> > I need more thinking.
> > 
> > Regards,
> > Darryl
> > 
> > 
> > On Tue, 2006-07-25 at 22:10 +1200, Darryl Cousins wrote:
> > > 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::
> > > 
> > >   
> > >> > 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: 
> > > > 
> > > > 
> > > > 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@zope.org
> > > > http://mail.zope.org/mailman/listinfo/zope3-users
> > > 
> > > ___
> > > Zope3-users mailing list
> > > Zope3-users@zope.org
> > > http://mail.zope.org/mailman/listinfo/zope3-users
> > 
> 
> ___
> Zope3-users mailing list
> Zope3-users@zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users

___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


Re: [Zope3-Users] adding indexes in a __init__ method

2006-07-25 Thread Lorenzo Gil Sanchez
No worries, in fact I actually tried the same aproach and hit the same
problem

Thanks anyway

Lorenzo

El mar, 25-07-2006 a las 22:16 +1200, Darryl Cousins escribió:
> Hi again,
> 
> I was a too hasty. Because it is the FieldIndex that is missing the
> _p_oid attribute, and the fix I offered is for the container. Sorry
> about that.
> 
> I need more thinking.
> 
> Regards,
> Darryl
> 
> 
> On Tue, 2006-07-25 at 22:10 +1200, Darryl Cousins wrote:
> > 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::
> > 
> >   
> >> 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: 
> > > 
> > > 
> > > 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@zope.org
> > > http://mail.zope.org/mailman/listinfo/zope3-users
> > 
> > ___
> > Zope3-users mailing list
> > Zope3-users@zope.org
> > http://mail.zope.org/mailman/listinfo/zope3-users
> 

___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


Re: [Zope3-Users] adding indexes in a __init__ method

2006-07-25 Thread Darryl Cousins
Hi again,

I was a too hasty. Because it is the FieldIndex that is missing the
_p_oid attribute, and the fix I offered is for the container. Sorry
about that.

I need more thinking.

Regards,
Darryl


On Tue, 2006-07-25 at 22:10 +1200, Darryl Cousins wrote:
> 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::
> 
>   
>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: 
> > 
> > 
> > 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@zope.org
> > http://mail.zope.org/mailman/listinfo/zope3-users
> 
> ___
> Zope3-users mailing list
> Zope3-users@zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users

___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


Re: [Zope3-Users] adding indexes in a __init__ method

2006-07-25 Thread Darryl Cousins
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::

  
  

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: 
> 
> 
> 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@zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users

___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users