[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