[Checkins] SVN: five.megrok.menu/trunk/ Add context and action parameters for menuitems

Martin Peeters martin at affinitic.be
Tue May 31 09:41:44 EDT 2011


Log message for revision 121849:
  Add context and action parameters for menuitems

Changed:
  U   five.megrok.menu/trunk/docs/HISTORY.txt
  U   five.megrok.menu/trunk/five/megrok/menu/component.py
  U   five.megrok.menu/trunk/five/megrok/menu/grokker.py
  U   five.megrok.menu/trunk/five/megrok/menu/tests/menus/menus.py

-=-
Modified: five.megrok.menu/trunk/docs/HISTORY.txt
===================================================================
--- five.megrok.menu/trunk/docs/HISTORY.txt	2011-05-31 13:25:19 UTC (rev 121848)
+++ five.megrok.menu/trunk/docs/HISTORY.txt	2011-05-31 13:41:44 UTC (rev 121849)
@@ -4,7 +4,7 @@
 0.2 (unreleased)
 ----------------
 
-- Nothing changed yet.
+- Add context and action parameters for menuitems.
 
 
 0.1 (2009-05-28)

Modified: five.megrok.menu/trunk/five/megrok/menu/component.py
===================================================================
--- five.megrok.menu/trunk/five/megrok/menu/component.py	2011-05-31 13:25:19 UTC (rev 121848)
+++ five.megrok.menu/trunk/five/megrok/menu/component.py	2011-05-31 13:41:44 UTC (rev 121849)
@@ -24,11 +24,12 @@
     scope = martian.CLASS
     store = martian.ONCE
 
-    def factory(self, menu, icon=None, filter=None, order=0, extra=None):
+    def factory(self, menu, icon=None, filter=None, order=0, extra=None,\
+                action=None, context=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, extra)
+        return (menu, icon, filter, order, extra, action, context)

Modified: five.megrok.menu/trunk/five/megrok/menu/grokker.py
===================================================================
--- five.megrok.menu/trunk/five/megrok/menu/grokker.py	2011-05-31 13:25:19 UTC (rev 121848)
+++ five.megrok.menu/trunk/five/megrok/menu/grokker.py	2011-05-31 13:41:44 UTC (rev 121849)
@@ -61,8 +61,8 @@
 
         menu_id, icon, filter, order, extra = menuitem
         try:
-            menu = config.resolve('zope.app.menus.'+menu_id)
-        except ConfigurationError, v:
+            menu = config.resolve('zope.app.menus.%s' % menu_id)
+        except ConfigurationError:
             raise GrokError("The %r menu could not be found.  Please use "
                             "megrok.menu.Menu to register a menu first."
                             % menu_id, factory)
@@ -90,18 +90,24 @@
                 title=u''):
         if menuitem is None:
             return False
-        menu_id, icon, filter, order, extra = menuitem
+        menu_id, icon, filter, order, extra, action, menuContext = menuitem
 
         try:
-            menu = config.resolve('zope.app.menus.'+menu_id)
-        except ConfigurationError, v:
+            menu = config.resolve('zope.app.menus.%s' % menu_id)
+        except ConfigurationError:
             raise GrokError("The %r menu could not be found.  Please use "
                             "megrok.menu.Menu to register a menu first."
                             % menu_id, factory)
-        if permission == None:
+        if permission is None:
             permission = CheckerPublic
 
-        menuItemDirective(config, menu=menu, for_=context, action=name,
+        if action is None:
+            action = name
+
+        if menuContext is not None:
+            context = menuContext
+
+        menuItemDirective(config, menu=menu, for_=context, action=action,
                           title=title, description=description, icon=icon,
                           filter=filter, permission=permission, layer=layer,
                           order=order, extra=extra)

Modified: five.megrok.menu/trunk/five/megrok/menu/tests/menus/menus.py
===================================================================
--- five.megrok.menu/trunk/five/megrok/menu/tests/menus/menus.py	2011-05-31 13:25:19 UTC (rev 121848)
+++ five.megrok.menu/trunk/five/megrok/menu/tests/menus/menus.py	2011-05-31 13:41:44 UTC (rev 121849)
@@ -23,12 +23,19 @@
 
   >>> from pprint import pprint
   >>> pprint(menu.getMenuItems(manfred, request))
-  [{'action': 'edit',
+  [{'action': '/path/customcontext',
     'description': u'',
     'extra': None,
     'icon': None,
     'selected': u'',
     'submenu': None,
+    'title': 'CustomContext'},
+   {'action': 'edit',
+    'description': u'',
+    'extra': None,
+    'icon': None,
+    'selected': u'',
+    'submenu': None,
     'title': 'Edit'},
    {'action': 'index',
     'description': u'',
@@ -46,12 +53,19 @@
 from five.megrok import menu
 import grokcore.security
 
+
 class Mammoth(Context):
     pass
 
+
+class Smilodon(Context):
+    pass
+
+
 class Tabs(menu.Menu):
     grok.name('tabs')
     grok.title('Tabs')
+    grok.context(Mammoth)
     grok.description('')
 
 # You can either refer to the menu class itself:
@@ -59,7 +73,9 @@
 
 class Index(grok.View):
     grok.title('View')
+    grok.context(Mammoth)
     menu.menuitem(Tabs)
+
     def render(self):
         return 'index'
 
@@ -67,8 +83,20 @@
 
 class Edit(grok.View):
     grok.title('Edit')
+    grok.context(Mammoth)
     menu.menuitem('tabs')
     grokcore.security.require('zope2.Public')
 
     def render(self):
         return 'edit'
+
+# You can define custom context and action for menuitem
+
+class CustomContext(grok.View):
+    grok.title('CustomContext')
+    grok.context(Smilodon)
+    grok.require('zope2.Public')
+    menu.menuitem('tabs', context=Mammoth, action='/path/customcontext')
+
+    def render(self):
+        return 'custom-context'



More information about the checkins mailing list