[Zope-dev] The Application object

Chris McDonough chrism@digicool.com
Mon, 17 Jul 2000 14:09:46 -0400


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/