[Zope-dev] Zope2 OFS/CopySupport's _get_id()

Florent Guillaume fg at nuxeo.com
Mon Nov 22 11:44:37 EST 2004


+1

The copy_of_copy_of... stuff has always bugged me but I confess I never
really looked at the code.

I don't foresee any compatibility problems (any code that relies on the
fact that a copy of 'copy_of_x' is named 'copy_of_copy_of_x' surely
deserves to die).

Please post this in the Zope collector so that it doesn't get lost.

Florent

In article <200411191949.33082.alex at nexedi.com> you write:
> Hello,
> 
> While I was reading the _get_id function, I felt it was really strange :
> 
> ####
>     def _get_id(self, id):
>         # Allow containers to override the generation of
>         # object copy id by attempting to call its _get_id
>         # method, if it exists.
>         n=0
>         if (len(id) > 8) and (id[8:]=='copy_of_'):
>             n=1
>         orig_id=id
>         while 1:
>             if self._getOb(id, None) is None:
>                 return id
>             id='copy%s_of_%s' % (n and n+1 or '', orig_id)
>             n=n+1
> ####
> 
> currently, when copying and pasting an object, 'copy[0-9]*_of_' will be 
> prepended to the id (if the id is already in use in the current 
> folder). Thus, copying 'x' will create 'copy_of_x', 'copy2_of_x', etc. 
> and copying 'copy_of_x' will create 'copy_of_copy_of_x', 
> 'copy2_of_copy_of_x', etc.
> 
> What I don't get, is what the two lines between 'n=0' and 'orig_id=id' 
> are supposed to do. What they do is this : if an object id is 16 chars 
> long, and it ends with 'copy_of_' (like 'XXXXXXXXcopy_of_'), its first 
> copy will be called 'copy2_of_XXXXXXXXcopy_of_' instead of 
> 'copy_of_XXXXXXXXcopy_of_'...
> 
> What I think the author intended to do, is that, when you copy an object 
> called 'copy_of_x', the copy will be named 'copy2_of_x' instead of 
> 'copy_of_copy_of_x'.
> 
> Thus, here's a function that does the job :
> 
> ####
>   import re
>   copy_re=re.compile('^copy[0-9]*_of_')
> 
>   def _get_id(self, id):
>       # Allow containers to override the generation of
>       # object copy id by attempting to call its _get_id
>       # method, if it exists.
>       copy_match=self.copy_re.match(id)
>       if (copy_match) and (copy_match.end() < len(id)):
>           n=1
>           orig_id=self.copy_re.sub('', id)
>       else:
>           n=0
>           orig_id=id
>       while 1:
>           if self._getOb(id, None) is None:
>               return id
>           id='copy%s_of_%s' % (n and n+1 or '', orig_id)
>           n=n+1
> ####
> 
> Then, I don't know what is the preferred naming for new objects, but I 
> fear that 'copy_of_copy_of_copy_of_copy_of_copy_of_copy_of_object' will 
> quickly be too long, if objects are copied by an automated process that 
> doesn't show the Ids to the user or don't allow their modification.
> 
> What are your feelings about this ?
> 
> Regards,
> Alexandre Boeglin
> _______________________________________________
> Zope-Dev maillist  -  Zope-Dev at zope.org
> http://mail.zope.org/mailman/listinfo/zope-dev
> **  No cross posts or HTML encoding!  **
> (Related lists - 
>  http://mail.zope.org/mailman/listinfo/zope-announce
>  http://mail.zope.org/mailman/listinfo/zope )
> 


-- 
Florent Guillaume, Nuxeo (Paris, France)   CTO, Director of R&D
+33 1 40 33 71 59   http://nuxeo.com   fg at nuxeo.com


More information about the Zope-Dev mailing list