[Checkins] SVN: megrok.menu/tags/0.3/ Tagged version 0.3

Souheil CHELFOUH souheil at chelfouh.com
Mon Nov 2 07:45:33 EST 2009


Log message for revision 105442:
  Tagged version 0.3
  

Changed:
  A   megrok.menu/tags/0.3/
  D   megrok.menu/tags/0.3/CHANGES.txt
  A   megrok.menu/tags/0.3/CHANGES.txt
  D   megrok.menu/tags/0.3/setup.py
  A   megrok.menu/tags/0.3/setup.py
  D   megrok.menu/tags/0.3/src/megrok/menu/component.py
  A   megrok.menu/tags/0.3/src/megrok/menu/component.py
  D   megrok.menu/tags/0.3/src/megrok/menu/grokker.py
  A   megrok.menu/tags/0.3/src/megrok/menu/grokker.py
  A   megrok.menu/tags/0.3/src/megrok/menu/tests/test_order.py

-=-
Deleted: megrok.menu/tags/0.3/CHANGES.txt
===================================================================
--- megrok.menu/trunk/CHANGES.txt	2009-10-02 18:56:50 UTC (rev 104756)
+++ megrok.menu/tags/0.3/CHANGES.txt	2009-11-02 12:45:33 UTC (rev 105442)
@@ -1,20 +0,0 @@
-Changelog
-=========
-
-0.3 (unreleased)
-----------------
- * Get rid of the grok dependency. Now depends only on grokcore.* packages
- * Updated the build process
-
-0.2 (2009-03-02)
-----------------
- * Compatible with grok1.0a1
- * Add the SubMenuItem base class and it's grokker SubMenuItemGrokker
- * Add the `extra` parameter to the menuitem directive
- * Tests for added functionality
- * Remove version.cfg
-
-0.1 (2008-07-12)
-----------------
-
-Initial release.

Copied: megrok.menu/tags/0.3/CHANGES.txt (from rev 104757, megrok.menu/trunk/CHANGES.txt)
===================================================================
--- megrok.menu/tags/0.3/CHANGES.txt	                        (rev 0)
+++ megrok.menu/tags/0.3/CHANGES.txt	2009-11-02 12:45:33 UTC (rev 105442)
@@ -0,0 +1,27 @@
+Changelog
+=========
+
+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
+
+0.2 (2009-03-02)
+----------------
+ * Compatible with grok1.0a1
+ * Add the SubMenuItem base class and it's grokker SubMenuItemGrokker
+ * Add the `extra` parameter to the menuitem directive
+ * Tests for added functionality
+ * Remove version.cfg
+
+0.1 (2008-07-12)
+----------------
+
+Initial release.

Deleted: megrok.menu/tags/0.3/setup.py
===================================================================
--- megrok.menu/trunk/setup.py	2009-10-02 18:56:50 UTC (rev 104756)
+++ megrok.menu/tags/0.3/setup.py	2009-11-02 12:45:33 UTC (rev 105442)
@@ -1,36 +0,0 @@
-from setuptools import setup, find_packages
-
-long_description = (open("README.txt").read()
-                    + '\n\n' +
-                    open("CHANGES.txt").read())
-
-setup(name='megrok.menu',
-      version='0.3dev',
-      description="Grok extension to configure browser menus",
-      long_description=long_description,
-      # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=['Programming Language :: Python',
-                   'Environment :: Web Environment',
-                   'Framework :: Zope3',
-                   'License :: OSI Approved :: Zope Public License',
-                   ],
-      keywords='',
-      author='Philipp von Weitershausen',
-      author_email='philipp at weitershausen.de',
-      url='http://pypi.python.org/pypi/megrok.menu',
-      license='ZPL',
-      packages=find_packages('src'),
-      package_dir = {'': 'src'},
-      namespace_packages=['megrok'],
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          'setuptools',
-          'grokcore.component',
-          'grokcore.view',
-          'grokcore.security',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      """,
-      )

Copied: megrok.menu/tags/0.3/setup.py (from rev 104757, megrok.menu/trunk/setup.py)
===================================================================
--- megrok.menu/tags/0.3/setup.py	                        (rev 0)
+++ megrok.menu/tags/0.3/setup.py	2009-11-02 12:45:33 UTC (rev 105442)
@@ -0,0 +1,37 @@
+from setuptools import setup, find_packages
+
+long_description = (open("README.txt").read()
+                    + '\n\n' +
+                    open("CHANGES.txt").read())
+
+setup(name='megrok.menu',
+      version='0.3dev',
+      description="Grok extension to configure browser menus",
+      long_description=long_description,
+      # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=['Programming Language :: Python',
+                   'Environment :: Web Environment',
+                   'Framework :: Zope3',
+                   'License :: OSI Approved :: Zope Public License',
+                   ],
+      keywords='',
+      author='Philipp von Weitershausen',
+      author_email='philipp at weitershausen.de',
+      url='http://pypi.python.org/pypi/megrok.menu',
+      license='ZPL',
+      packages=find_packages('src'),
+      package_dir = {'': 'src'},
+      namespace_packages=['megrok'],
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=[
+          'setuptools',
+          'grokcore.component',
+          'grokcore.view',
+          'grokcore.viewlet',
+          'grokcore.security',
+      ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )

Deleted: megrok.menu/tags/0.3/src/megrok/menu/component.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/component.py	2009-10-02 18:56:50 UTC (rev 104756)
+++ megrok.menu/tags/0.3/src/megrok/menu/component.py	2009-11-02 12:45:33 UTC (rev 105442)
@@ -1,25 +0,0 @@
-import martian.util
-import grokcore.component
-from martian.error import GrokImportError
-from zope.app.publisher.browser.menu import BrowserMenu
-
-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, 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, extra)
-

Copied: megrok.menu/tags/0.3/src/megrok/menu/component.py (from rev 104757, megrok.menu/trunk/src/megrok/menu/component.py)
===================================================================
--- megrok.menu/tags/0.3/src/megrok/menu/component.py	                        (rev 0)
+++ megrok.menu/tags/0.3/src/megrok/menu/component.py	2009-11-02 12:45:33 UTC (rev 105442)
@@ -0,0 +1,25 @@
+import martian.util
+import grokcore.component
+from martian.error import GrokImportError
+from zope.app.publisher.browser.menu import BrowserMenu
+
+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=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):
+            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)
+

Deleted: megrok.menu/tags/0.3/src/megrok/menu/grokker.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/grokker.py	2009-10-02 18:56:50 UTC (rev 104756)
+++ megrok.menu/tags/0.3/src/megrok/menu/grokker.py	2009-11-02 12:45:33 UTC (rev 105442)
@@ -1,124 +0,0 @@
-import martian
-from martian.error import GrokError
-
-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
-
-import megrok.menu
-
-class MenuGrokker(martian.ClassGrokker):
-    martian.component(megrok.menu.Menu)
-    martian.priority(1500)
-    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, name, title, description, **kw):
-        menuDirective(config, id=name, class_=factory,
-                      title=title, description=description)
-        return True
-
-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, permission, 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
-        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)
-        menuItemDirective(config, menu=menu, for_=context, action=name,
-                          title=title, description=description, icon=icon,
-                          filter=filter, permission=permission, layer=layer,
-                          order=order, extra=extra)
-
-        # Menu items check whether the view that they refer to can be
-        # traversed to.  Unfortunately, views will end up being
-        # security proxied during that fake traversal.  For this to
-        # work then, we must define a checker not only for __call__
-        # but also for browserDefault and those other methods from
-        # 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=('protectMenuName', factory, method_name),
-                callable=protect_getattr,
-                args=(factory, method_name, permission),
-                )
-
-        return True

Copied: megrok.menu/tags/0.3/src/megrok/menu/grokker.py (from rev 104757, megrok.menu/trunk/src/megrok/menu/grokker.py)
===================================================================
--- megrok.menu/tags/0.3/src/megrok/menu/grokker.py	                        (rev 0)
+++ megrok.menu/tags/0.3/src/megrok/menu/grokker.py	2009-11-02 12:45:33 UTC (rev 105442)
@@ -0,0 +1,143 @@
+import martian
+from martian.error import GrokError
+
+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
+
+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)
+    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, name, title, description, **kw):
+        menuDirective(config, id=name, class_=factory,
+                      title=title, description=description)
+        return True
+
+
+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.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,
+                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, 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:
+            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=enforced_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.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, order, context=None,
+                layer=None, name=u'', menuitem=None, description=u'',
+                title=u''):
+
+        if menuitem is None:
+            return False
+        
+        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:
+            raise GrokError("The %r menu could not be found.  Please use "
+                            "megrok.menu.Menu to register a menu first."
+                            % menu_id, factory)
+        menuItemDirective(config, menu=menu, for_=context, action=name,
+                          title=title, description=description, icon=icon,
+                          filter=filter, permission=permission, layer=layer,
+                          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
+        # security proxied during that fake traversal.  For this to
+        # work then, we must define a checker not only for __call__
+        # but also for browserDefault and those other methods from
+        # 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=('protectMenuName', factory, method_name),
+                callable=protect_getattr,
+                args=(factory, method_name, permission),
+                )
+
+        return True

Copied: megrok.menu/tags/0.3/src/megrok/menu/tests/test_order.py (from rev 105440, megrok.menu/trunk/src/megrok/menu/tests/test_order.py)
===================================================================
--- megrok.menu/tags/0.3/src/megrok/menu/tests/test_order.py	                        (rev 0)
+++ megrok.menu/tags/0.3/src/megrok/menu/tests/test_order.py	2009-11-02 12:45:33 UTC (rev 105442)
@@ -0,0 +1,105 @@
+"""
+  >>> from zope.component import getUtility
+  >>> from zope.app.publisher.interfaces.browser import IBrowserMenu
+  >>> from zope.publisher.browser import TestRequest
+
+A menu is available as a named utility providing ``IBrowserMenu``.
+
+  >>> menu = getUtility(IBrowserMenu, 'ordered')
+  >>> manfred = Mammoth()
+  >>> request = TestRequest()
+
+In order to retrieve the menu items, we need to pass in a context
+object and a request.  The menu then determines which menu items are
+available for this particular object and the principal that's attached
+to the request:
+
+  >>> from pprint import pprint
+  >>> pprint(menu.getMenuItems(manfred, request))
+  [{'action': 'cluelessview',
+    'description': "We keep the 'menuitem' directive order info if present !",
+    'extra': None,
+    'icon': None,
+    'selected': u'',
+    'submenu': None,
+    'title': 'What should I chose ?'},
+   {'action': 'firstview',
+    'description': u'',
+    'extra': None,
+    'icon': None,
+    'selected': u'',
+    'submenu': None,
+    'title': 'my first view'},
+   {'action': 'secondview',
+    'description': u'',
+    'extra': None,
+    'icon': None,
+    'selected': u'',
+    'submenu': None,
+    'title': 'my second view'},
+   {'action': 'thirdview',
+    'description': u'',
+    'extra': None,
+    'icon': None,
+    'selected': u'',
+    'submenu': None,
+    'title': 'my third view'}]
+
+"""
+
+import megrok.menu
+import grokcore.viewlet as grok
+
+
+class Mammoth(grok.Context):
+    pass
+
+
+class OrderedMenu(megrok.menu.Menu):
+    grok.name('ordered')
+    grok.title('My menu')
+
+
+class SecondView(grok.View):
+    grok.order(2)
+    grok.title('my second view')
+    megrok.menu.menuitem('ordered')
+
+    def render(self):
+        return 'test'
+
+
+class ThirdView(grok.View):
+    grok.title('my third view')
+    megrok.menu.menuitem('ordered', order=3)
+
+    def render(self):
+        return 'test'
+
+
+class FirstView(grok.View):
+    grok.order(1)
+    grok.title('my first view')
+    megrok.menu.menuitem('ordered')
+
+    def render(self):
+        return 'test'
+
+
+class CluelessView(grok.View):
+    grok.order(5)
+    grok.title('What should I chose ?')
+    grok.description("We keep the 'menuitem' directive "
+                     "order info if present !")
+    megrok.menu.menuitem('ordered', order=0)
+
+    def render(self):
+        return 'test'
+    
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.menu.tests import FunctionalLayer
+    suite = doctest.DocTestSuite()
+    suite.layer = FunctionalLayer
+    return suite



More information about the checkins mailing list