[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