[Checkins] SVN: z3c.menu/trunk/src/z3c/menu/simple/ Added simple menu implementation

Roger Ineichen roger at projekt01.ch
Fri Aug 11 13:17:38 EDT 2006


Log message for revision 69409:
  Added simple menu implementation

Changed:
  A   z3c.menu/trunk/src/z3c/menu/simple/
  A   z3c.menu/trunk/src/z3c/menu/simple/README.txt
  A   z3c.menu/trunk/src/z3c/menu/simple/__init__.py
  A   z3c.menu/trunk/src/z3c/menu/simple/action.pt
  A   z3c.menu/trunk/src/z3c/menu/simple/action_item.pt
  A   z3c.menu/trunk/src/z3c/menu/simple/browser_menu_action_item.pt
  A   z3c.menu/trunk/src/z3c/menu/simple/interfaces.py
  A   z3c.menu/trunk/src/z3c/menu/simple/menu.py
  A   z3c.menu/trunk/src/z3c/menu/simple/menu_item.pt
  A   z3c.menu/trunk/src/z3c/menu/simple/tab.pt
  A   z3c.menu/trunk/src/z3c/menu/simple/tab_item.pt
  A   z3c.menu/trunk/src/z3c/menu/simple/tests.py

-=-
Added: z3c.menu/trunk/src/z3c/menu/simple/README.txt
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/README.txt	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/README.txt	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,234 @@
+===========
+Simple Menu
+===========
+
+The z3c.menu.simple package provides a simple menu implementation which 
+allows you to implement simply menus based on content providers and viewlets.
+
+Right now there are some ``SimpleMenuItem`` menu item implementations and
+a tabbed menu with tab/tab-item and action/action-item located in this 
+package.
+
+Let's see what this means.
+
+
+ContextMenu
+-----------
+
+  >>> from zope.viewlet.interfaces import IViewlet
+  >>> from zope.viewlet.interfaces import IViewletManager
+
+Let's create a menu which means we define a viewlet manager interface:
+
+  >>> class IMenu(IViewletManager):
+  ...     """Menu viewlet manager."""
+
+You can then create a viewlet manager using this interface now:
+
+  >>> from zope.viewlet import manager
+  >>> Menu = manager.ViewletManager('left', IMenu)
+
+Now we have to define a context:
+
+  >>> import zope.interface
+  >>> from zope.app.container import contained
+  >>> from zope.app.container.interfaces import IContained
+  >>> class Content(contained.Contained):
+  ...     zope.interface.implements(IContained)
+  >>> root['content'] = Content()
+  >>> content = root['content']
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+  >>> from zope.publisher.interfaces.browser import IBrowserView
+  >>> class View(contained.Contained):
+  ...     zope.interface.implements(IBrowserView)
+  ...     def __init__(self, context, request):
+  ...         self.__parent__ = context
+  ...         self.context = context
+  ...         self.request = request
+  >>> view = View(content, request)
+
+  >>> menu = Menu(content, request, view)
+
+So initially no menu get rendered:
+
+  >>> menu.update()
+  >>> menu.render()
+  u''
+
+But now we register a context menu item for the IMenu:
+
+  >>> import zope.component
+  >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+
+  >>> from z3c.menu.simple.menu import ContextMenuItem
+  >>> class MyLocalLink(ContextMenuItem):
+  ...
+  ...     __name__ = u'MyLocalLink'
+  ...     urlEndings = 'myLocal.html'
+  ...     viewURL = 'myLocal.html'
+
+  >>> # Create a security checker for viewlets.
+  >>> from zope.security.checker import NamesChecker, defineChecker
+  >>> viewletChecker = NamesChecker(('update', 'render'))
+  >>> defineChecker(MyLocalLink, viewletChecker)
+
+  >>> zope.component.provideAdapter(
+  ...     MyLocalLink,
+  ...     (zope.interface.Interface, IDefaultBrowserLayer,
+  ...     IBrowserView, IMenu),
+  ...     IViewlet, name='MyLocalLink')
+
+Now see what we get if the IMenu viewlet manager get used:
+
+  >>> menu.update()
+  >>> print menu.render()
+  <a href="http://127.0.0.1/content/myLocal.html"
+     class="inactive-menu-item">MyLocalLink</a>
+
+
+GlobalMenu
+----------
+
+  >>> from z3c.menu.simple.menu import GlobalMenuItem
+  >>> class MyGlobalLink(GlobalMenuItem):
+  ...
+  ...     __name__ = u'MyGlobalLink'
+  ...     urlEndings = 'myGlobal.html'
+  ...     viewURL = 'myGlobal.html'
+
+  >>> defineChecker(MyGlobalLink, viewletChecker)
+
+  >>> zope.component.provideAdapter(
+  ...     MyGlobalLink,
+  ...     (zope.interface.Interface, IDefaultBrowserLayer,
+  ...     IBrowserView, IMenu),
+  ...     IViewlet, name='MyGlobalLink')
+
+Now see what we get if the IMenu viewlet manager get used:
+
+  >>> menu.update()
+  >>> print menu.render()
+  <a href="http://127.0.0.1/myGlobal.html"
+     class="inactive-menu-item">MyGlobalLink</a>
+  <a href="http://127.0.0.1/content/myLocal.html"
+     class="inactive-menu-item">MyLocalLink</a>
+
+
+TabbedMenu
+----------
+
+Now we create a tabbed menu called MasterMenu:
+
+  >>> class IMasterMenu(IViewletManager):
+  ...     """Master menu viewlet manager."""
+
+Let's create a viewlet manager using this interface and the TabMenu as base 
+class:
+
+  >>> from z3c.menu.simple.menu import TabMenu
+  >>> MasterMenu = manager.ViewletManager('masterMenu', IMasterMenu, 
+  ...                                     bases=(TabMenu,))
+
+We use the same context, request and view like before: 
+
+  >>> masterMenu = MasterMenu(content, request, view)
+
+So initially no menu get rendered:
+
+  >>> masterMenu.update()
+  >>> masterMenu.render()
+  u''
+
+Now we register a menu tab which is also a viewlet manager:
+
+  >>> from zope.app.pagetemplate import viewpagetemplatefile
+  >>> from z3c.menu.simple import ITab
+  >>> from z3c.menu.simple.menu import Tab
+  >>> class MyTabs(Tab):
+  ...     template = viewpagetemplatefile.ViewPageTemplateFile('tab.pt')
+  >>> myTabs = MyTabs(content, request, view)
+
+Also here, initially no tab get rendered:
+
+  >>> myTabs.update()
+  >>> myTabs.render()
+  u''
+
+Now we register a menu action which is also a viewlet manager:
+
+  >>> from z3c.menu.simple import IAction
+  >>> from z3c.menu.simple.menu import Action
+  >>> class MyActions(Action):
+  ...     template = viewpagetemplatefile.ViewPageTemplateFile('action.pt')
+  >>> myActions = MyActions(content, request, view)
+
+Also here, initially no tab get rendered:
+
+  >>> myActions.update()
+  >>> myActions.render()
+  u''
+
+After setup the TabMenu, Tab and Action viewlet managers, we start to register
+a tab menu item:
+
+  >>> from z3c.menu.simple.menu import TabItem
+  >>> class MyTab(TabItem):
+  ...
+  ...     __name__ = u'MyTab'
+  ...     url = 'myTab.html'
+  ...     selectedViewNames = ['myTab.html']
+
+  >>> tabChecker = NamesChecker(('update', 'render', 'css', 'selected'))
+  >>> defineChecker(MyTab, tabChecker)
+
+  >>> zope.component.provideAdapter(
+  ...     MyTab,
+  ...     (zope.interface.Interface, IDefaultBrowserLayer,
+  ...     IBrowserView, ITab),
+  ...     IViewlet, name='MyTab')
+
+Now see what we get if the tab viewlet manager get rendered:
+
+  >>> myTabs.update()
+  >>> print myTabs.render()
+  <div class="tabMenu">
+    <span class="inactive-menu-item">
+    <a href="myTab.html">MyTab</a>
+  </span>
+  </div>
+
+After showing who a tab menu item get used, we will register a menu action 
+item.
+
+  >>> from z3c.menu.simple.menu import ActionItem
+  >>> class MyAction(ActionItem):
+  ...
+  ...     __name__ = u'MyAction'
+  ...     title = 'myAction'
+
+  >>> actionChecker = NamesChecker(('update', 'render', 'title'))
+  >>> defineChecker(MyAction, actionChecker)
+
+  >>> zope.component.provideAdapter(
+  ...     MyAction,
+  ...     (zope.interface.Interface, IDefaultBrowserLayer,
+  ...     IBrowserView, IAction),
+  ...     IViewlet, name='MyAction')
+
+Now see what we get if the action viewlet manager get used:
+
+  >>> myActions.update()
+  >>> print myActions.render()
+  <div class="actionMenuWrapper">
+    <ul class="actionMenu">
+      <li class="inactive-menu-item">
+        <a href="">
+          <div>myAction</div>
+        </a>
+      </li>
+    </ul>
+  </div>
+  <div class="clearActionMenu" />


Property changes on: z3c.menu/trunk/src/z3c/menu/simple/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.menu/trunk/src/z3c/menu/simple/__init__.py
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/__init__.py	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/__init__.py	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,21 @@
+##############################################################################
+#
+# Copyright (c) 2005 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$
+"""
+__docformat__ = "reStructuredText"
+
+from z3c.menu.simple.interfaces import ITabMenu
+from z3c.menu.simple.interfaces import ITab
+from z3c.menu.simple.interfaces import IAction


Property changes on: z3c.menu/trunk/src/z3c/menu/simple/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: z3c.menu/trunk/src/z3c/menu/simple/action.pt
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/action.pt	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/action.pt	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,6 @@
+<div class="actionMenuWrapper">
+  <ul class="actionMenu">
+    <tal:block repeat="viewlet view/viewlets" replace="structure viewlet/render" />
+  </ul>
+</div>
+<div class="clearActionMenu" />


Property changes on: z3c.menu/trunk/src/z3c/menu/simple/action.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.menu/trunk/src/z3c/menu/simple/action_item.pt
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/action_item.pt	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/action_item.pt	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,7 @@
+<li class="active-menu-item or inactive-menu-item"
+    tal:attributes="class view/css">
+  <a href="#"
+     tal:attributes="href view/url">
+    <div tal:content="view/title" i18n:translate="">A</div>
+  </a>
+</li>


Property changes on: z3c.menu/trunk/src/z3c/menu/simple/action_item.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.menu/trunk/src/z3c/menu/simple/browser_menu_action_item.pt
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/browser_menu_action_item.pt	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/browser_menu_action_item.pt	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,17 @@
+<li i18n:domain="recruiter">
+  <a href="#">
+    <div class="item"
+         tal:content="view/title"
+         i18n:translate="">Actions</div>
+  </a>
+  <ul>
+     <li tal:repeat="item view/menuItems">
+       <a href="add.html"
+          tal:attributes="href item/action">
+         <div class="item"
+              tal:content="item/title"
+              i18n:translate="">Add</div>
+       </a>
+     </li>
+  </ul>
+</li>


Property changes on: z3c.menu/trunk/src/z3c/menu/simple/browser_menu_action_item.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.menu/trunk/src/z3c/menu/simple/interfaces.py
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/interfaces.py	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/interfaces.py	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,87 @@
+##############################################################################
+#
+# Copyright (c) 2005 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$
+"""
+__docformat__ = "reStructuredText"
+
+import zope.interface
+import zope.schema
+from zope.contentprovider.interfaces import IContentProvider
+from zope.viewlet.interfaces import IViewletManager
+from zope.viewlet.interfaces import IViewlet
+
+from z3c.i18n import MessageFactory as _
+
+
+class ISimpleMenuItem(IViewlet):
+    """Simple menu item."""
+
+    title = zope.schema.TextLine(
+        title=_(u'Title'),
+        description=_(u'The menu title.'),
+        default=u'',
+        readonly=True,
+        required=False)
+
+    url = zope.schema.TextLine(
+        title=_(u'URL'),
+        description=_(u'The url the menu points to.'),
+        default=u'',
+        readonly=True,
+        required=False)
+
+    extras = zope.schema.Dict(
+        title=_(u'Extras'),
+        description=_(u'Extra values usefull for custom attributes.'),
+        key_type=zope.schema.TextLine(title=u'Key'),
+        value_type=zope.schema.TextLine(title=u'Value')
+        )
+
+    selected = zope.schema.Bool(
+        title=_(u"Required"),
+        default=False,
+        required=False)
+
+    css = zope.schema.TextLine(
+        title=_(u'CSS'),
+        description=_(u'The css class depending on the selected stati.'),
+        default=u'',
+        readonly=True,
+        required=False)
+
+
+class ITabMenu(IContentProvider):
+    """Tab Menu
+
+    Items in this menu directly releat to the context you are viewing. In
+    general, the tab menu consists of two sub-menus, the tabs and the
+    actions.
+    """
+
+
+class ITab(IViewletManager):
+    """Menu controlling tab items."""
+
+
+class ITabItem(ISimpleMenuItem):
+    """Tab menu item."""
+
+
+class IAction(IViewletManager):
+    """Menu controlling the action items."""
+
+
+class ITabItem(ISimpleMenuItem):
+    """Action menu item."""


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

Added: z3c.menu/trunk/src/z3c/menu/simple/menu.py
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/menu.py	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/menu.py	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,216 @@
+##############################################################################
+#
+# Copyright (c) 2005 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$
+"""
+__docformat__ = 'restructuredtext'
+
+import zope.component
+import zope.interface
+from zope.contentprovider.interfaces import IContentProvider
+from zope.viewlet import viewlet
+from zope.app.component import hooks
+from zope.app.publisher.browser import menu
+from zope.app.publisher.interfaces.browser import IBrowserMenu
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.app.zapi import absoluteURL
+
+from z3c.i18n import MessageFactory as _
+from z3c.viewlet.manager import WeightOrderedViewletManager
+from z3c.menu.simple.interfaces import ISimpleMenuItem
+from z3c.menu.simple.interfaces import ITabMenu
+from z3c.menu.simple.interfaces import ITab
+from z3c.menu.simple.interfaces import IAction
+
+
+# ISimpleMenuItem implementation
+class SimpleMenuItem(viewlet.ViewletBase):
+    """Selectable menu item."""
+
+    zope.interface.implements(ISimpleMenuItem)
+
+    template = ViewPageTemplateFile('menu_item.pt')
+
+    selectedViewNames = None
+    activeCSS = u'active-menu-item'
+    inActiveCSS = u'inactive-menu-item'
+
+    @property
+    def title(self):
+        return _(self.__name__)
+
+    @property
+    def url(self):
+        return u''
+
+    @property
+    def extras(self):
+        return {}
+
+    @property
+    def selected(self):
+        name = self.__parent__.__name__
+        if self.selectedViewNames is None:
+            if name == self.url:
+                return True
+        elif name in self.selectedViewNames:
+            return True
+        return False
+
+    @property
+    def css(self):
+        if self.selected:
+            return self.activeCSS
+        else:
+            return self.inActiveCSS
+
+    def render(self):
+        """Return the template with the option 'menus'"""
+        return self.template()
+
+
+class ContextMenuItem(SimpleMenuItem):
+    """Menu item viewlet generating context related links."""
+
+    urlEndings = []
+    viewURL = u''
+
+    @property
+    def selected(self):
+        requestURL = self.request.getURL()
+        for urlEnding in self.urlEndings:
+            if requestURL.endswith(urlEnding):
+                return True
+        return False
+
+    @property
+    def url(self):
+        contextURL = absoluteURL(self.context, self.request)
+        return contextURL + '/' + self.viewURL
+
+
+class GlobalMenuItem(SimpleMenuItem):
+    """Menu item viewlet generating global/site related links."""
+
+    urlEndings = []
+    viewURL = u''
+
+    @property
+    def selected(self):
+        requestURL = self.request.getURL()
+        for urlEnding in self.urlEndings:
+            if requestURL.endswith(urlEnding):
+                return True
+        return False
+
+    @property
+    def url(self):
+        siteURL = absoluteURL(hooks.getSite(), self.request)
+        return siteURL + '/' + self.viewURL
+
+
+# ITabMenu implementation
+class TabMenu(object):
+    """Tab menu offering tabs and actions."""
+    zope.interface.implements(ITabMenu)
+
+    def __init__(self, context, request, view):
+        self.__parent__ = view
+        self.context = context
+        self.request = request
+
+    def update(self):
+        """See zope.contentprovider.interfaces.IContentProvider"""
+        self.tabs = zope.component.queryMultiAdapter(
+            (self.context, self.request, self.__parent__), IContentProvider, 
+            'ITab')
+        if self.tabs is not None:
+            self.tabs.update()
+        self.actions = zope.component.queryMultiAdapter(
+            (self.context, self.request, self.__parent__), IContentProvider, 
+            'IAction')
+        if self.actions is not None:
+            self.actions.update()
+
+    def render(self):
+        """See zope.contentprovider.interfaces.IContentProvider"""
+        result = u''
+        if self.tabs is not None:
+            result += self.tabs.render()
+
+        if self.actions is not None:
+            result += self.actions.render()
+
+        return result
+
+
+class Tab(WeightOrderedViewletManager):
+    """Tab Menu"""
+    zope.interface.implements(ITab)
+
+    def render(self):
+        """Return the template with the option 'menus'"""
+        if not self.viewlets:
+            return u''
+        return self.template()
+
+
+class TabItem(SimpleMenuItem):
+    """Base implementation for menu items."""
+
+    zope.interface.implements(ISimpleMenuItem)
+
+    template = ViewPageTemplateFile('tab_item.pt')
+
+
+class Action(WeightOrderedViewletManager):
+    """Action Menu"""
+    zope.interface.implements(IAction)
+
+    def render(self):
+        """Return the template with the option 'menus'"""
+        if not self.viewlets:
+            return u''
+        return self.template()
+
+
+class ActionItem(SimpleMenuItem):
+    """Base implementation for action items."""
+
+    zope.interface.implements(ISimpleMenuItem)
+
+    template = ViewPageTemplateFile('action_item.pt')
+
+
+
+class BrowserMenuActionItem(ActionItem):
+    """Menu Action Menu Items
+
+    Those menu items use a common Zope menu to provide its items.
+    """
+
+    template = ViewPageTemplateFile('browser_menu_action_item.pt')
+    # This is the name of the menu
+    menuId = None
+
+    def update(self):
+        menu = zope.component.getUtility(IBrowserMenu, self.menuId)
+        self.title = menu.title
+        self.menuItems = menu.getMenuItems(self.context, self.request)
+
+    def render(self):
+        """Return the template with the option 'menus'"""
+        if not self.menuItems:
+            return u''
+        return self.template()


Property changes on: z3c.menu/trunk/src/z3c/menu/simple/menu.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: z3c.menu/trunk/src/z3c/menu/simple/menu_item.pt
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/menu_item.pt	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/menu_item.pt	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,5 @@
+<a href="#" class="active-menu-item or inactive-menu-item"
+   tal:attributes="href view/url;
+	                 class view/css"
+   tal:content="view/title"
+	 i18n:translate="">Menu item</a>
\ No newline at end of file


Property changes on: z3c.menu/trunk/src/z3c/menu/simple/menu_item.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.menu/trunk/src/z3c/menu/simple/tab.pt
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/tab.pt	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/tab.pt	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,4 @@
+<div class="tabMenu">
+  <tal:block repeat="viewlet view/viewlets"
+             content="structure viewlet/render" />
+</div>


Property changes on: z3c.menu/trunk/src/z3c/menu/simple/tab.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.menu/trunk/src/z3c/menu/simple/tab_item.pt
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/tab_item.pt	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/tab_item.pt	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,7 @@
+<span class="active-menu-item or inactive-menu-item"
+      tal:attributes="class view/css">
+  <a href="#"
+     tal:attributes="href view/url"
+     tal:content="view/title"
+     i18n:translate="">Title</a>
+</span>
\ No newline at end of file


Property changes on: z3c.menu/trunk/src/z3c/menu/simple/tab_item.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.menu/trunk/src/z3c/menu/simple/tests.py
===================================================================
--- z3c.menu/trunk/src/z3c/menu/simple/tests.py	2006-08-11 17:15:24 UTC (rev 69408)
+++ z3c.menu/trunk/src/z3c/menu/simple/tests.py	2006-08-11 17:17:37 UTC (rev 69409)
@@ -0,0 +1,65 @@
+##############################################################################
+#
+# Copyright (c) 2005 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$
+"""
+__docformat__ = 'restructuredtext'
+
+import unittest
+import zope.interface
+import zope.security
+from zope.testing import doctest
+from zope.testing.doctestunit import DocFileSuite
+from zope.app.testing import setup, ztapi
+from zope.app.testing import functional
+
+
+class TestParticipation(object):
+    principal = 'foobar'
+    interaction = None
+
+
+def setUp(test):
+    root = setup.placefulSetUp(site=True)
+    test.globs['root'] = root
+
+
+    # resource namespace setup
+    from zope.traversing.interfaces import ITraversable
+    from zope.traversing.namespace import resource
+    ztapi.provideAdapter(None, ITraversable, resource, name="resource")
+    ztapi.provideView(None, None, ITraversable, "resource", resource)
+
+    from zope.app.pagetemplate import metaconfigure
+    from zope.contentprovider import tales
+    metaconfigure.registerType('provider', tales.TALESProviderExpression)
+
+    zope.security.management.getInteraction().add(TestParticipation())
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def test_suite():
+    return unittest.TestSuite((
+        DocFileSuite('README.txt',
+            setUp=setUp, tearDown=tearDown,
+            optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+            ),
+        ))
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


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



More information about the Checkins mailing list