[Checkins] SVN: megrok.menu/trunk/ Merge the branch `fixes-for-grok0.14` (tested with grok1.0a1) to the trunk
Santiago Videla
santiago.videla at gmail.com
Sun Feb 15 17:40:10 EST 2009
Log message for revision 96572:
Merge the branch `fixes-for-grok0.14` (tested with grok1.0a1) to the trunk
Changed:
U megrok.menu/trunk/buildout.cfg
U megrok.menu/trunk/setup.py
U megrok.menu/trunk/src/megrok/menu/__init__.py
U megrok.menu/trunk/src/megrok/menu/component.py
U megrok.menu/trunk/src/megrok/menu/ftesting.zcml
U megrok.menu/trunk/src/megrok/menu/grokker.py
U megrok.menu/trunk/src/megrok/menu/tests/test_functional.py
U megrok.menu/trunk/versions.cfg
-=-
Modified: megrok.menu/trunk/buildout.cfg
===================================================================
--- megrok.menu/trunk/buildout.cfg 2009-02-15 22:21:11 UTC (rev 96571)
+++ megrok.menu/trunk/buildout.cfg 2009-02-15 22:40:09 UTC (rev 96572)
@@ -1,7 +1,7 @@
[buildout]
develop = .
parts = interpreter test
-extends = versions.cfg
+extends = http://grok.zope.org/releaseinfo/grok-1.0a1.cfg
versions = versions
[interpreter]
Modified: megrok.menu/trunk/setup.py
===================================================================
--- megrok.menu/trunk/setup.py 2009-02-15 22:21:11 UTC (rev 96571)
+++ megrok.menu/trunk/setup.py 2009-02-15 22:40:09 UTC (rev 96572)
@@ -28,7 +28,9 @@
'setuptools',
'martian',
'grokcore.component',
- 'grok', # just for the ViewGrokker
+ 'grokcore.view',
+ 'grokcore.security',
+ 'grok', # needed for testing
],
entry_points="""
# -*- Entry points: -*-
Modified: megrok.menu/trunk/src/megrok/menu/__init__.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/__init__.py 2009-02-15 22:21:11 UTC (rev 96571)
+++ megrok.menu/trunk/src/megrok/menu/__init__.py 2009-02-15 22:40:09 UTC (rev 96572)
@@ -1,4 +1,4 @@
-from megrok.menu.component import menuitem, Menu
+from megrok.menu.component import menuitem, Menu, SubMenuItem
# Provide these directives here as well:
from grokcore.component import name, title, description
Modified: megrok.menu/trunk/src/megrok/menu/component.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/component.py 2009-02-15 22:21:11 UTC (rev 96571)
+++ megrok.menu/trunk/src/megrok/menu/component.py 2009-02-15 22:40:09 UTC (rev 96572)
@@ -6,15 +6,20 @@
class Menu(BrowserMenu):
pass
+class SubMenuItem(BrowserMenu):
+ pass
+
+
class menuitem(martian.Directive):
scope = martian.CLASS
store = martian.ONCE
- def factory(self, menu, icon=None, filter=None, order=0):
+ def factory(self, menu, icon=None, filter=None, order=0, extra=None):
if martian.util.check_subclass(menu, Menu):
menu = grokcore.component.name.bind().get(menu)
if martian.util.not_unicode_or_ascii(menu):
raise GrokImportError(
"You can only pass unicode, ASCII, or a subclass "
"of megrok.menu.Menu to the '%s' directive." % self.name)
- return (menu, icon, filter, order)
+ return (menu, icon, filter, order, extra)
+
Modified: megrok.menu/trunk/src/megrok/menu/ftesting.zcml
===================================================================
--- megrok.menu/trunk/src/megrok/menu/ftesting.zcml 2009-02-15 22:21:11 UTC (rev 96571)
+++ megrok.menu/trunk/src/megrok/menu/ftesting.zcml 2009-02-15 22:40:09 UTC (rev 96572)
@@ -1,6 +1,7 @@
<configure
xmlns="http://namespaces.zope.org/zope"
- xmlns:grok="http://namespaces.zope.org/grok">
+ xmlns:grok="http://namespaces.zope.org/grok"
+ i18n_domain="megrok.menu">
<include package="grok" />
<include package="megrok.menu" file="meta.zcml" />
Modified: megrok.menu/trunk/src/megrok/menu/grokker.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/grokker.py 2009-02-15 22:21:11 UTC (rev 96571)
+++ megrok.menu/trunk/src/megrok/menu/grokker.py 2009-02-15 22:40:09 UTC (rev 96572)
@@ -1,15 +1,21 @@
import martian
-import grokcore.component
-import megrok.menu
from martian.error import GrokError
-#from grok.meta import ViewGrokker, default_view_name
-from grokcore.view.meta.views import ViewGrokker, default_view_name
+import grokcore.component
+import grokcore.view
+import grokcore.security
+from grokcore.security.util import protect_getattr
+from grokcore.view.meta.views import ViewSecurityGrokker, default_view_name
+
from zope.configuration.exceptions import ConfigurationError
+from zope.app.publisher.browser.menumeta import menuDirective, \
+ menuItemDirective, subMenuItemDirective
+
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
from zope.publisher.interfaces.browser import IBrowserPage
-from zope.app.publisher.browser.menumeta import menuDirective, menuItemDirective
-from zope.app.security.protectclass import protectName
+import megrok.menu
+
class MenuGrokker(martian.ClassGrokker):
martian.component(megrok.menu.Menu)
martian.priority(1500)
@@ -22,16 +28,68 @@
title=title, description=description)
return True
-class MenuItemGrokker(ViewGrokker):
+class SubMenuItemGrokker(martian.ClassGrokker):
+ martian.component(megrok.menu.SubMenuItem)
+
+ # We want to do this after MenuGrokker.
+ martian.priority(1000)
+
+ martian.directive(grokcore.component.name, get_default=default_view_name)
+ martian.directive(grokcore.component.title, default=u'')
+ martian.directive(grokcore.component.description, default=u'')
+ martian.directive(grokcore.component.context)
+ martian.directive(grokcore.view.layer, default=IDefaultBrowserLayer)
+ martian.directive(grokcore.security.require, name='permission')
+
martian.directive(megrok.menu.menuitem)
+
+ def execute(self, factory, config, name, title, description, \
+ menuitem=None, context=None, layer=None, permission=None):
+
+ menuDirective(config, id=name, class_=factory,
+ title=title, description=description)
+
+ if menuitem is None:
+ return False
+
+ menu_id, icon, filter, order, extra = menuitem
+ try:
+ menu = config.resolve('zope.app.menus.'+menu_id)
+ except ConfigurationError, v:
+ raise GrokError("The %r menu could not be found. Please use "
+ "megrok.menu.Menu to register a menu first."
+ % menu_id, factory)
+
+ subMenuItemDirective(config, menu=menu, for_=context, submenu=name,
+ title=title, description=description, icon=icon,
+ filter=filter, permission=permission, layer=layer,
+ order=order, action='', extra=extra)
+
+ for method_name in IBrowserPage:
+ if method_name == '__call__':
+ continue
+ config.action(
+ discriminator=('protectMenuName', factory, method_name),
+ callable=protect_getattr,
+ args=(factory, method_name, permission),
+ )
+
+ return True
+
+class MenuItemGrokker(ViewSecurityGrokker):
+ martian.directive(megrok.menu.menuitem)
+ martian.directive(grokcore.component.context)
+ martian.directive(grokcore.view.layer, default=IDefaultBrowserLayer)
+ martian.directive(grokcore.component.name, get_default=default_view_name)
martian.directive(grokcore.component.title, default=u'')
martian.directive(grokcore.component.description, default=u'')
- def execute(self, factory, config, context, layer, name, permission,
- menuitem, title, description, **kw):
+ def execute(self, factory, config, permission, context=None, layer=None, \
+ name=u'', menuitem=None, description=u'', title=u''):
+
if menuitem is None:
return False
- menu_id, icon, filter, order = menuitem
+ menu_id, icon, filter, order, extra = menuitem
try:
menu = config.resolve('zope.app.menus.'+menu_id)
except ConfigurationError, v:
@@ -41,7 +99,7 @@
menuItemDirective(config, menu=menu, for_=context, action=name,
title=title, description=description, icon=icon,
filter=filter, permission=permission, layer=layer,
- order=order)
+ order=order, extra=extra)
# Menu items check whether the view that they refer to can be
# traversed to. Unfortunately, views will end up being
@@ -49,14 +107,17 @@
# work then, we must define a checker not only for __call__
# but also for browserDefault and those other methods from
# IBrowserPage:
- if permission is None:
- permission = 'zope.Public'
- for method_name in list(IBrowserPage):
+ ######
+ # This is no longer needed. protect_getattr function will take care.
+ #if permission is None:
+ # permission = 'zope.Public'
+
+ for method_name in IBrowserPage:
if method_name == '__call__':
continue
config.action(
- discriminator=('protectName', factory, method_name),
- callable=protectName,
+ discriminator=('protectMenuName', factory, method_name),
+ callable=protect_getattr,
args=(factory, method_name, permission),
)
Modified: megrok.menu/trunk/src/megrok/menu/tests/test_functional.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/tests/test_functional.py 2009-02-15 22:21:11 UTC (rev 96571)
+++ megrok.menu/trunk/src/megrok/menu/tests/test_functional.py 2009-02-15 22:40:09 UTC (rev 96572)
@@ -11,7 +11,20 @@
>>> from zope.testbrowser.testing import Browser
>>> browser = Browser('http://localhost/manfred/showmenu')
>>> print browser.contents
- [{'action': 'edit',
+ [{'action': '',
+ 'description': '',
+ 'extra': None,
+ 'icon': None,
+ 'selected': u'',
+ 'submenu': [{'action': 'optionone',
+ 'description': u'',
+ 'extra': None,
+ 'icon': None,
+ 'selected': u'',
+ 'submenu': None,
+ 'title': 'Option one'}],
+ 'title': 'Options'},
+ {'action': 'edit',
'description': u'',
'extra': None,
'icon': None,
@@ -31,7 +44,33 @@
>>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
>>> browser.open('http://localhost/manfred/showmenu')
>>> print browser.contents
- [{'action': 'edit',
+ [{'action': '',
+ 'description': '',
+ 'extra': None,
+ 'icon': None,
+ 'selected': u'',
+ 'submenu': [{'action': 'optionone',
+ 'description': u'',
+ 'extra': None,
+ 'icon': None,
+ 'selected': u'',
+ 'submenu': None,
+ 'title': 'Option one'}],
+ 'title': 'Options'},
+ {'action': '',
+ 'description': '',
+ 'extra': None,
+ 'icon': None,
+ 'selected': u'',
+ 'submenu': [{'action': 'configoption',
+ 'description': u'',
+ 'extra': None,
+ 'icon': None,
+ 'selected': u'',
+ 'submenu': None,
+ 'title': 'Protected configuration'}],
+ 'title': 'Setup'},
+ {'action': 'edit',
'description': u'',
'extra': None,
'icon': None,
@@ -86,6 +125,21 @@
def render(self):
return 'edit'
+# also you can define sub-menus items
+class Options(megrok.menu.SubMenuItem):
+ grok.name('options')
+ grok.title('Options')
+ grok.description('')
+
+ megrok.menu.menuitem('actions')
+
+class OptionOne(grok.View):
+ grok.title('Option one')
+ megrok.menu.menuitem('options')
+
+ def render(self):
+ return 'option one'
+
# Here's a view that's protected by a permission. We expect the menu
# item that we configure for it to have the same permission setting:
@@ -100,6 +154,22 @@
def render(self):
return 'manage'
+#Sub menus item are also available to be protected using a permission
+class Setup(megrok.menu.SubMenuItem):
+ grok.require(ManageStuff)
+ grok.name('setup')
+ grok.title('Setup')
+ grok.description('')
+
+ megrok.menu.menuitem('actions')
+
+class ConfigOption(grok.View):
+ grok.title('Protected configuration')
+ megrok.menu.menuitem('setup')
+
+ def render(self):
+ return 'Configuration'
+
class ShowMenu(grok.View):
def render(self):
Modified: megrok.menu/trunk/versions.cfg
===================================================================
--- megrok.menu/trunk/versions.cfg 2009-02-15 22:21:11 UTC (rev 96571)
+++ megrok.menu/trunk/versions.cfg 2009-02-15 22:40:09 UTC (rev 96572)
@@ -1,13 +1,16 @@
[versions]
-grok = 0.13
-ClientForm = 0.2.7
+grok = 0.14.1
+ClientForm = 0.2.9
Pygments = 0.8.1
RestrictedPython = 3.4.2
ZConfig = 2.5.1
ZODB3 = 3.8
docutils = 0.4
-martian = 0.10
-grokcore.component = 1.4
+grokcore.component = 1.5.1
+grokcore.formlib = 1.0
+grokcore.security = 1.0
+grokcore.view = 1.1
+martian = 0.11
mechanize = 0.1.7b
pytz = 2007k
simplejson = 1.7.1
@@ -15,24 +18,25 @@
z3c.flashmessage = 1.0
z3c.testsetup = 0.2.1
zc.catalog = 1.2
-zdaemon = 2.0.1
+zc.recipe.testrunner = 1.0.0
+zdaemon = 2.0.2
zodbcode = 3.4
-zope.annotation = 3.4
+zope.annotation = 3.4.1
zope.app.apidoc = 3.4.3
-zope.app.applicationcontrol = 3.4.1
+zope.app.applicationcontrol = 3.4.3
zope.app.appsetup = 3.4.1
-zope.app.authentication = 3.4.1
+zope.app.authentication = 3.4.3
zope.app.basicskin = 3.4
zope.app.broken = 3.4
zope.app.catalog = 3.5.1
zope.app.component = 3.4.1
-zope.app.container = 3.5.3
+zope.app.container = 3.5.6
zope.app.content = 3.4
-zope.app.debug = 3.4
+zope.app.debug = 3.4.1
zope.app.dependable = 3.4
zope.app.error = 3.5.1
zope.app.exception = 3.4.1
-zope.app.file = 3.4.2
+zope.app.file = 3.4.4
zope.app.folder = 3.4
zope.app.form = 3.4.1
zope.app.generations = 3.4.1
@@ -41,9 +45,9 @@
zope.app.interface = 3.4
zope.app.intid = 3.4.1
zope.app.keyreference = 3.4.1
-zope.app.locales = 3.4.1
+zope.app.locales = 3.4.5
zope.app.onlinehelp = 3.4.1
-zope.app.pagetemplate = 3.4
+zope.app.pagetemplate = 3.4.1
zope.app.preference = 3.4.1
zope.app.principalannotation = 3.4
zope.app.publication = 3.4.3
@@ -51,19 +55,19 @@
zope.app.renderer = 3.4
zope.app.rotterdam = 3.4.1
zope.app.schema = 3.4
-zope.app.security = 3.4
+zope.app.security = 3.5.2
zope.app.securitypolicy = 3.4.6
-zope.app.server = 3.4
+zope.app.server = 3.4.2
zope.app.session = 3.5.1
zope.app.skins = 3.4
-zope.app.testing = 3.4.1
+zope.app.testing = 3.4.3
zope.app.tree = 3.4
-zope.app.twisted = 3.4
-zope.app.wsgi = 3.4
+zope.app.twisted = 3.4.1
+zope.app.wsgi = 3.4.1
zope.app.zapi = 3.4
zope.app.zcmlfiles = 3.4.3
zope.app.zopeappgenerations = 3.4
-zope.cachedescriptors = 3.4
+zope.cachedescriptors = 3.4.1
zope.component = 3.4
zope.configuration = 3.4
zope.contentprovider = 3.4
@@ -89,19 +93,19 @@
zope.minmax = 1.1
zope.modulealias = 3.4
zope.pagetemplate = 3.4
-zope.proxy = 3.4
-zope.publisher = 3.4.2
+zope.proxy = 3.4.2
+zope.publisher = 3.4.6
zope.schema = 3.4
-zope.security = 3.4
-zope.securitypolicy = 3.4
-zope.server = 3.4.1
+zope.security = 3.4.1
+zope.securitypolicy = 3.4.1
+zope.server = 3.4.3
zope.session = 3.4.1
zope.size = 3.4
zope.structuredtext = 3.4
zope.tal = 3.4.1
zope.tales = 3.4
zope.testbrowser = 3.4.2
-zope.testing = 3.5.1
+zope.testing = 3.5.4
zope.thread = 3.4
-zope.traversing = 3.4.0
+zope.traversing = 3.4.1
zope.viewlet = 3.4.2
More information about the Checkins
mailing list