[Zope-dev] Re: [Zope] Object Links/references and Zope 2.6
Mario Valente
mvalente@ruido-visual.pt
Fri, 08 Mar 2002 20:32:32 +0000
Hi:
Regarding my previous proposal.....
> I would like to propose my "Paste Reference"/symlink hack for
> inclusion into Zope 2.6
>
And referring to my previous msg.....
At 19:04 07-08-2001 +0100, Mario Valente wrote:
> As discussed previously by others (re: object references) and
> asked by myself: I had the need to be able to refer to objects
> from different points of the folder hierarchy without duplicating
> those objects.
>
> - edited CopySupport.py
> - copied the manage_pasteObjects method to a manage_pasteMonikers
> method
> - commented the #ob=ob._getCopy(self) line (the duplicate object part)
> - added a "Paste Ref" button to the lib/python/OFS/dtml/main.dtml file that
> calls the pasteMonikers method
>
> """
> <input class="form-element" type="submit"
name="manage_pasteMonikers:method"
> value="Paste Ref." />
> """
> Issues/TODO
>
> - find a way to distinguish references from the original (tried to change
> the meta_type at paste time but no luck). At least the meta_type/icon
>should
> change to provide a visual cue.
> - provide tool(s) to find impact of changing a reference. Provide a link
>from a
> reference object to the original. Provide a link from an object to its
>several
> references.
>
I have now solved the issues/TODO. I now have implemented a way
to distinguish references from the original. Links have a name like
"copy_of_XXXX" but instead its "shortcut_to_XXX" and they also have
a different metatype and a different icon. There's also crude management
screens to get to the original object.
Here's the *major* hack :-) (its such a kludge that even I am shocked :-)
But it serves to demonstrate the purpose.
Like previously described I edited CopySupport.py and created a
new method called pasteMonikers. This method is accessed by the
interface button referred above.
The coding difference is that this method now creates a *new* object
(instead of copying the old one, which is the semantics of usual Copy/Paste,
and instead of using the original object, which is the semantics of the
PasteReference I created and described before).
This is the relevant piece of code:
#ob=ob._getCopy(self)
id=self._get_linkid(ob.getId())
ob = SimpleItem.ItemShortcut(ob)
ob._setId(id)
self._setObject(id, ob)
ob = self._getOb(id)
ob.manage_afterClone(ob)
As you can see a new id is created for the new object (method
_get_linkid is identical to method get_id but returns ids with the
format "shortcut_to_%s") and a new object of class ItemShortcut
is created and pasted into the current folder.
The ItemShortcut class was created at the SimpleItem.py file
and its basically a Proxy pattern.
This is the relevant code, added at the end of SimpleItem.py:
class ItemShortcut(SimpleItem):
"""Proxying class for shortcut implementation
"""
meta_type = "Shortcut"
icon ='shortcut.gif'
manage_options= SimpleItem.manage_options + (
{'label':'View',
'action':'index_html',
'help':''},
)
manage_options= SimpleItem.manage_options + (
{'label':'Properties',
'action':'manage_properties',
'help':''},
)
#__ac_permissions__=(('View', ()),)
__ac_permissions__=(('View', ('__call__', '')),)
def __init__(self, obj=None):
self.__obj__ = obj
def __repr__(self):
return "Proxy for "+`self.__obj__`
def index_html(self):
"""Proxying class for shortcut implementation
"""
return self.__obj__.__call__()
def manage_properties(self):
"""Proxying class for shortcut implementation
"""
return """<HTML><head></head>
<body>
Shortcut for """+`self.__obj__`+"""
<p>
<a href="""+`self.__obj__.absolute_url()`+""">View
original object</a>
<p>
<a
href="""+self.__obj__.absolute_url()+"""/manage_workspace>Edit original
object</a>
</body></html>"""
Once again, this is just proof of concept, and should be correctly
(read 'nicely' :-) implemented for Zope 2.6.
C U!
-- Mario Valente