[Checkins] SVN: zope.site/trunk/ The relation between SiteManagerContainer and LocalSiteManager is a
Wolfgang Schnerring
wosc at wosc.de
Mon Jul 27 09:06:25 EDT 2009
Log message for revision 102343:
The relation between SiteManagerContainer and LocalSiteManager is a
kind of containment hierarchy, but it is not expressed via containment,
but rather via an attribute (_sm).
When the parent is deleted, this needs to be propagated to the children,
and since we don't have "real" containment, we need to do that manually.
Changed:
U zope.site/trunk/CHANGES.txt
U zope.site/trunk/src/zope/site/configure.zcml
A zope.site/trunk/src/zope/site/ftesting.zcml
U zope.site/trunk/src/zope/site/site.py
U zope.site/trunk/src/zope/site/testing.py
A zope.site/trunk/src/zope/site/tests/test_sitemanagercontainer.py
-=-
Modified: zope.site/trunk/CHANGES.txt
===================================================================
--- zope.site/trunk/CHANGES.txt 2009-07-27 13:01:19 UTC (rev 102342)
+++ zope.site/trunk/CHANGES.txt 2009-07-27 13:06:25 UTC (rev 102343)
@@ -5,7 +5,8 @@
3.6.3 (unreleased)
------------------
-- ...
+- Propagate an ObjectRemovedEvent to the SiteManager upon removal of a
+ SiteManagerContainer.
3.6.2 (2009-07-24)
------------------
Modified: zope.site/trunk/src/zope/site/configure.zcml
===================================================================
--- zope.site/trunk/src/zope/site/configure.zcml 2009-07-27 13:01:19 UTC (rev 102342)
+++ zope.site/trunk/src/zope/site/configure.zcml 2009-07-27 13:06:25 UTC (rev 102343)
@@ -97,4 +97,5 @@
factory=".folder.FolderSublocations"
/>
+ <subscriber handler=".site.siteManagerContainerRemoved" />
</configure>
Added: zope.site/trunk/src/zope/site/ftesting.zcml
===================================================================
--- zope.site/trunk/src/zope/site/ftesting.zcml (rev 0)
+++ zope.site/trunk/src/zope/site/ftesting.zcml 2009-07-27 13:06:25 UTC (rev 102343)
@@ -0,0 +1,12 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope">
+
+ <include package="zope.component" file="meta.zcml"/>
+ <include package="zope.security" file="meta.zcml"/>
+
+ <include package="zope.component"/>
+ <include package="zope.security"/>
+
+ <include package="zope.container"/>
+ <include package="zope.site"/>
+</configure>
\ No newline at end of file
Modified: zope.site/trunk/src/zope/site/site.py
===================================================================
--- zope.site/trunk/src/zope/site/site.py 2009-07-27 13:01:19 UTC (rev 102342)
+++ zope.site/trunk/src/zope/site/site.py 2009-07-27 13:06:25 UTC (rev 102343)
@@ -225,3 +225,25 @@
if next is None:
next = zope.component.getGlobalSiteManager()
site.getSiteManager().__bases__ = (next, )
+
+
+ at zope.component.adapter(
+ SiteManagerContainer,
+ zope.container.interfaces.IObjectRemovedEvent)
+def siteManagerContainerRemoved(container, event):
+ # The relation between SiteManagerContainer and LocalSiteManager is a
+ # kind of containment hierarchy, but it is not expressed via containment,
+ # but rather via an attribute (_sm).
+ #
+ # When the parent is deleted, this needs to be propagated to the children,
+ # and since we don't have "real" containment, we need to do that manually.
+
+ try:
+ sm = container.getSiteManager()
+ except ComponentLookupError:
+ pass
+ else:
+ zope.event.notify(zope.container.contained.ObjectRemovedEvent(
+ sm, container))
+
+
Modified: zope.site/trunk/src/zope/site/testing.py
===================================================================
--- zope.site/trunk/src/zope/site/testing.py 2009-07-27 13:01:19 UTC (rev 102342)
+++ zope.site/trunk/src/zope/site/testing.py 2009-07-27 13:06:25 UTC (rev 102343)
@@ -13,14 +13,18 @@
##############################################################################
"""Reusable functionality for testing site-related code
"""
+import os.path
+import zope.app.testing.functional
import zope.component
+import zope.container.interfaces
import zope.site.hooks
+import zope.site.site
from zope.app.testing.placelesssetup import setUp as placelessSetUp
from zope.app.testing.placelesssetup import tearDown as placelessTearDown
from zope.component.interfaces import IComponentLookup
from zope.interface import Interface
from zope.location.interfaces import ISite
-from zope.site import LocalSiteManager, SiteManagerAdapter
+from zope.site import LocalSiteManager, SiteManagerAdapter, SiteManagerContainer
from zope.site.folder import rootFolder
from zope.site.hooks import setSite
@@ -59,3 +63,13 @@
placelessTearDown()
zope.site.hooks.resetHooks()
zope.site.hooks.setSite()
+
+
+layer = zope.app.testing.functional.ZCMLLayer(
+ os.path.join(os.path.dirname(__file__), 'ftesting.zcml'),
+ __name__, 'layer')
+
+
+class FunctionalTestCase(zope.app.testing.functional.FunctionalTestCase):
+
+ layer = layer
Added: zope.site/trunk/src/zope/site/tests/test_sitemanagercontainer.py
===================================================================
--- zope.site/trunk/src/zope/site/tests/test_sitemanagercontainer.py (rev 0)
+++ zope.site/trunk/src/zope/site/tests/test_sitemanagercontainer.py 2009-07-27 13:06:25 UTC (rev 102343)
@@ -0,0 +1,75 @@
+#############################################################################
+#
+# Copyright (c) 2009 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+
+import unittest
+import zope.app.testing.functional
+import zope.component
+import zope.container.interfaces
+import zope.site.folder
+import zope.site.site
+import zope.site.testing
+
+
+class Dummy(object):
+ pass
+
+
+removed_called = False
+def removed_event(obj, event):
+ global removed_called
+ removed_called = True
+
+
+class SiteManagerContainerTest(zope.site.testing.FunctionalTestCase):
+
+ def setUp(self):
+ super(SiteManagerContainerTest, self).setUp()
+
+ self.root = zope.site.folder.rootFolder()
+
+ global removed_called
+ removed_called = False
+ zope.component.getSiteManager().registerHandler(
+ removed_event,
+ (Dummy, zope.container.interfaces.IObjectRemovedEvent))
+
+ def removed_event(self, event):
+ self.removed_called = True
+
+ def test_delete_smc_should_propagate_removed_event(self):
+ container = zope.site.site.SiteManagerContainer()
+ self.root['container'] = container
+
+ zope.site.testing.createSiteManager(container)
+ container.getSiteManager()['child'] = Dummy()
+
+ del self.root['container']
+ self.assert_(removed_called)
+
+ def test_delete_when_smc_has_no_sitemanager(self):
+ container = zope.site.site.SiteManagerContainer()
+ self.root['container'] = container
+
+ try:
+ del self.root['container']
+ except Exception, e:
+ self.fail(e)
+
+
+def test_suite():
+ return unittest.makeSuite(SiteManagerContainerTest)
More information about the Checkins
mailing list