Jeff, what exactly do you need to do with setstate? can you provide an example?
-----Original Message----- From: Jeff K. Hoffman [mailto:jeff.hoffman@goingv.com] Sent: Monday, July 17, 2000 1:49 PM To: Shane Hathaway Cc: Jeff K. Hoffman; Chris McDonough; zope-dev@zope.org Subject: Re: [Zope-dev] The Application object
On Mon, 17 Jul 2000, Shane Hathaway wrote:
"Jeff K. Hoffman" wrote:
Do I need to commit or abort even if I don't make changes to the application object? The only thing I need it for is to get to the Control_Panel; I am instantiating ZClass instances in the constructor of a Python class, i.e.:
class MyClass:
def __init__(self, id, title=''): import Zope app = Zope.app()
ob = app.Control_Panel.Products.MyProduct.MyZClass('newId') ob.id = 'newId'
self._setObject('newId', ob)
# Do I need a get_transaction().abort() here? Will that not abort # the wrong transaction?
app._p_jar.close()
Hmm... you're creating an object in a separate connection (I would call get_transaction().abort() just to be on the safe side...) then copying that object over to the existing connection. This will probably work, but I wouldn't be surprised to see thorny bugs appear.
I have just hit one such thorny bug. Oh well. :-)
If you could instead get a handle to the existing connection, you'd be following standard practice. You probably have a manage_addMyClass() method, don't you? The "self" argument provided to that method is already connected to the database. self.getPhysicalRoot() will give you the equivalent of the app object. Then just change your constructor this way:
def __init__(self, app, id, title=''): ob = app.Control_Panel.Products.MyProduct.MyZClass('newId') ob.id = 'newId'
self._setObject('newId', ob)
Yeah, I was there, and that worked great. Then, I started implementing my __setstate__ method to "upgrade" old instances of my python class. I need to access the connection from here, too, and this is where the trouble begins.
AFAICT, I cannot call self.getPhysicalRoot() from __setstate__, for the same reason I can't call it from __init__. I can get by the __init__ problem by passing app in as an argument from manage_addMyProduct(). I can find no such solution for __setstate__.
Best of luck!
Shane
All of my efforts are progressing towards one goal: How do I upgrade existing instances of a ZClass? Since I could find no __setstate__ method for ZClasses, I re-wrote the containing class as a Python class and figured I could leverage __setstate__ there, instantiating the subordinate ZClasses when required.
No such luck.
I am going to spend a little more time working on this. If I can't find a solution, I may drop ZClasses altogether and move all my code to Python. I had hoped not to do this, because my web guys can work with ZClasses but have no clue where to begin with a Python Product.
I may just have to take total ownership of the code, as much as I dislike the idea, if I can find no other solution.
--Jeff
--- Jeff K. Hoffman 704.849.0731 x108 Chief Technology Officer mailto:jeff.hoffman@goingv.com Going Virtual, L.L.C. http://www.goingv.com/