[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