[Checkins] SVN: megrok.menu/trunk/ Added the support of the grokcore.viewlet 'order' directive to reorder the menu items and sub menus.

Souheil CHELFOUH souheil at chelfouh.com
Fri Oct 2 16:56:48 EDT 2009


Log message for revision 104757:
  Added the support of the grokcore.viewlet 'order' directive to reorder the menu items and sub menus.
  

Changed:
  U   megrok.menu/trunk/CHANGES.txt
  U   megrok.menu/trunk/setup.py
  U   megrok.menu/trunk/src/megrok/menu/component.py
  U   megrok.menu/trunk/src/megrok/menu/grokker.py

-=-
Modified: megrok.menu/trunk/CHANGES.txt
===================================================================
--- megrok.menu/trunk/CHANGES.txt	2009-10-02 18:56:50 UTC (rev 104756)
+++ megrok.menu/trunk/CHANGES.txt	2009-10-02 20:56:47 UTC (rev 104757)
@@ -3,6 +3,13 @@
 
 0.3 (unreleased)
 ----------------
+ * Added the support of the grokcore.viewlet 'order' directive to
+ reorder the menu items and sub menus. This permits to have a
+ baseclass defining the basic menu and to keep the ordering
+ possibility in the sublasses. We probably should do that for the
+ different arguments of the menuitem directive. That would allow more
+ genericity and reusability. Note : this change is 100% backward
+ compatible. Simply added tests to show the behavior. [trollfot]
  * Get rid of the grok dependency. Now depends only on grokcore.* packages
  * Updated the build process
 

Modified: megrok.menu/trunk/setup.py
===================================================================
--- megrok.menu/trunk/setup.py	2009-10-02 18:56:50 UTC (rev 104756)
+++ megrok.menu/trunk/setup.py	2009-10-02 20:56:47 UTC (rev 104757)
@@ -28,6 +28,7 @@
           'setuptools',
           'grokcore.component',
           'grokcore.view',
+          'grokcore.viewlet',
           'grokcore.security',
       ],
       entry_points="""

Modified: megrok.menu/trunk/src/megrok/menu/component.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/component.py	2009-10-02 18:56:50 UTC (rev 104756)
+++ megrok.menu/trunk/src/megrok/menu/component.py	2009-10-02 20:56:47 UTC (rev 104757)
@@ -14,7 +14,7 @@
     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=None, extra=None):
         if martian.util.check_subclass(menu, Menu):
             menu = grokcore.component.name.bind().get(menu)
         if martian.util.not_unicode_or_ascii(menu):

Modified: megrok.menu/trunk/src/megrok/menu/grokker.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/grokker.py	2009-10-02 18:56:50 UTC (rev 104756)
+++ megrok.menu/trunk/src/megrok/menu/grokker.py	2009-10-02 20:56:47 UTC (rev 104757)
@@ -1,21 +1,24 @@
 import martian
 from martian.error import GrokError
 
-import grokcore.component
 import grokcore.view
+import grokcore.viewlet
 import grokcore.security
+import grokcore.component
+
 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
+     menuItemDirective, subMenuItemDirective
 
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 from zope.publisher.interfaces.browser import IBrowserPage
 
 import megrok.menu
 
+
 class MenuGrokker(martian.ClassGrokker):
     martian.component(megrok.menu.Menu)
     martian.priority(1500)
@@ -28,6 +31,7 @@
                       title=title, description=description)
         return True
 
+
 class SubMenuItemGrokker(martian.ClassGrokker):
     martian.component(megrok.menu.SubMenuItem)
 
@@ -37,22 +41,28 @@
     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.viewlet.order)
     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):
+    def execute(self, factory, config, name, title, description,
+                order = None, 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
+        menu_id, icon, filter, enforced_order, extra = menuitem
+       
+        if enforced_order is None:
+            enforced_order = order[0] or 0
+
         try:
             menu = config.resolve('zope.app.menus.'+menu_id)
         except ConfigurationError, v:
@@ -60,10 +70,12 @@
                             "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)
+        subMenuItemDirective(
+            config, menu=menu, for_=context, submenu=name,
+            title=title, description=description, icon=icon,
+            filter=filter, permission=permission, layer=layer,
+            order=enforced_order, action='', extra=extra
+            )
 
         for method_name in IBrowserPage:
             if method_name == '__call__':
@@ -73,23 +85,30 @@
                 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.viewlet.order)
     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, permission, context=None, layer=None, \
-                   name=u'', menuitem=None, description=u'', title=u''):
+    def execute(self, factory, config, permission, order, context=None,
+                layer=None, name=u'', menuitem=None, description=u'',
+                title=u''):
 
         if menuitem is None:
             return False
-        menu_id, icon, filter, order, extra = menuitem
+        
+        menu_id, icon, filter, enforced_order, extra = menuitem
+        
+        if enforced_order is None:
+            enforced_order = order[0] or 0
+
         try:
             menu = config.resolve('zope.app.menus.'+menu_id)
         except ConfigurationError, v:
@@ -99,7 +118,7 @@
         menuItemDirective(config, menu=menu, for_=context, action=name,
                           title=title, description=description, icon=icon,
                           filter=filter, permission=permission, layer=layer,
-                          order=order, extra=extra)
+                          order=enforced_order, extra=extra)
 
         # Menu items check whether the view that they refer to can be
         # traversed to.  Unfortunately, views will end up being



More information about the checkins mailing list