# Copyright (c) 2005 gocept gmbh & co. kg def getParentByInterface(obj, interface): """Get the first parent of obj which implements interface. Parent means an object along the path between object and containment root. Returns None if no parent implementing the interface is found. Caution: If ojb itself provides interface it is not returned (only parents are taken into account.) Testing: Define some interfaces. >>> from zope.interface import Interface, directlyProvides >>> class IFace1(Interface): ... pass >>> class IFace2(Interface): ... pass Create some objects.. >>> from zope.app.testing import setup >>> root = setup.buildSampleFolderTree() Set the interfaces on some objects. >>> directlyProvides(root[u'folder1'], IFace1, IFace2) >>> directlyProvides(root[u'folder1'][u'folder1_1'], IFace1) Patch Folder to get usable __repr__ strings >>> def my_folder_repr(self): ... return '' % self.__name__ >>> from zope.app.folder.folder import Folder >>> Folder.__repr__ = my_folder_repr Do testing. >>> child = root[u'folder1'][u'folder1_1'][u'folder1_1_2'] >>> child2 = root[u'folder2'][u'folder2_1'][u'folder2_1_1'] >>> getParentByInterface(child, IFace1) >>> getParentByInterface(child, IFace2) >>> getParentByInterface(getParentByInterface(child, IFace1), IFace1) >>> getParentByInterface(root, IFace1) is None True >>> getParentByInterface(child2, IFace2) is None True >>> getParentByInterface(object(), IFace2) Traceback (most recent call last): ... AttributeError: 'object' object has no attribute '__parent__' """ for parent in zapi.getParents(obj): if interface.providedBy(parent): return parent return None