[Zope-dev] Re: Refresh trashes acquisition

Lennart Regebro lennart@regebro.nu
Sat, 27 Jul 2002 02:09:20 +0200


From: "Ross Boylan" <RossBoylan@stanfordalumni.org>
> Just to be sure I understand: so if c is persistent, and I say
> c.d = a.__of__(b)
>
> and then a few transactions later I come back and get c.d, I am not
> going to find it's a.__of__(b)?

I'm not 100% sure, I have only used __of__ in non.persistent ways, but I
don't think it would work. It's not ment to work anyway. :-)

> And also, does this mean that
> c.d = b.a
> also will not work?

It will work alright, but you won't find b in the acquisition when you
access d.

> The intended meaning is this: suppose Zope has invoked the method foo
> on the object a.  Then a.b in foo (or, better, the expression self.b)
> does acquisition, but if I run off and pull an object c from the
> database, c.d will not have acquisition.  Is that what you meant to
> say?

It's too late here, I have to think about that tomorrow. :-)

> Clearly subclassing from Acquisition and Persistent is a necessary
> condition for storing acquisition contexts.  Is it also sufficient?
> The statement 1 above seems to imply not, and the earlier statement (by
> someone else) that acquisition does not survive transaction boundaries
> goes further.  As I understood it, it meant that it is impossible to
> store acquisition contexts reliably.

Well, you can't *store* them any differently than how you store them in the
ZODB, thats correct.
If you access /a/b/c that thats how your acquisition path will look, and you
can't put in the object /d/e in that acquisition path permanently by storing
it. If you need it there you either need to access c through /d/e/a/b/c, or
you need to push e into the right place in the acqusition.

We do the latter in our templating system, where we push a couple of objects
inbetween the document and the documents parent to get the templates into
actions.