[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