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/History.py calls oldstate() in
>ZODB/Connection.py. The serializer then calls getState() in
>ZODB/serialize.py (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/Connection.py'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 "email@example.com")
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 - ZODB-Dev@zope.org