[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