[Zope3-dev] help with directlyProvides

Dominik Huber dominik.huber at perse.ch
Mon May 8 02:43:02 EDT 2006


luis wrote:
> Jean-Marc Orliaguet wrote:
>
>   
>> luis wrote:
>>
>> are you sure? I tried with:
>>
>> jmo at localhost ~/Zope3/src $ python2.4
>> Python 2.4.2 (#1, Dec  4 2005, 15:28:38)
>> Type "help", "copyright", "credits" or "license" for more information.
>>  >>> from zope.app.file import file
>>  >>> f = file.File()
>>  >>> f
>> <zope.app.file.file.File object at 0xb7cbad2c>
>>  >>> import zope.interface
>>  >>> class IMarker(zope.interface.Interface):
>> ...          """Marker interface"""
>> ...
>>  >>> zope.interface.directlyProvides(f, IMarker)
>>  >>> list(zope.interface.directlyProvidedBy(f))
>> [<InterfaceClass __main__.IMarker>]
>>  >>> IMarker.providedBy(f)
>> True
>>     
>
> yes.. that's why I say that it seems very strange... the call to
> directlyProvides works as you show with your example, ... *but*, after you
> add your file to a folder, something removes the IMarker interface (or it
> doesn't get saved for some reason )
>
> directlyProvides( f, IMarker )
> if not IMarker.providedBy( f ):
>         raise Error
> myfolder['f'] = f
>
> if you put something like that in an Adding-Form, no exception is raised and
> the object "f" is added to the container. so the directlyProvides does
> work...but then, if you take a look at the object "f" in the zmi
> introspector, you will see something like:
>         
>         DirectlyProvided interfaces
>                 <nothing>
>
> so what I'm saying is not that directlyProvides doesnt work, but that
> provided-list gets lost somewhere on the way into the database... (but if f
> is  a Folder, then the provided-list is kept )
>
> luis
>   
If there is a bug in the container framework my assumption would be that 
that the following part of code causes your problem. The regular 
container asserts IContained either by the directlyProvides mechanism if 
the item provides ILocation or else by a ContainedProxy.

zope.app.container.contained line 325:
   [...]
    if not IContained.providedBy(object):
        if ILocation.providedBy(object):
            zope.interface.directlyProvides(
                object, IContained,
                zope.interface.directlyProvidedBy(object))
        else:
            object = ContainedProxy(object)
   [...]

First try to provide IContained to your File implementation using the 
following zcml entry:

<class class=".to.your.File" >
  <implements =".zope.app.container.interfaces.IContained" />
</class>

That should solve the problem.

If yes, could you track down if the problem: Is it caused by the 
directlyProvided mechanism or by the ContainedProxy?

(If no, perhaps a persistency problem?)

Regards,
Dominik





>
> _______________________________________________
> Zope3-dev mailing list
> Zope3-dev at zope.org
> Unsub: http://mail.zope.org/mailman/options/zope3-dev/dominik.huber%40perse.ch
>
>   


More information about the Zope3-dev mailing list