[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