[Checkins] SVN: z3c.menu.ready2go/trunk/ Added interface for menu manager and item

Roger Ineichen roger at projekt01.ch
Fri Dec 28 21:49:28 EST 2007


Log message for revision 82531:
  Added interface for menu manager and item
  Added unit tests for menu manager and item

Changed:
  U   z3c.menu.ready2go/trunk/CHANGES.txt
  U   z3c.menu.ready2go/trunk/buildout.cfg
  _U  z3c.menu.ready2go/trunk/externals/
  U   z3c.menu.ready2go/trunk/setup.py
  A   z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/interfaces.py
  U   z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.pt
  U   z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.py
  U   z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/manager.py
  A   z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/tests.py

-=-
Modified: z3c.menu.ready2go/trunk/CHANGES.txt
===================================================================
--- z3c.menu.ready2go/trunk/CHANGES.txt	2007-12-29 02:09:18 UTC (rev 82530)
+++ z3c.menu.ready2go/trunk/CHANGES.txt	2007-12-29 02:49:28 UTC (rev 82531)
@@ -2,7 +2,7 @@
 CHANGES
 =======
 
-Version 0.5.0 (unreleased)
---------------------------
+Version 0.5.0dev (unreleased)
+-----------------------------
 
 - Initial Release

Modified: z3c.menu.ready2go/trunk/buildout.cfg
===================================================================
--- z3c.menu.ready2go/trunk/buildout.cfg	2007-12-29 02:09:18 UTC (rev 82530)
+++ z3c.menu.ready2go/trunk/buildout.cfg	2007-12-29 02:49:28 UTC (rev 82531)
@@ -1,7 +1,16 @@
 [buildout]
 develop = .
-parts = test
+          externals/zope.viewlet
+parts = test checker coverage
 
 [test]
 recipe = zc.recipe.testrunner
 eggs = z3c.menu.ready2go [test]
+
+[checker]
+recipe = lovely.recipe:importchecker
+path = src/z3c/menu/ready2go
+
+[coverage]
+recipe = zc.recipe.egg
+eggs = z3c.coverage


Property changes on: z3c.menu.ready2go/trunk/externals
___________________________________________________________________
Name: svn:externals
   + zope.viewlet          svn://svn.zope.org/repos/main/zope.viewlet/trunk


Modified: z3c.menu.ready2go/trunk/setup.py
===================================================================
--- z3c.menu.ready2go/trunk/setup.py	2007-12-29 02:09:18 UTC (rev 82530)
+++ z3c.menu.ready2go/trunk/setup.py	2007-12-29 02:49:28 UTC (rev 82531)
@@ -23,7 +23,7 @@
 
 setup (
     name='z3c.menu.ready2go',
-    version='0.5.0',
+    version='0.5.0dev',
     author = "Stephan Richter, Roger Ineichen and the Zope Community",
     author_email = "zope3-dev at zope.org",
     description = "A ready to go menu for Zope3",
@@ -52,18 +52,19 @@
     extras_require = dict(
         test = [
             'zope.testbrowser',
-            'zope.app.securitypolicy',
+            'zope.component',
             'zope.app.testing',
-            'zope.app.zcmlfiles',
-            'zope.app.twisted',
+            'z3c.testing',
             ],
         ),
     install_requires = [
         'setuptools',
-        'zope.configuration',
+        'z3c.i18n',
+        'zope.app.component',
+        'zope.app.pagetemplate',
+        'zope.schema',
         'zope.traversing',
-        'zope.app.http',
-        'zope.app.publisher',
+        'zope.viewlet',
         ],
     zip_safe = False,
 )
\ No newline at end of file

Added: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/interfaces.py
===================================================================
--- z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/interfaces.py	                        (rev 0)
+++ z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/interfaces.py	2007-12-29 02:49:28 UTC (rev 82531)
@@ -0,0 +1,118 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id: layer.py 197 2007-04-13 05:03:32Z rineichen $
+"""
+
+import zope.schema
+from zope.viewlet import interfaces
+
+from z3c.i18n import MessageFactory as _
+
+
+class IMenuManager(interfaces.IViewletManager):
+    """Generic nenu manager."""
+
+    def render():
+        """Represent the menu"""
+
+
+class IMenuItem(interfaces.IViewlet):
+    """Menu item base."""
+
+    template = zope.interface.Attribute("""Page template""")
+
+    contextInterface = zope.interface.Attribute(
+        """Context discriminator interface""")
+
+    viewInterface = zope.interface.Attribute(
+        """View discriminator interface""")
+
+    title = zope.schema.TextLine(
+        title=_('Title'),
+        description=_('Menu item title'),
+        default=u''
+        )
+
+    viewName = zope.schema.TextLine(
+        title=_('View name'),
+        description=_('Name of the view which the menu points to.'),
+        default=u''
+        )
+
+    weight = zope.schema.TextLine(
+        title=_('Weight'),
+        description=_('Weight of the menu item order.'),
+        default=u''
+        )
+
+    cssActive = zope.schema.TextLine(
+        title=_('Active CSS class name'),
+        description=_('CSS class name for active menu items'),
+        default=u''
+        )
+
+    cssInActive = zope.schema.TextLine(
+        title=_('In-Active CSS class name'),
+        description=_('CSS class name for inactive menu items'),
+        default=u''
+        )
+
+    css = zope.schema.TextLine(
+        title=_('CSS class name'),
+        description=_('CSS class name'),
+        default=u''
+        )
+
+    available = zope.schema.Bool(
+        title=_('Available'),
+        description=_('Marker for available menu item'),
+        default=True
+        )
+
+    selected = zope.schema.Bool(
+        title=_('Selected'),
+        description=_('Marker for selected menu item'),
+        default=False
+        )
+
+    url = zope.schema.TextLine(
+        title=_('URL'),
+        description=_('URL or other url like javascript function.'),
+        default=u''
+        )
+
+    subProviderName = zope.schema.TextLine(
+        title=_('Sub menu provider name'),
+        description=_('Name of the sub menu provider.'),
+        default=u''
+        )
+
+    def getURLContext():
+        """Returns the context the base url."""
+
+    def render():
+        """Return the template with the option 'menus'"""
+
+
+class IGlobalMenuItem(IMenuItem):
+    """Menu item with nearest site as url base."""
+
+
+class IContextMenuItem(IMenuItem):
+    """Menu item with context as url base."""
+
+
+class IAddMenuItem(IMenuItem):
+    """Add menu item with context as url base."""


Property changes on: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.pt
===================================================================
--- z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.pt	2007-12-29 02:09:18 UTC (rev 82530)
+++ z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.pt	2007-12-29 02:49:28 UTC (rev 82531)
@@ -1,5 +1,8 @@
 <li class="current"
-    tal:attributes="class view/css">
+    tal:attributes="class view/css"
+	tal:define="subProviderName view/subProviderName">
   <a href="#"
      tal:attributes="href view/url"><span i18n:translate="" tal:content="view/title">Title</span></a>
+  <tal:block condition="subProviderName"
+             replace="structure provider:${subProviderName}">sub menu items</tal:block>
 </li>

Modified: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.py
===================================================================
--- z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.py	2007-12-29 02:09:18 UTC (rev 82530)
+++ z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.py	2007-12-29 02:49:28 UTC (rev 82531)
@@ -22,7 +22,9 @@
 from zope.app.component import hooks
 from zope.app.pagetemplate import ViewPageTemplateFile
 
+from z3c.menu.ready2go import interfaces
 
+
 # base menu item mixin
 class MenuItem(viewlet.ViewletBase):
     """Menu item base."""
@@ -36,6 +38,7 @@
     cssActive = u'selected'
     cssInActive = u''
     weight = 0
+    subMenuProviderName = None
 
     # override it and use i18n msg ids
     @property
@@ -43,13 +46,6 @@
         return self.__name__
 
     @property
-    def available(self):
-        return True
-
-    def getURLContext(self):
-        return hooks.getSite()
-
-    @property
     def css(self):
         if self.selected:
             return self.cssActive
@@ -73,6 +69,14 @@
         context = self.getURLContext()
         return absoluteURL(context, self.request) + '/' + self.viewName
 
+    @property
+    def subProviderName(self):
+        """Name of the sub item menu provider."""
+        return self.subMenuProviderName
+
+    def getURLContext(self):
+        return hooks.getSite()
+
     def render(self):
         """Return the template with the option 'menus'"""
         return self.template()
@@ -84,6 +88,8 @@
 class GlobalMenuItem(MenuItem):
     """Global menu item."""
 
+    zope.interface.implements(interfaces.IGlobalMenuItem)
+
     @property
     def selected(self):
         if self.viewInterface.providedBy(self.__parent__) and \
@@ -98,5 +104,24 @@
 class ContextMenuItem(MenuItem):
     """Context menu item."""
 
+    zope.interface.implements(interfaces.IContextMenuItem)
+
     def getURLContext(self):
         return self.context
+
+
+class AddMenuItem(MenuItem):
+    """Add menu item."""
+
+    zope.interface.implements(interfaces.IAddMenuItem)
+
+    @property
+    def selected(self):
+        return False
+
+    @property
+    def subProviderName(self):
+        return None
+
+    def getURLContext(self):
+        return self.context

Modified: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/manager.py
===================================================================
--- z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/manager.py	2007-12-29 02:09:18 UTC (rev 82530)
+++ z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/manager.py	2007-12-29 02:49:28 UTC (rev 82531)
@@ -17,39 +17,12 @@
 __docformat__ = "reStructuredText"
 
 import zope.interface
-import zope.security
-from zope.traversing.browser import absoluteURL
 from zope.viewlet import manager
-from zope.app.component import hooks
-from zope.app.pagetemplate import ViewPageTemplateFile
 
+from z3c.menu.ready2go import interfaces
 
-def getWeight((name, viewlet)):
-    try:
-        return int(viewlet.weight)
-    except AttributeError:
-        return 0
 
-
-# base menu manager mixin
-class MenuManager(manager.ViewletManagerBase):
+class MenuManager(manager.ConditionalViewletManager):
     """Menu manager for all kind of menu items"""
 
-    def sort(self, viewlets):
-        return sorted(viewlets, key=getWeight)
-
-    def filter(self, viewlets):
-        """Filter available menu items."""
-        # Only return viewlets accessible to the principal
-        return [(name, viewlet) for name, viewlet in viewlets
-                if zope.security.canAccess(viewlet, 'render') and
-                viewlet.available == True]
-
-    def render(self):
-        """Return the template whihc renders the menu items."""
-        if not self.viewlets:
-            return u''
-        return self.template()
-
-    def __repr__(self):
-        return '<%s %r>' % (self.__class__.__name__, self.__name__)
+    zope.interface.implements(interfaces.IMenuManager)

Added: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/tests.py
===================================================================
--- z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/tests.py	                        (rev 0)
+++ z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/tests.py	2007-12-29 02:49:28 UTC (rev 82531)
@@ -0,0 +1,100 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id: __init__.py 97 2007-03-29 22:58:27Z rineichen $
+"""
+
+import unittest
+import zope.component
+from zope.traversing.browser.interfaces import IAbsoluteURL
+from zope.app.component import hooks
+from zope.app.testing import setup
+
+import z3c.testing
+from z3c.menu.ready2go import interfaces
+from z3c.menu.ready2go import item
+from z3c.menu.ready2go import manager
+
+
+class ParentStub(object):
+    """Just an object supporting a context attribtute."""
+
+    context = None
+    __name__ = None
+
+
+class AbsoulteURLStub(object):
+    """Absolute url stub."""
+
+    def __init__(self, context, request):
+        pass
+
+    def __str__(self):
+        return u'here'
+
+    __call__ = __str__
+
+
+class MenuManagerTest(z3c.testing.InterfaceBaseTest):
+
+    def getTestInterface(self):
+        return interfaces.IMenuManager
+
+    def getTestClass(self):
+        return manager.MenuManager
+
+    def getTestPos(self):
+        return (None, None, None)
+
+
+class GlobalMenuItemTest(z3c.testing.InterfaceBaseTest):
+
+    def setUp(self):
+        site = setup.placefulSetUp(site=True)
+        hooks.setSite(site)
+        zope.component.provideAdapter(AbsoulteURLStub, (None, None),
+            IAbsoluteURL)
+        super(GlobalMenuItemTest, self).setUp()
+
+    def getTestInterface(self):
+        return interfaces.IGlobalMenuItem
+
+    def getTestClass(self):
+        return item.GlobalMenuItem
+
+    def getTestPos(self):
+        return (None, None, ParentStub(), None)
+
+
+class ContextMenuItemTest(z3c.testing.InterfaceBaseTest):
+
+    def getTestInterface(self):
+        return interfaces.IContextMenuItem
+
+    def getTestClass(self):
+        return item.ContextMenuItem
+
+    def getTestPos(self):
+        return (None, None, ParentStub(), None)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(MenuManagerTest),
+        unittest.makeSuite(GlobalMenuItemTest),
+        unittest.makeSuite(ContextMenuItemTest),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Checkins mailing list