Matt Hahnfeld wrote at 2006-3-13 10:23 -0500:
>A few months back, the default content types for Plone (ATContentTypes)
>switched to using AnnotationStorage instead of AttributeStorage for
>the storage of some attributes.  Formerly, properties on a persistent
>archetype object were stored as normal object attributes.  Now they are
>stored in an OOBtree referenced by an attribute named '__annotation__'.
>To make a long story short, the current implementation of
>historicalRevision in Zope's OFS/ calls oldstate() in
>ZODB/  The serializer then calls getState() in
>ZODB/ (class ObjectReader), which sets up an unpickler to
>handle persistent references by overriding _persistent_load(). 
>Unfortunately, when the _persistent_load subroutine comes across a
>persistent reference, it either loads the CURRENT referenced object
>from the ZODB (using the oid and ZODB/'s get()), or loads the
>CURRENT referenced object from cache.  It does not take 'tid' into account
>when it loads persistent references.
>In order for Zope's "history" tab to work for anything other than a very
>simple object (with no persistent references), it needs to "deeply" copy
>objects out of the ZODB.  In other words, the persistent references we
>pull back for a historical revision of an object should be from the same
>'tid' as the original object.

A long time ago, I posted code (I think to "")
that does it for you in the right way.
It defines a "HistoricalConnection" which retrieves objects
with a state as of a given time.
You might search for "historicalRevision" and "HistoryJar"
to locate the post.

Zope 2.8/ZODB 3.4 broke my implementation but it would probably
not too difficult to get fixed.

For more information about ZODB, see the ZODB Wiki:

ZODB-Dev mailing list  -

Reply via email to