[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