On 6/29/06, Florent Guillaume <[EMAIL PROTECTED]> wrote:
Unfortunately the proxies rely on acquisition to get proper skins, so
zope 3 views can't be used directly.

It's working for me, using Five.  I'm using Zope 2.9.x, so acquisition
is still implicit.

On the other hand, you can create a specific view for ICPSProxy that
knows that it deals with a proxy and not a doc so can do getContent()
at the appropriate place. But this view will be for all proxies, not
just those of your docs.

This whole system was designed before anything like zope 3 views
existed, it's not easy to retrofit it now.

It's probably possible to make a proxy provide a specific interface
after it's been created, the have your view use that. You could try
prototyping it by adding the interface on one proxy from the ZMI
(Interface tab, you'll have to define a marker interface for your use
and bind the view to it) and check the view works.

Florent

Sure, it works fine !!   And it seems very useful to me, so I can
register views using ZCML and apply them to the proxies, but only to
those proxies proxying an object that implements the wanted interface.

If you are interested, with this little code all this is done automatically:


from Products.CPSCore.interfaces import ICPSProxy
from Products.Five.utilities.interfaces import IReadInterface, IWriteInterface

def addProxiedInterfaces(proxy, event):
   """
   Register all interfaces provided by proxied object as proxy own interfaces
   If proxied is None, is due to the proxy is created before the
proxied object
   itself
   """
   proxied = proxy.getContent()
   if proxied:
       proxy_adapter = IWriteInterface(proxy)
       proxied_adapter = IReadInterface(proxied)
       proxy_adapter.update(add=tuple(proxied_adapter.getProvided()))


def addInterfacesToAllProxies(proxied, event):
   """
   Register all interfaces provided by proxied to all its proxies
   """
   docid = proxied.getId().split('_')[0]
   all_proxies = proxied.portal_proxies.listProxies(docid=docid)
   proxied_adapter = IReadInterface(proxied)
   interfaces = tuple(proxied_adapter.getProvided())
   for x in all_proxies:
       proxy = proxied.unrestrictedTraverse(x[0])
       proxy_adapter = IWriteInterface(proxy)
       proxy_adapter.update(add=interfaces)


And in configure.zcml:

   <subscriber
       for="Products.CPSCore.interfaces.ICPSProxy
            zope.app.container.interfaces.IObjectAddedEvent"
       factory=".proxy.addProxiedInterfaces"
       />

   <subscriber
       for="Products.CPSDocument.interfaces.ICPSDocument
            zope.app.container.interfaces.IObjectAddedEvent"
       factory=".proxy.addInterfacesToAllProxies"
       />


Thanks a lot for your help
--
Santi Camps
Earcon S.L. - http://www.earcon.com
                 - http://www.kmkey.com
_______________________________________________
cps-devel mailing list
http://lists.nuxeo.com/mailman/listinfo/cps-devel

Reply via email to