[Checkins] SVN: zope.app.publisher/trunk/ make it possible to
override menus: this was not possible because new
Juergen Kartnaller
juergen at kartnaller.at
Tue Nov 27 14:59:01 EST 2007
Log message for revision 81993:
make it possible to override menus: this was not possible because new
interfaces where created any time a menu with the same name was created.
Changed:
U zope.app.publisher/trunk/CHANGES.txt
U zope.app.publisher/trunk/src/zope/app/publisher/browser/menumeta.py
U zope.app.publisher/trunk/src/zope/app/publisher/browser/tests/support.py
U zope.app.publisher/trunk/src/zope/app/publisher/browser/tests/test_directives.py
-=-
Modified: zope.app.publisher/trunk/CHANGES.txt
===================================================================
--- zope.app.publisher/trunk/CHANGES.txt 2007-11-27 19:57:29 UTC (rev 81992)
+++ zope.app.publisher/trunk/CHANGES.txt 2007-11-27 19:59:00 UTC (rev 81993)
@@ -5,6 +5,12 @@
3.5.0 (???)
===========
+3.5.0a3 (2007-11-27)
+====================
+
+- make it possible to override menus: this was not possible because new
+ interfaces where created any time a menu with the same name was created.
+
- Resolve ``ZopeSecurityPolicy`` deprecation warning.
3.5.0a2 (2007-08-23)
Modified: zope.app.publisher/trunk/src/zope/app/publisher/browser/menumeta.py
===================================================================
--- zope.app.publisher/trunk/src/zope/app/publisher/browser/menumeta.py 2007-11-27 19:57:29 UTC (rev 81992)
+++ zope.app.publisher/trunk/src/zope/app/publisher/browser/menumeta.py 2007-11-27 19:59:00 UTC (rev 81993)
@@ -52,13 +52,18 @@
"You must specify the 'id' or 'interface' attribute.")
if interface is None:
- interface = InterfaceClass(id, (),
- __doc__='Menu Item Type: %s' %id,
- __module__='zope.app.menus')
- # Add the menu item type to the `menus` module.
- # Note: We have to do this immediately, so that directives using the
- # MenuField can find the menu item type.
- setattr(menus, id, interface)
+ if id in dir(menus):
+ # reuse existing interfaces for the id, without this we are not
+ # able to override menus.
+ interface = getattr(menus, id)
+ else:
+ interface = InterfaceClass(id, (),
+ __doc__='Menu Item Type: %s' %id,
+ __module__='zope.app.menus')
+ # Add the menu item type to the `menus` module.
+ # Note: We have to do this immediately, so that directives using the
+ # MenuField can find the menu item type.
+ setattr(menus, id, interface)
path = 'zope.app.menus.' + id
else:
path = interface.__module__ + '.' + interface.getName()
Modified: zope.app.publisher/trunk/src/zope/app/publisher/browser/tests/support.py
===================================================================
--- zope.app.publisher/trunk/src/zope/app/publisher/browser/tests/support.py 2007-11-27 19:57:29 UTC (rev 81992)
+++ zope.app.publisher/trunk/src/zope/app/publisher/browser/tests/support.py 2007-11-27 19:59:00 UTC (rev 81993)
@@ -22,6 +22,8 @@
from zope.app.component.hooks import setSite
from zope.app.component.interfaces import ISite
+from zope.app.publisher.browser.menu import BrowserMenu
+
class Site:
implements(ISite, IContainmentRoot)
@@ -40,3 +42,7 @@
def tearDown(self):
setSite()
super(SiteHandler, self).tearDown()
+
+class M1(BrowserMenu):
+ pass
+
Modified: zope.app.publisher/trunk/src/zope/app/publisher/browser/tests/test_directives.py
===================================================================
--- zope.app.publisher/trunk/src/zope/app/publisher/browser/tests/test_directives.py 2007-11-27 19:57:29 UTC (rev 81992)
+++ zope.app.publisher/trunk/src/zope/app/publisher/browser/tests/test_directives.py 2007-11-27 19:59:00 UTC (rev 81993)
@@ -15,6 +15,8 @@
$Id$
"""
+
+import sys
import os
import unittest
from cStringIO import StringIO
@@ -31,8 +33,8 @@
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.publisher.interfaces.browser import IBrowserSkinType, IDefaultSkin
from zope.security.proxy import removeSecurityProxy, ProxyFactory
-from zope.security.permission import Permission
-from zope.security.interfaces import IPermission
+from zope.security.permission import Permission
+from zope.security.interfaces import IPermission
from zope.testing.doctestunit import DocTestSuite
from zope.traversing.adapters import DefaultTraversable
from zope.traversing.interfaces import ITraversable
@@ -42,7 +44,7 @@
from zope.app.publisher.browser.fileresource import FileResource
from zope.app.publisher.browser.i18nfileresource import I18nFileResource
from zope.app.publisher.browser.menu import getFirstMenuItem
-from zope.app.publisher.interfaces.browser import IMenuItemType
+from zope.app.publisher.interfaces.browser import IMenuItemType, IBrowserMenu
from zope.app.testing import placelesssetup, ztapi
tests_path = os.path.join(
@@ -123,6 +125,11 @@
XMLConfig('meta.zcml', zope.app.publisher.browser)()
ztapi.provideAdapter(None, ITraversable, DefaultTraversable)
+ def tearDown(self):
+ if 'test_menu' in dir(sys.modules['zope.app.menus']):
+ delattr(sys.modules['zope.app.menus'], 'test_menu')
+ super(Test, self).tearDown()
+
def testPage(self):
self.assertEqual(
component.queryMultiAdapter((ob, request), name='test'),
@@ -143,13 +150,48 @@
v = component.queryMultiAdapter((ob, request), name='test')
self.assert_(issubclass(v.__class__, V1))
+ def testMenuOverride(self):
+ self.assertEqual(
+ component.queryMultiAdapter((ob, request), name='test'),
+ None)
+ testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
+
+ xmlconfig(StringIO(template % (
+ '''
+ <browser:menu
+ id="test_menu" title="Test menu" />
+ <browser:page
+ name="test"
+ class="zope.app.component.tests.views.V1"
+ for="zope.app.component.tests.views.IC"
+ permission="zope.Public"
+ template="%s"
+ menu="test_menu"
+ title="Test View"
+ />
+ ''' % testtemplate
+ )))
+ menu1 = component.getUtility(IBrowserMenu, 'test_menu')
+ menuItem1 = getFirstMenuItem('test_menu', ob, TestRequest())
+ xmlconfig(StringIO(template % (
+ '''
+ <browser:menu
+ id="test_menu" title="Test menu"
+ class="zope.app.publisher.browser.tests.support.M1" />
+ '''
+ )))
+ menu2 = component.getUtility(IBrowserMenu, 'test_menu')
+ menuItem2 = getFirstMenuItem('test_menu', ob, TestRequest())
+ self.assert_(menu1 != menu2)
+ self.assert_(menuItem1 == menuItem2)
+
def testPageWithClassWithMenu(self):
self.assertEqual(
component.queryMultiAdapter((ob, request), name='test'),
None)
testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
-
+
xmlconfig(StringIO(template % (
'''
<browser:menu
@@ -159,7 +201,7 @@
class="zope.app.component.tests.views.V1"
for="zope.app.component.tests.views.IC"
permission="zope.Public"
- template="%s"
+ template="%s"
menu="test_menu"
title="Test View"
/>
@@ -177,7 +219,7 @@
component.queryMultiAdapter((ob, request), name='test'),
None)
testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
-
+
xmlconfig(StringIO(template % (
'''
<browser:menu
@@ -186,7 +228,7 @@
name="test"
for="zope.app.component.tests.views.IC"
permission="zope.Public"
- template="%s"
+ template="%s"
menu="test_menu"
title="Test View"
/>
@@ -215,11 +257,11 @@
permission="zope.Public">
<browser:page
name="test"
- template="%s"
+ template="%s"
menu="test_menu"
title="Test View"
/>
- </browser:pages>
+ </browser:pages>
''' % testtemplate
)))
@@ -235,7 +277,6 @@
component.queryMultiAdapter((ob, request), name='test'),
None)
testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
-
xmlconfig(StringIO(template % (
'''
@@ -247,11 +288,11 @@
permission="zope.Public">
<browser:page
name="test"
- template="%s"
+ template="%s"
menu="test_menu"
title="Test View"
/>
- </browser:pages>
+ </browser:pages>
''' % testtemplate
)))
@@ -360,7 +401,7 @@
component.queryMultiAdapter((ob, request), name='test'),
None)
- XMLConfig('meta.zcml', zope.app.component)()
+ XMLConfig('meta.zcml', zope.app.component)()
xmlconfig(StringIO(template % (
'''
<interface
@@ -750,7 +791,7 @@
for="zope.app.component.tests.views.IC"
permission="zope.Public"
>
-
+
<browser:defaultPage name="test.html" />
<browser:page name="index.html" attribute="index" />
<browser:page name="action.html" attribute="action" />
@@ -776,7 +817,7 @@
def testTraversalOfPageForView(self):
"""Tests proper traversal of a page defined for a view."""
-
+
xmlconfig(StringIO(template %
'''
<browser:view
@@ -786,7 +827,7 @@
permission="zope.Public" />
<browser:page name="index.html"
- for="zope.app.component.tests.views.IV"
+ for="zope.app.component.tests.views.IV"
class="zope.app.publisher.browser.tests.test_directives.CV"
permission="zope.Public" />
'''
@@ -795,10 +836,10 @@
view = component.getMultiAdapter((ob, request), name='test')
view = removeSecurityProxy(view)
view.publishTraverse(request, 'index.html')
-
+
def testTraversalOfPageForViewWithPublishTraverse(self):
"""Tests proper traversal of a page defined for a view.
-
+
This test is different from testTraversalOfPageForView in that it
tests the behavior on a view that has a publishTraverse method --
the implementation of the lookup is slightly different in such a
@@ -813,7 +854,7 @@
permission="zope.Public" />
<browser:page name="index.html"
- for="zope.app.component.tests.views.IV"
+ for="zope.app.component.tests.views.IV"
class="zope.app.publisher.browser.tests.test_directives.CV"
permission="zope.Public" />
'''
@@ -834,7 +875,7 @@
xmlconfig(StringIO(template %
'''
<include package="zope.app.security" file="meta.zcml" />
-
+
<permission id="zope.TestPermission" title="Test permission" />
<browser:pages
@@ -842,7 +883,7 @@
for="zope.app.component.tests.views.IC"
permission="zope.TestPermission"
>
-
+
<browser:page name="index.html" attribute="index" />
<browser:page name="action.html" attribute="action" />
</browser:pages>
@@ -874,7 +915,7 @@
for="zope.app.component.tests.views.IC"
permission="zope.Public"
>
-
+
<browser:page name="index.html" attribute="index" />
<browser:page name="action.html" attribute="action" />
</browser:view>
@@ -898,7 +939,7 @@
for="*"
class="zope.app.component.tests.views.V1"
permission="zope.Public"
- >
+ >
<browser:page name="index.html" attribute="index" />
</browser:pages>
@@ -978,7 +1019,7 @@
'''
<browser:resource
name="test"
- file="%s"
+ file="%s"
layer="
zope.app.publisher.browser.tests.test_directives.ITestLayer"
/>
@@ -1208,32 +1249,32 @@
self.assert_(isinstance(v, V1))
def testMenuItemNeedsFor(self):
- # <browser:menuItem> directive fails if no 'for' argument was provided
- from zope.configuration.exceptions import ConfigurationError
+ # <browser:menuItem> directive fails if no 'for' argument was provided
+ from zope.configuration.exceptions import ConfigurationError
self.assertRaises(ConfigurationError, xmlconfig, StringIO(template %
'''
<browser:menu
id="test_menu" title="Test menu" />
- <browser:menuItem
- title="Test Entry"
- menu="test_menu"
- action="@@test"
- />
+ <browser:menuItem
+ title="Test Entry"
+ menu="test_menu"
+ action="@@test"
+ />
'''
))
# it works, when the argument is there and a valid interface
xmlconfig(StringIO(template %
'''
- <browser:menuItem
+ <browser:menuItem
for="zope.app.component.tests.views.IC"
- title="Test Entry"
- menu="test_menu"
- action="@@test"
- />
+ title="Test Entry"
+ menu="test_menu"
+ action="@@test"
+ />
'''
- ))
-
+ ))
+
def test_suite():
return unittest.TestSuite((
unittest.makeSuite(Test),
@@ -1244,3 +1285,4 @@
if __name__=='__main__':
unittest.main(defaultTest="test_suite")
+
More information about the Checkins
mailing list