Hi, I am having difficulty getting product upgrades to work via the __setstate__ method. It is mentioned in a few places on the zope site, for example: (from http://www.zope.org/Members/michel/HowTos/ZODB-How-To) __setstate__() is also useful to upgrade an object from one version to another. If you add instance attributes to your product, older versions of the instances of that product will not have the new attribute. __setstate__ can check for the existance of new attributes, and create them with sane defaults in older versions of the instance. I am particularly interested in the second part of this. I have found a couple of examples of this, one in ZCatalog and one in Xen, but can't get it to work in my product. My code has gone through many permutations, but the general layout is as follows: def __setstate__(self,state): Persistent.__setstate__(self,state) if self._ordermanager_version < 4: print 'ver < 4' self._ordermanager_version = 4 get_transaction().commit() Where the class is inherited from Persistent among other things. The code within the if runs, however the transaction doesn't appear to get committed. The object in memory/cache has the new version number, but when Zope is restarted the same code runs again and sets the version. I haven't found any docs on how one is supposed to do this, can anyone point me in the right direction. Especially to some code that shows 'the right way' :). thanks -d -- Adroit | Dyon Balding dyon@adroit.net Internet | http://www.adroit.net/ Solutions | work: +613 98888522, mobile: +61 0414992604
participants (1)
-
Dyon Balding