I solved it. I use the following lines for copying an object: orig # the original (instance of MyClass()) copy=MyClass() copy.__setstate__(orig.__getstate__()) thomas Thomas Guettler wrote:
Hi!
If I copy an instance of a python class (I am developing a python product) I got the problem that it does a deep copy. The original has a attribute called default_catalog which is a reference to the catalog where all objects are stored.
If I do a copy, there is a unfortunately a new object (default_catalog). But it should be a reference to the catalog where all objects are stored.
I store a template in the folder 'defaults' and want to copy it to 'documents'. (Layout: root/defaults root/documents)
In the Object which gets copied: def createNewDocument(self, REQUEST=None): r=self.root() orig=r.defaults[self.id] copy=orig._getCopy(r)
# Stolen form CopySupport.manage_clone. Don't know what it does copy=copy.__of__(orig)
copy.id=r.nextID() copy.isDefaultDocument=0 r.documents._setObject(copy.id, copy) # TODO: Btree if copy.default_catalog!=orig.default_catalog: print "orig", orig.default_catalog print "copy", copy.default_catalog raise "Bad Copy" if REQUEST: REQUEST.RESPONSE.redirect('/' + r.id + '/documents/' + copy.id)
The log: orig <ZCatalog instance at 02633AB8> copy <ZCatalog instance at 02522EC0> --> there is a new object
_getCopy does this (From Zope's CopySupport.py): def _getCopy(self, container): # Ask an object for a new copy of itself. f=tempfile.TemporaryFile() self._p_jar.exportFile(self._p_oid,f) f.seek(0) ob=container._p_jar.importFile(f) f.close() return ob
I think the export and reimport creates new objects.
I think I will write my own copy method and don't use _getCopy except someone has a solution
Thank you for listening.
thomas