Hi, I use the the KGS of zope 3.5dev (I need Python 2.6 because of third party code i integrate) and try to build a simple site and add a local component registry using a subscriber. It looks like I missed something - or I hit a bug in zope3.5dev. But before I report a bug I want to be sure that it isnt my fault.
--- interfaces.py ------------------------------------------ class IMySite(IPossibleSite, IContainer): """My Site""" --- site.py ------------------------------------------------ from zope.interface import implements from zope.component import adapter from zope.location.interfaces import ISite from zope.site import LocalSiteManager from zope.site.site import SiteManagerContainer from zope.container.btree import BTreeContainer from zope.container.interfaces import IObjectAddedEvent from interfaces import IMySite @adapter(IMailmanSite, IObjectAddedEvent) def setSiteManagerWhenAdded(site, event): if not ISite.providedBy(site): site.setSiteManager(LocalSiteManager(site)) class MySite(SiteManagerContainer, BTreeContainer): implements(IMySite) --- configure.zcml ------------------------------------------ <configure xmlns="http://namespaces.zope.org/zope" xmlns:i18n="http://namespaces.zope.org/i18n" i18n_domain="test" > <class class=".site.MySite"> <implements interface="zope.annotation.interfaces.IAttributeAnnotatable" /> <allow attributes="getSiteManager" /> <require permission="zope.ManageServices" attributes="setSiteManager" /> <require permission="zope.View" interface="zope.app.container.interfaces.IReadContainer" /> <require permission="zope.ManageContent" interface="zope.app.container.intrfaces.IWriteContainer" /> </class> <subscriber handler=".site.setSiteManagerWhenAdded" /> </configure> ------------------------------------------------------------- Then I test this and run into a >>> from site import MySite >>> mysite = MySite() >>> from zope.app.folder import rootFolder >>> root = rootFolder() >>> root[u'mysite'] = mysite Failed example: root[u'mysite'] = mysite Exception raised: Traceback (most recent call last): File "/home/jensens/DEV/eggs/zope.testing-3.7.1-py2.6.egg/zope/ testing/doctest.py", line 1356, in __run compileflags, 1) in test.globs File "<doctest site.txt[7]>", line 1, in <module> root[u'mysite'] = mysite File "/home/jensens/DEV/eggs/zope.container-3.7.0-py2.6-linux- i686.egg/zope/container/folder.py", line 98, in __setitem__ setitem(self, self.data.__setitem__, name, object) File "/home/jensens/DEV/eggs/zope.container-3.7.0-py2.6-linux- i686.egg/zope/container/contained.py", line 590, in setitem notify(event) File "/home/jensens/DEV/eggs/zope.event-3.4.0-py2.6.egg/zope/event/ __init__.py", line 23, in notify subscriber(event) File "/home/jensens/DEV/eggs/zope.component-3.5.1-py2.6.egg/zope/ component/event.py", line 26, in dispatch for ignored in zope.component.subscribers(event, None): File "/home/jensens/DEV/eggs/zope.component-3.5.1-py2.6.egg/zope/ component/_api.py", line 131, in subscribers return sitemanager.subscribers(objects, interface) File "/home/jensens/DEV/eggs/zope.component-3.5.1-py2.6.egg/zope/ component/registry.py", line 300, in subscribers return self.adapters.subscribers(objects, provided) File "/home/jensens/DEV/eggs/zope.interface-3.5.0-py2.6-linux- i686.egg/zope/interface/adapter.py", line 535, in subscribers subscription(*objects) File "/home/jensens/DEV/eggs/zope.component-3.5.1-py2.6.egg/zope/ component/event.py", line 33, in objectEventNotify adapters = zope.component.subscribers((event.object, event), None) File "/home/jensens/DEV/eggs/zope.component-3.5.1-py2.6.egg/zope/ component/_api.py", line 131, in subscribers return sitemanager.subscribers(objects, interface) File "/home/jensens/DEV/eggs/zope.component-3.5.1-py2.6.egg/zope/ component/registry.py", line 300, in subscribers return self.adapters.subscribers(objects, provided) File "/home/jensens/DEV/eggs/zope.interface-3.5.0-py2.6-linux- i686.egg/zope/interface/adapter.py", line 535, in subscribers subscription(*objects) File "/home/jensens/DEV/eggs/zope.site-3.6.0-py2.6.egg/zope/site/ site.py", line 256, in changeSiteConfigurationAfterMove site.getSiteManager().__bases__ = (next, ) File "/home/jensens/DEV/eggs/zope.component-3.5.1-py2.6.egg/zope/ component/registry.py", line 65, in <lambda> lambda self, bases: self._setBases(bases), File "/home/jensens/DEV/eggs/zope.site-3.6.0-py2.6.egg/zope/site/ site.py", line 161, in _setBases super(LocalSiteManager, self)._setBases(bases) File "/home/jensens/DEV/eggs/zope.component-3.5.1-py2.6.egg/zope/ component/registry.py", line 58, in _setBases base.adapters for base in bases]) AttributeError: 'NoneType' object has no attribute 'adapters' It calls the subscriber, adds the LocalSiteManager and then another event happens and the subscriber zope.site.site.changeSiteConfigurationAfterMove is called (line 251). Here is the code in there: if event.newParent is not None: next = _findNextSiteManager(site) site.getSiteManager().__bases__ next is None here, so __bases__ has a None in the list. Btw., the way the sitemanager is added is the same as described in Phillip von Weiterhausens book. Whats wrong? thanks for hints! -- Jens W. Klein, BlueDynamics Alliance, http://bluedynamics.com _______________________________________________ Zope3-users mailing list Zope3-users@zope.org http://mail.zope.org/mailman/listinfo/zope3-users