[Zope3-dev] help with directlyProvides

Jean-Marc Orliaguet jmo at ita.chalmers.se
Mon May 8 04:27:32 EDT 2006


Dominik Huber wrote:
> 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
>
>

by what I can tell, it's the ContainedProxy line:

object = ContainedProxy(object)

that removes all directly provided interfaces on all types of objects 
not just files. With folders ContainedProxy() is not called.

/JM


More information about the Zope3-dev mailing list