[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/