[Zope] I _still_ need help on ZClasses and manage_clone

Erik Stephens estep@ep.newtimes.com
Wed, 17 May 2000 12:16:15 -0700


> Date: Tue, 16 May 2000 15:03:26 +0200
> From: Marco Mariani <m.mariani@imola.nettuno.it>
> To: zope@zope.org
> Subject: [Zope] I _still_ need help on ZClasses and manage_clone
> 
> I'm banging my head on the wall for this.
> 
> I have a ZClass which derives from Folder, and has permissons for "Documents,
> Images and Files".
> 
> When I try to use manage_clone within an instance of it, I get
> 
>    Error Type: AttributeError
>    Error Value: _getProducts
> 
> [...]
> 
> Traceback (innermost last):
>   File /usr/lib/zope/lib/python/ZPublisher/Publish.py, line 214, in publish_module
>   File /usr/lib/zope/lib/python/ZPublisher/Publish.py, line 179, in publish
>   File /usr/lib/zope/lib/python/Zope/__init__.py, line 202, in zpublisher_exception_hook
>     (Object: ElementWithAttributes)
>   File /usr/lib/zope/lib/python/ZPublisher/Publish.py, line 165, in publish
>   File /usr/lib/zope/lib/python/ZPublisher/mapply.py, line 160, in mapply
>     (Object: PuploadMenu)
>   File /usr/lib/zope/lib/python/ZPublisher/Publish.py, line 102, in call_object
>     (Object: PuploadMenu)
>   File /usr/lib/zope/lib/python/Products/ExternalMethod/ExternalMethod.py, line 248, in __call__
>     (Object: PuploadMenu)
>     (Info: ((<Folder instance at 85b2328>, <h3>form</h3> [...]
> 
>   File /var/lib/zope/Extensions/upload.py, line 143, in uploadMenu
>     (Object: ElementWithAttributes)
>   File /var/lib/zope/Extensions/upload.py, line 70, in NewArticolo
>     (Object: ElementWithAttributes)
>   File /usr/lib/zope/lib/python/OFS/CopySupport.py, line 284, in manage_clone
>     (Object: ElementWithAttributes)
>   File /usr/lib/zope/lib/python/OFS/CopySupport.py, line 353, in _verifyObjectPaste
>     (Object: ElementWithAttributes)
>   File /usr/lib/zope/lib/python/App/FactoryDispatcher.py, line 96, in __getitem__
> AttributeError: (see above)
> 
> This is the relevant section of upload.py, where "gruppo" is a list of Image names.
> 
> "self" is the folder containing 'upload', which is a folder full of Images.
> 
> def NewArticolo(self,REQUEST,RESPONSE):
>     r=''
>     gruppo = REQUEST.form.get('gruppo')
> 
>     if gruppo:
>         next_art = self['prossimo_articolo']             # property of folder 'foto'
>         upload=self.upload.this()
>         id = 'art_%s'%next_art
> 
>         newob = upload.Control_Panel.Products.MArticolo.ArtClass(id)
>         newob.id = id
> #       newob.propertysheets.art_info.manage_changeProperties(REQUEST)
>         upload._setObject(id,newob)
> 
>     r=r+ 'Articolo %s aggiunto.<BR>' % next_art
>     next_art = next_art + 1
>     next_foto = self['prossima_foto']
> 
>     for i in gruppo:
> #       upload.manage_clone(upload[i],'foto_%s'%next_foto)
> #       ^^^^^^^ this works
> 
>         newob.manage_clone(upload[i],'foto_%s'%next_foto)
>         ^^^^^^^ this doesn't
> 
>         newob["foto_%s"%next_foto].manage_changeProperties({'filename': i})
>         r=r+ 'Foto %s aggiunta.<BR>' % i
>         next_foto = next_foto + 1
> 
>     self.manage_changeProperties({'prossimo_articolo': next_art})
>     self.manage_changeProperties({'prossima_foto': next_foto})
>     return r
> 
> Thank you for reading this far.

I think a lot of people, myself included, have had problems trying to
clone objects inside of new ZClass instances.  This sounds like the
problem you're having.  I haven't heard of a simple solution to the
problem.  John Morton talked about a possible workaround in a previous
posting.  Don't know if this will work for you, though.

Begin previous post by John Morton, March 28
-------------------------------------------------------------
Tres Seaver writes: 

> > Take three. I've solved the problem for all cases by having the ZClass 
> > add method redirect to a method that copies the default methods into 
> > the new ZClass instance, then redirects back to the management screen. 
> > 
> > Might have to write a howto for this one. 

> I'm glad you found a workaround.  Just offhand, did you try to just call that 
> additional method, before redirecting to it?  I have seen a couple of cases 
> where I refactored code like that into a new method and then things got simpler. 

Tried that - I in-lined it on the list for brevity's sake. The problem
is definitely with manage_clone not wanting to be used on a thing inside
the transaction that creates that thing.
-------------------------------------------------------------
End previous post