[z3-checkins] r9776 - in z3/Five/branch/paris-local-sitemanager-branch: . tests

dreamcatcher at codespeak.net dreamcatcher at codespeak.net
Tue Mar 15 10:18:44 MET 2005


Author: dreamcatcher
Date: Tue Mar 15 10:18:43 2005
New Revision: 9776

Modified:
   z3/Five/branch/paris-local-sitemanager-branch/__init__.py
   z3/Five/branch/paris-local-sitemanager-branch/configure.zcml
   z3/Five/branch/paris-local-sitemanager-branch/fiveconfigure.py
   z3/Five/branch/paris-local-sitemanager-branch/fivedirectives.py
   z3/Five/branch/paris-local-sitemanager-branch/interfaces.py
   z3/Five/branch/paris-local-sitemanager-branch/meta.zcml
   z3/Five/branch/paris-local-sitemanager-branch/tests/test_localservice.py
   z3/Five/branch/paris-local-sitemanager-branch/traversable.py
Log:

- New five:localsitehook directive to enable a folder to act as a local ISite
- Add/Remove Local Site Hook from the ZMI
- Use an adapter to actually do the work of returning the SiteManager


Modified: z3/Five/branch/paris-local-sitemanager-branch/__init__.py
==============================================================================
--- z3/Five/branch/paris-local-sitemanager-branch/__init__.py	(original)
+++ z3/Five/branch/paris-local-sitemanager-branch/__init__.py	Tue Mar 15 10:18:43 2005
@@ -25,3 +25,13 @@
 
 def initialize(context):
     zcml.load_site()
+
+    import traversable
+    context.registerClass(
+        meta_type='Five: Add Local Site Hook',
+        permission='Manage Access Rules',
+        constructors=(traversable.manage_addLocalSiteHook,))
+    context.registerClass(
+        meta_type='Five: Remove Local Site Hook',
+        permission='Manage Access Rules',
+        constructors=(traversable.manage_removeLocalSiteHook,))

Modified: z3/Five/branch/paris-local-sitemanager-branch/configure.zcml
==============================================================================
--- z3/Five/branch/paris-local-sitemanager-branch/configure.zcml	(original)
+++ z3/Five/branch/paris-local-sitemanager-branch/configure.zcml	Tue Mar 15 10:18:43 2005
@@ -97,7 +97,7 @@
 
 
   <!-- enough to bootstrap the machinery to lookup local services -->
-  <!--
+  <include package="zope.configuration" file="meta.zcml" />
   <hook
       module="zope.component"
       name="getServices"
@@ -109,7 +109,6 @@
       name="adapter_hook"
       implementation="zope.app.component.hooks.adapter_hook"
       />
-  -->
 
   <adapter
       factory=".adapter.serviceServiceAdapter"
@@ -127,4 +126,8 @@
       for="zope.app.publication.interfaces.IEndRequestEvent"
       />
 
+  <five:localsitehook
+      class="OFS.ObjectManager.ObjectManager"
+      />
+
 </configure>

Modified: z3/Five/branch/paris-local-sitemanager-branch/fiveconfigure.py
==============================================================================
--- z3/Five/branch/paris-local-sitemanager-branch/fiveconfigure.py	(original)
+++ z3/Five/branch/paris-local-sitemanager-branch/fiveconfigure.py	Tue Mar 15 10:18:43 2005
@@ -21,6 +21,7 @@
 from zope.app.component.interface import provideInterface
 from viewable import Viewable
 from traversable import Traversable
+from traversable import FiveSite
 from bridge import fromZ2Interface
 from browserconfigure import page
 
@@ -195,4 +196,20 @@
         page(_context, name=name, permission=permission,
              layer=layer, for_=for_, template=fname)
 
+def classFiveSiteHook(class_):
+    if hasattr(class_, '__five_possible_site__'):
+        if (hasattr(class_, 'getSiteManager') and
+            isFiveMethod(class_.getSiteManager)):
+            return
+    setattr(class_, 'getSiteManager',
+            FiveSite.getSiteManager.im_func)
+    setattr(class_, 'setSiteManager',
+            FiveSite.setSiteManager.im_func)
+    setattr(class_, '__five_possible_site__', True)
 
+def installFiveSiteHook(_context, class_):
+    _context.action(
+        discriminator = None,
+        callable = classFiveSiteHook,
+        args=(class_,)
+        )

Modified: z3/Five/branch/paris-local-sitemanager-branch/fivedirectives.py
==============================================================================
--- z3/Five/branch/paris-local-sitemanager-branch/fivedirectives.py	(original)
+++ z3/Five/branch/paris-local-sitemanager-branch/fivedirectives.py	Tue Mar 15 10:18:43 2005
@@ -99,3 +99,14 @@
         description=u"The directory containing the resource data.",
         required=True
         )
+
+class IFiveLocalSiteHook(Interface):
+    """Make instances of class hookable for Local Site.
+
+    Actual implementation of ISite is delegated to a IFiveSite adapter.
+    """
+    class_ = GlobalObject(
+        title=u"Class",
+        required=True
+        )
+

Modified: z3/Five/branch/paris-local-sitemanager-branch/interfaces.py
==============================================================================
--- z3/Five/branch/paris-local-sitemanager-branch/interfaces.py	(original)
+++ z3/Five/branch/paris-local-sitemanager-branch/interfaces.py	Tue Mar 15 10:18:43 2005
@@ -19,6 +19,7 @@
 from zope.interface import Interface, Attribute
 from zope.interface.interfaces import IInterface
 from zope.schema import Bool, BytesLine, Tuple
+from zope.app.site.interfaces import ISite
 
 try:
     from persistent.interfaces import IPersistent
@@ -26,6 +27,10 @@
     class IPersistent(Interface):
         """Persistent object"""
 
+class IFiveSite(ISite):
+    """Five specialization of ISite
+    """
+
 class IPersistentExtra(Interface):
 
     def bobobase_modification_time():
@@ -1230,4 +1235,4 @@
     Menu item types are interfaces that define classes of
     menu items.
     """
-        
\ No newline at end of file
+        

Modified: z3/Five/branch/paris-local-sitemanager-branch/meta.zcml
==============================================================================
--- z3/Five/branch/paris-local-sitemanager-branch/meta.zcml	(original)
+++ z3/Five/branch/paris-local-sitemanager-branch/meta.zcml	Tue Mar 15 10:18:43 2005
@@ -272,6 +272,12 @@
        handler=".fiveconfigure.bridge"
        />
 
+    <meta:directive
+       name="localsitehook"
+       schema=".fivedirectives.IFiveLocalSiteHook"
+       handler=".fiveconfigure.installFiveSiteHook"
+       />
+
   </meta:directives>
 
 </configure>

Modified: z3/Five/branch/paris-local-sitemanager-branch/tests/test_localservice.py
==============================================================================
--- z3/Five/branch/paris-local-sitemanager-branch/tests/test_localservice.py	(original)
+++ z3/Five/branch/paris-local-sitemanager-branch/tests/test_localservice.py	Tue Mar 15 10:18:43 2005
@@ -7,7 +7,7 @@
 from Testing import ZopeTestCase
 ZopeTestCase.installProduct('Five')
 
-from zope.component import getGlobalServices
+from zope.component import getGlobalServices, getServices
 from zope.app.component.hooks import getServices_hook
 from zope.app.site.interfaces import IPossibleSite, ISite, ISiteManager
 from zope.app.traversing.interfaces import IContainmentRoot
@@ -36,6 +36,9 @@
 
     sm = None
 
+    def getId(self):
+        return self.id
+
     def getSiteManager(self, default=None):
         return self.sm
 
@@ -248,10 +251,40 @@
 
         self.assertEqual(getSite(), None)
 
+class BeforeTraversalTest(ZopeTestCase.FunctionalTestCase):
+
+    def beforeTearDown(self):
+        from zope.app.component.localservice import clearSite
+        clearSite()
+
+    def test_before_traversal_event(self):
+        self.folder.manage_addProduct['Five'].manage_addLocalSiteHook()
+        path = '/'.join(self.folder.getPhysicalPath())
+        response = self.publish(path)
+        self.assertEqual(getSite(), self.folder)
+
+    def test_before_traversal_event_and_hook(self):
+        f1 = Folder()
+        f1.id = 'f1'
+        self.folder._setObject('f1', f1)
+        f1 = self.folder._getOb('f1')
+        ss = ServiceServiceStub()
+        f1.setSiteManager(ss)
+        f1.manage_addProduct['Five'].manage_addLocalSiteHook()
+        path = '/'.join(f1.getPhysicalPath())
+        response = self.publish(path)
+        self.assertEqual(getServices(), ss)
+
+    def test_no_before_traversal_event(self):
+        path = '/'.join(self.folder.getPhysicalPath())
+        response = self.publish(path)
+        self.assertEqual(getSite(), None)
+
 
 def test_suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(Test))
+    suite.addTest(unittest.makeSuite(BeforeTraversalTest))
     return suite
 
 if __name__ == '__main__':

Modified: z3/Five/branch/paris-local-sitemanager-branch/traversable.py
==============================================================================
--- z3/Five/branch/paris-local-sitemanager-branch/traversable.py	(original)
+++ z3/Five/branch/paris-local-sitemanager-branch/traversable.py	Tue Mar 15 10:18:43 2005
@@ -11,17 +11,27 @@
 $Id$
 """
 from zExceptions import NotFound
+from zope.event import notify
 from zope.exceptions import NotFoundError
 from zope.component import getView, ComponentLookupError
 from zope.interface import implements
+from zope.interface import directlyProvides, directlyProvidedBy
 from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.security.management import thread_local
+from zope.app.site.interfaces import ISite
 from zope.app.traversing.interfaces import ITraverser, ITraversable
 from zope.app.traversing.adapters import DefaultTraversable
 from zope.app.traversing.adapters import traversePathElement
+from zope.app.publication.zopepublication import BeforeTraverseEvent
 from monkey import DebugFlags
+from interfaces import IFiveSite
 
-from zope.security.management import thread_local
+from Globals import MessageDialog
 from AccessControl import getSecurityManager
+from ExtensionClass import Base
+from Products.SiteAccess.AccessRule import AccessRule
+from ZPublisher.BeforeTraverse import registerBeforeTraverse
+from ZPublisher.BeforeTraverse import unregisterBeforeTraverse
 
 _marker = object
 
@@ -111,3 +121,65 @@
             pass
         # If a view can't be found, then use default traversable
         return super(FiveTraversable, self).traverse(name, furtherPath)
+
+class FiveSite:
+
+    def getSiteManager(self):
+        adapted = IFiveSite(self, None)
+        if adapted is None:
+            return None
+        return adapted.getSiteManager()
+
+    def setSiteManager(self, sm):
+        adapted = IFiveSite(self, None)
+        if adapted is None:
+            return None
+        return adapted.setSiteManager(sm)
+
+HOOK_NAME = '__local_site_hook__'
+
+class LocalSiteHook(Base):
+
+    meta_type = 'Five Local Site Hook'
+
+    def __call__(self, container, request):
+        notify(BeforeTraverseEvent(container, request))
+
+
+def manage_addLocalSiteHook(self, REQUEST=None, **ignored):
+    """Install __before_traverse__ hook for Local Site
+    """
+    # We want the original object, not stuff in between, and no acquisition
+    self = self.this()
+    self = getattr(self, 'aq_base', self)
+
+    hook = AccessRule(HOOK_NAME)
+    registerBeforeTraverse(self, hook, HOOK_NAME, 1)
+
+    if not hasattr(self, HOOK_NAME):
+        setattr(self, HOOK_NAME, LocalSiteHook())
+
+    directlyProvides(self, ISite, directlyProvidedBy(self))
+
+    if REQUEST is not None:
+        return MessageDialog(
+            title='Local Site Hook',
+            message='Local Site Hook has been enabled for this object',
+            action='%s/manage_main' % REQUEST['URL1'])
+
+def manage_removeLocalSiteHook(self, REQUEST=None, **ignored):
+    """Remove __before_traverse__ hook for Local Site
+    """
+    # We want the original object, not stuff in between, and no acquisition
+    self = self.this()
+    self = getattr(self, 'aq_base', self)
+
+    rules = unregisterBeforeTraverse(self, HOOK_NAME)
+    if hasattr(self, HOOK_NAME):
+        delattr(self, HOOK_NAME)
+
+    if REQUEST is not None:
+        return MessageDialog(
+            title='Local Site Hook',
+            message='Local Site Hook has been disabled for this object',
+            action='%s/manage_main' % REQUEST['URL1'])


More information about the z3-checkins mailing list