[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