[Zope3-checkins] SVN: Zope3/trunk/src/zope/app/ Fixed a number of problems converting 'zope.Public' to

Gary Poster gary at zope.com
Sat Jan 29 13:34:03 EST 2005


Log message for revision 28973:
  Fixed a number of problems converting 'zope.Public' to 
  zope.security.CheckerPublic.  Converted menu item factory 
  from function to class and added unit tests.  Corrected
  associated unit tests that relied on the factory repr.
  
  

Changed:
  U   Zope3/trunk/src/zope/app/container/browser/tests/test_directive.py
  U   Zope3/trunk/src/zope/app/form/browser/metaconfigure.py
  U   Zope3/trunk/src/zope/app/form/browser/tests/test_add.py
  U   Zope3/trunk/src/zope/app/publisher/browser/menu.py
  U   Zope3/trunk/src/zope/app/publisher/browser/tests/test_addMenuItem.py

-=-
Modified: Zope3/trunk/src/zope/app/container/browser/tests/test_directive.py
===================================================================
--- Zope3/trunk/src/zope/app/container/browser/tests/test_directive.py	2005-01-28 21:14:25 UTC (rev 28972)
+++ Zope3/trunk/src/zope/app/container/browser/tests/test_directive.py	2005-01-29 18:34:03 UTC (rev 28973)
@@ -69,7 +69,7 @@
         <InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest>),
        <InterfaceClass zope.app.menus.zmi_views>,
        u'Contents',
-       <function MenuItemFactory>,
+       <zope.app.publisher.browser.menu.MenuItemFactory object>,
        '')),
      (None,
       <function provideInterface>,
@@ -130,7 +130,7 @@
         <InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest>),
        <InterfaceClass zope.app.menus.zmi_actions>,
        u'Add',
-       <function MenuItemFactory>,
+       <zope.app.publisher.browser.menu.MenuItemFactory object>,
        'info')),
      (None,
       <function provideInterface>,

Modified: Zope3/trunk/src/zope/app/form/browser/metaconfigure.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/metaconfigure.py	2005-01-28 21:14:25 UTC (rev 28972)
+++ Zope3/trunk/src/zope/app/form/browser/metaconfigure.py	2005-01-29 18:34:03 UTC (rev 28973)
@@ -20,7 +20,7 @@
 import os
 
 import zope.component
-
+from zope.security.checker import CheckerPublic
 from zope.interface import implementedBy
 from zope.configuration.exceptions import ConfigurationError
 
@@ -47,7 +47,7 @@
     # default basic information
     for_ = None
     layer = IDefaultBrowserLayer
-    permission = 'zope.Public'
+    permission = CheckerPublic
     template = None
     class_ = None
 
@@ -119,7 +119,11 @@
             self.fields = self.names
 
     def _args(self):
-        return (self.name, self.schema, self.label, self.permission,
+        permission = self.permission
+        if permission == 'zope.Public':
+            # Translate public permission to CheckerPublic
+            permission = CheckerPublic
+        return (self.name, self.schema, self.label, permission,
                 self.layer, self.template, self.default_template,
                 self.bases, self.for_, self.fields)
 
@@ -147,7 +151,11 @@
         self.panes = []
 
     def _args(self):
-        return (self.name, self.schema, self.permission, self.layer,
+        permission = self.permission
+        if permission == 'zope.Public':
+            # Translate public permission to CheckerPublic
+            permission = CheckerPublic
+        return (self.name, self.schema, permission, self.layer,
                 self.panes, self.fields, self.template, self.default_template,
                 self.bases, self.for_)
 

Modified: Zope3/trunk/src/zope/app/form/browser/tests/test_add.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/tests/test_add.py	2005-01-28 21:14:25 UTC (rev 28972)
+++ Zope3/trunk/src/zope/app/form/browser/tests/test_add.py	2005-01-29 18:34:03 UTC (rev 28973)
@@ -17,6 +17,7 @@
 """
 import unittest
 
+from zope.security.checker import CheckerPublic
 from zope.app.tests import ztapi
 from zope.interface import Interface, implements
 from zope.publisher.interfaces.browser import IBrowserRequest
@@ -169,7 +170,7 @@
         self.assertEqual(name, 'addthis')
         self.assertEqual(schema, I)
         self.assertEqual(label, 'Add this')
-        self.assertEqual(permission, 'zope.Public')
+        self.assertEqual(permission, CheckerPublic) # 'zope.Public' translated
         self.assertEqual(layer, IDefaultBrowserLayer)
         self.assertEqual(template, 'add.pt')
         self.assertEqual(default_template, 'add.pt')

Modified: Zope3/trunk/src/zope/app/publisher/browser/menu.py
===================================================================
--- Zope3/trunk/src/zope/app/publisher/browser/menu.py	2005-01-28 21:14:25 UTC (rev 28972)
+++ Zope3/trunk/src/zope/app/publisher/browser/menu.py	2005-01-29 18:34:03 UTC (rev 28973)
@@ -489,6 +489,113 @@
         _context, action, title, description, icon, filter,
         permission, extra, order)
 
+class MenuItemFactory(object):
+    # XXX this used to be a function created inline within menuItemsDirective,
+    # with the necessary values bound in context.  That approach may be
+    # faster than this one, but it does not encourage approachable doc tests.
+    # Please revise as desired, or remove this triple-X comment if this 
+    # solution is acceptable for now.
+    """generic factory for menu items.
+    
+    The factory needs a class to instantiate.  This will generally implement
+    IBrowserMenuItem.  Here is a dummy example.
+    
+    >>> class DummyBrowserMenuItem(object):
+    ...     "a dummy factory for menu items"
+    ...     def __init__(self, context, request):
+    ...         self.context = context
+    ...         self.request = request
+    ... 
+    
+    To instantiate this class, pass the factory and the other arguments as 
+    described by the signature (and mapped to the IBrowserMenuItem interface).
+    We use dummy values for this example.
+    
+    >>> factory = MenuItemFactory(
+    ...     DummyBrowserMenuItem, 'Title', 'Description', 'Icon', 'Action',
+    ...     'Filter', 'zope.Public', 'Extra', 'Order', 'For_')
+    >>> factory.factory is DummyBrowserMenuItem
+    True
+    
+    The 'zope.Public' permission needs to be translated to CheckerPublic.
+    
+    >>> factory.permission is CheckerPublic
+    True
+    
+    Call the factory with context and request to return the instance.  We 
+    continue to use dummy values.
+    
+    >>> item = factory('Context', 'Request')
+    
+    The returned value should be an instance of the DummyBrowserMenuItem,
+    and have all of the values we initially set on the factory.
+    
+    >>> isinstance(item, DummyBrowserMenuItem)
+    True
+    >>> item.context
+    'Context'
+    >>> item.request
+    'Request'
+    >>> item.title
+    'Title'
+    >>> item.description
+    'Description'
+    >>> item.icon
+    'Icon'
+    >>> item.action
+    'Action'
+    >>> item.filter
+    'Filter'
+    >>> item.permission is CheckerPublic
+    True
+    >>> item.extra
+    'Extra'
+    >>> item.order
+    'Order'
+    >>> item._for
+    'For_'
+    
+    If you pass a permission other than zope.Public to the MenuItemFactory,
+    it should pass through unmodified.
+    
+    >>> factory = MenuItemFactory(
+    ...     DummyBrowserMenuItem, 'Title', 'Description', 'Icon', 'Action',
+    ...     'Filter', 'another.Permission', 'Extra', 'Order', 'For_')
+    >>> factory.permission
+    'another.Permission'
+    """
+    def __init__(self, factory, title, description, icon, action, filter, 
+                 permission, extra, order, for_):
+        self.factory = factory
+        self.title = title
+        self.description = description
+        self.icon = icon
+        self.action = action
+        self.filter = filter
+        if permission == 'zope.Public':
+            permission = CheckerPublic
+        self.permission = permission
+        self.extra = extra
+        self.order = order
+        self.for_ = for_
+    
+    def __call__(self, context, request):
+        item = self.factory(context, request)
+        item.title = self.title
+        item.description = self.description
+        item.icon = self.icon
+        item.action = self.action
+        item.filter = self.filter
+        # we could not set the permission if self.permission is CheckerPublic.
+        # choosing to be explicit for now.
+        item.permission = self.permission
+        item.extra = self.extra
+        item.order = self.order
+        item._for = self.for_
+        if self.permission is not None:
+            checker = InterfaceChecker(IBrowserMenuItem, self.permission)
+            item = proxify(item, checker)
+        return item
 
 class menuItemsDirective(object):
     """Register several menu items for a particular menu.
@@ -525,30 +632,10 @@
             order = _order_counter.get(self.for_, 1)
             _order_counter[self.for_] = order + 1
 
-        def MenuItemFactory(context, request):
-            item = BrowserMenuItem(context, request)
-            item.title = title
-            item.description = description
-            item.icon = icon
-            item.action = action
-            item.filter = filter
-            item.permission = permission
-            item.extra = extra
-            item.order = order
-            item._for = self.for_
-
-            if permission is not None:
-                if permission == 'zope.Public':
-                    perm = CheckerPublic
-                else:
-                    perm = permission
-                checker = InterfaceChecker(IBrowserMenuItem, perm)
-                item = proxify(item, checker)
-
-            return item
-        MenuItemFactory.factory = BrowserMenuItem
-
-        adapter(_context, (MenuItemFactory,), self.menuItemType,
+        factory = MenuItemFactory(
+            BrowserMenuItem, title, description, icon, action, filter, 
+            permission, extra, order, self.for_)
+        adapter(_context, (factory,), self.menuItemType,
                 (self.for_, IBrowserRequest), name=title)
         
     def __call__(self, _context):

Modified: Zope3/trunk/src/zope/app/publisher/browser/tests/test_addMenuItem.py
===================================================================
--- Zope3/trunk/src/zope/app/publisher/browser/tests/test_addMenuItem.py	2005-01-28 21:14:25 UTC (rev 28972)
+++ Zope3/trunk/src/zope/app/publisher/browser/tests/test_addMenuItem.py	2005-01-29 18:34:03 UTC (rev 28973)
@@ -42,7 +42,7 @@
     <InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest>),
    <InterfaceClass zope.app.publisher.interfaces.browser.AddMenu>,
    'Add an X',
-   <function MenuItemFactory>,
+   <zope.app.publisher.browser.menu.MenuItemFactory object>,
    '')),
  (None,
   <function provideInterface>,
@@ -106,7 +106,7 @@
         <InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest>),
        <InterfaceClass zope.app.publisher.interfaces.browser.AddMenu>,
        'Add an X',
-       <function MenuItemFactory>,
+       <zope.app.publisher.browser.menu.MenuItemFactory object>,
        '')),
      (None,
       <function provideInterface>,
@@ -141,7 +141,7 @@
         <InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest>),
        <InterfaceClass zope.app.publisher.interfaces.browser.AddMenu>,
        'Add an X',
-       <function MenuItemFactory>,
+       <zope.app.publisher.browser.menu.MenuItemFactory object>,
        '')),
      (None,
       <function provideInterface>,
@@ -190,7 +190,7 @@
         <InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest>),
        <InterfaceClass zope.app.publisher.interfaces.browser.AddMenu>,
        'Add an X',
-       <function MenuItemFactory>,
+       <zope.app.publisher.browser.menu.MenuItemFactory object>,
        '')),
      (None,
       <function provideInterface>,



More information about the Zope3-Checkins mailing list