[Zope] Acquiring parent objects through BTrees

Joseph Barillari jbarilla@princeton.edu
Wed, 15 Aug 2001 11:07:36 -0400


--8t9RHnE3ZwKMSgU+
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Aug 07, 2001 at 10:32:42PM -0400, Chris McDonough wrote:

(snip quoted explanation of problem)

> You should likely try another mechanism.  A BTree's items don't consider
> the BTree to be their acquisition parent.  And it's bad form to manually
> wrap them (via a =3D a.__of__(btreeinstance); btreeinstance['a'] =3Da)
> because when you stick an acquisition-wrapped object into a BTree, the
> buckets inside a BTree will eventually be committed to storage and
> aquisition wrappers can't be stored inside ZODB.

> Try storing a tuple as the value inside the BTree where the first
> element of the tuple is the path to the object you want to be the
> acqusition parent of the object you're storing, and the second element
> is the object (.e.g. ('/FolderA/SubfolderB', <object A>)), then use
> restrictedTraverse to get the object related to the path and manually
> wrap the object that is the second element in the one you get from
> restrictedTraverse (via __of__, e.g... path, ob =3D tup; ob =3D
> ob.__of__(self.restrictedTraverse(path)).

Thanks! I tried storing the tuples, but two questions came up:

(1) How do I access the elements of a tuple in a URL?
    accessing /BTreeName/BTreeKey/1(the tuple index)/SomeMethod
    doesn't seem to work. When Zope looks up the key in the BTree, it
    chokes on the tuple, complaining that it is missing a doc string.

    Since the object has a docstring, I assume it wants the tuple's
    docstring. This is impossible to satisfy, right? AFAIK, you
    can only attach docstrings to classes and methods.

(2) Would it be easier just to add the parent URL to the object
    when it's inserted into the BTree?
    I.e., from the parent object, call
	  self.data[key] =3D A()
	  self.data[key].path =3D self.id*
    and when it's necessary to access the parent,=20
    call self.__of__(restrictedTraverse(self.path))?

    *on the assumption that the parent object is at the root level of the
    website.

    I tried a variant on this with the code I'm working on.
    Testing in the intended environment for the code (DTML that
    refers to data stored in lower-level objects) proved difficult, so
    I examined it with the debugger:

    (Note that a JTree is a class composed of a BTree mixed with
    implict acquisition.)

(Pdb) self
<Tournament instance at 875b2e8>
(Pdb) self.jdb
<JTree instance at 88a1e28>
(Pdb) self.jdb['Homer Simpson']
<Judge instance at 88b3b50>
(Pdb) self.jdb['Homer Simpson'].path
'foobar'
(Pdb) self.jdb['Homer Simpson'].aq_parent
*** AttributeError: class RoleManager has no attribute 'aq_parent'
(Pdb) self.jdb['Homer Simpson'].restrictedTraverse(path)
*** AttributeError: class RoleManager has no attribute '__getitem__'
[snip syntax error]
(Pdb) self.jdb['Homer Simpson'].restrictedTraverse(self.jdb['Homer
Simpson'].restrictedTraverse(path))
*** AttributeError: class RoleManager has no attribute '__getitem__'

I assume that I haven't imported and subclassed the modules I need to
do this.

However, at this point, the question is academic: I've stopped using
BTrees to organize the data -- I'm using ordinary folders. I may
switch to the BTreeFolder product if they prove inefficient.

Thanks,

Joe


--8t9RHnE3ZwKMSgU+
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE7epA3IV4b0vah+jcRAh83AJ9VElZe7WbIomDEDsgfDzaSv4uo6QCff3xt
yQhD3FEnrA0zp97R+N+E+yM=
=fGcS
-----END PGP SIGNATURE-----

--8t9RHnE3ZwKMSgU+--