[Checkins] SVN: z3c.menu.ready2go/trunk/s implemented directives which allow to use locales in i18nTitle attribute:
Roger Ineichen
roger at projekt01.ch
Mon Oct 13 21:14:55 EDT 2008
Log message for revision 92184:
implemented directives which allow to use locales in i18nTitle attribute:
- z3c:addMenuItem
- z3c:contextMenuItem
- z3c:globalMenuItem
- z3c:siteMenuItem
TODO:
write tests
Changed:
U z3c.menu.ready2go/trunk/setup.py
U z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.py
U z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/meta.zcml
U z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/zcml.py
-=-
Modified: z3c.menu.ready2go/trunk/setup.py
===================================================================
--- z3c.menu.ready2go/trunk/setup.py 2008-10-13 22:40:24 UTC (rev 92183)
+++ z3c.menu.ready2go/trunk/setup.py 2008-10-14 01:14:50 UTC (rev 92184)
@@ -65,6 +65,7 @@
'z3c.template',
'zope.app.component',
'zope.app.pagetemplate',
+ 'zope.app.publisher',
'zope.configuration',
'zope.interface',
'zope.proxy',
Modified: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.py
===================================================================
--- z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.py 2008-10-13 22:40:24 UTC (rev 92183)
+++ z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/item.py 2008-10-14 01:14:50 UTC (rev 92184)
@@ -34,6 +34,9 @@
template = getPageTemplate()
+ # see z3c:add/context/site/globalMenuItemDirective
+ i18nTitle = None
+
# internal approved values
approved = False
approvedURL = None
@@ -79,7 +82,7 @@
# override it and use i18n msg ids
@property
def title(self):
- return self.__name__
+ return self.i18nTitle or self.__name__
@property
def css(self):
Modified: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/meta.zcml
===================================================================
--- z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/meta.zcml 2008-10-13 22:40:24 UTC (rev 92183)
+++ z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/meta.zcml 2008-10-14 01:14:50 UTC (rev 92184)
@@ -5,6 +5,30 @@
<meta:directives namespace="http://namespaces.zope.org/z3c">
<meta:directive
+ name="addMenuItem"
+ schema=".zcml.IMenuItemDirective"
+ handler=".zcml.addMenuItemDirective"
+ />
+
+ <meta:directive
+ name="contextMenuItem"
+ schema=".zcml.IMenuItemDirective"
+ handler=".zcml.contextMenuItemDirective"
+ />
+
+ <meta:directive
+ name="globalMenuItem"
+ schema=".zcml.IMenuItemDirective"
+ handler=".zcml.globalMenuItemDirective"
+ />
+
+ <meta:directive
+ name="siteMenuItem"
+ schema=".zcml.IMenuItemDirective"
+ handler=".zcml.siteMenuItemDirective"
+ />
+
+ <meta:directive
name="menuSelector"
schema=".zcml.IMenuSelectorDirective"
handler=".zcml.menuSelectorDirective"
Modified: z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/zcml.py
===================================================================
--- z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/zcml.py 2008-10-13 22:40:24 UTC (rev 92183)
+++ z3c.menu.ready2go/trunk/src/z3c/menu/ready2go/zcml.py 2008-10-14 01:14:50 UTC (rev 92184)
@@ -18,14 +18,20 @@
import zope.interface
import zope.configuration.fields
+import zope.security.checker
+from zope.component import zcml
+from zope.configuration.exceptions import ConfigurationError
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.publisher.interfaces.browser import IBrowserView
+from zope.viewlet import viewlet
+from zope.viewlet.metadirectives import IViewletDirective
+from zope.app.publisher.browser import viewmeta
-from zope.component import zcml
-
from z3c.i18n import MessageFactory as _
from z3c.menu.ready2go import interfaces
from z3c.menu.ready2go import checker
+from z3c.menu.ready2go import item
class IMenuSelectorDirective(zope.interface.Interface):
@@ -74,6 +80,157 @@
default=interfaces.IMenuItem)
+class IMenuItemDirective(IViewletDirective):
+ """Menu item directive."""
+
+ title = zope.configuration.fields.MessageID(
+ title=u"I18n title",
+ description=u"Translatable title for a viewlet.",
+ required=False)
+
+
+# menuItem directive
+def menuItemDirective(
+ _context, name, permission, for_=zope.interface.Interface,
+ layer=IDefaultBrowserLayer, view=IBrowserView,
+ manager=interfaces.IMenuManager, class_=None, template=None,
+ attribute='render', allowed_interface=None, allowed_attributes=None,
+ title=None, **kwargs):
+
+ # Security map dictionary
+ required = {}
+
+ if title is not None:
+ # set i18n aware title
+ kwargs['i18nTitle'] = title
+
+ # Get the permission; mainly to correctly handle CheckerPublic.
+ permission = viewmeta._handle_permission(_context, permission)
+
+ # Either the class or template must be specified.
+ if not (class_ or template):
+ raise ConfigurationError("Must specify a class or template")
+
+ # Make sure that all the non-default attribute specifications are correct.
+ if attribute != 'render':
+ if template:
+ raise ConfigurationError(
+ "Attribute and template cannot be used together.")
+
+ # Note: The previous logic forbids this condition to evere occur.
+ if not class_:
+ raise ConfigurationError(
+ "A class must be provided if attribute is used")
+
+ # Make sure that the template exists and that all low-level API methods
+ # have the right permission.
+ if template:
+ template = os.path.abspath(str(_context.path(template)))
+ if not os.path.isfile(template):
+ raise ConfigurationError("No such file", template)
+ required['__getitem__'] = permission
+
+ # Make sure the has the right form, if specified.
+ if class_:
+ if attribute != 'render':
+ if not hasattr(class_, attribute):
+ raise ConfigurationError(
+ "The provided class doesn't have the specified attribute "
+ )
+ if template:
+ # Create a new class for the viewlet template and class.
+ new_class = viewlet.SimpleViewletClass(
+ template, bases=(class_, ), attributes=kwargs, name=name)
+ else:
+ if not hasattr(class_, 'browserDefault'):
+ cdict = {'browserDefault':
+ lambda self, request: (getattr(self, attribute), ())}
+ else:
+ cdict = {}
+
+ cdict['__name__'] = name
+ cdict['__page_attribute__'] = attribute
+ cdict.update(kwargs)
+ new_class = type(class_.__name__,
+ (class_, viewlet.SimpleAttributeViewlet), cdict)
+
+ if hasattr(class_, '__implements__'):
+ zope.interface.classImplements(new_class, IBrowserPublisher)
+
+ else:
+ # Create a new class for the viewlet template alone.
+ new_class = viewlet.SimpleViewletClass(template, name=name,
+ attributes=kwargs)
+
+ # Set up permission mapping for various accessible attributes
+ viewmeta._handle_allowed_interface(
+ _context, allowed_interface, permission, required)
+ viewmeta._handle_allowed_attributes(
+ _context, allowed_attributes, permission, required)
+ viewmeta._handle_allowed_attributes(
+ _context, kwargs.keys(), permission, required)
+ viewmeta._handle_allowed_attributes(
+ _context,
+ (attribute, 'browserDefault', 'update', 'render', 'publishTraverse'),
+ permission, required)
+
+ # Register the interfaces.
+ viewmeta._handle_for(_context, for_)
+ zcml.interface(_context, view)
+
+ # Create the security checker for the new class
+ zope.security.checker.defineChecker(new_class,
+ zope.security.checker.Checker(required))
+
+ # register viewlet
+ _context.action(
+ discriminator = ('viewlet', for_, layer, view, manager, name),
+ callable = zcml.handler,
+ args = ('registerAdapter',
+ new_class, (for_, layer, view, manager),
+ zope.viewlet.interfaces.IViewlet, name, _context.info),)
+
+
+def addMenuItemDirective(_context, name, permission,
+ for_=zope.interface.Interface, layer=IDefaultBrowserLayer,
+ view=IBrowserView, manager=interfaces.IMenuManager,
+ class_=item.AddMenuItem, template=None, attribute='render',
+ allowed_interface=None, allowed_attributes=None, title=None, **kwargs):
+ menuItemDirective(_context, name, permission, for_, layer, view, manager,
+ class_, template, attribute, allowed_interface, allowed_attributes,
+ title, **kwargs)
+
+
+def contextMenuItemDirective(_context, name, permission,
+ for_=zope.interface.Interface, layer=IDefaultBrowserLayer,
+ view=IBrowserView, manager=interfaces.IMenuManager,
+ class_=item.ContextMenuItem,template=None, attribute='render',
+ allowed_interface=None, allowed_attributes=None, title=None, **kwargs):
+ menuItemDirective(_context, name, permission, for_, layer, view, manager,
+ class_, template, attribute, allowed_interface, allowed_attributes,
+ title, **kwargs)
+
+
+def globalMenuItemDirective(_context, name, permission,
+ for_=zope.interface.Interface, layer=IDefaultBrowserLayer,
+ view=IBrowserView, manager=interfaces.IMenuManager,
+ class_=item.GlobalMenuItem, template=None, attribute='render',
+ allowed_interface=None, allowed_attributes=None, title=None, **kwargs):
+ menuItemDirective(_context, name, permission, for_, layer, view, manager,
+ class_, template, attribute, allowed_interface, allowed_attributes,
+ title, **kwargs)
+
+
+def siteMenuItemDirective(_context, name, permission,
+ for_=zope.interface.Interface, layer=IDefaultBrowserLayer,
+ view=IBrowserView, manager=interfaces.IMenuManager,
+ class_=item.SiteMenuItem, template=None, attribute='render',
+ allowed_interface=None, allowed_attributes=None, title=None, **kwargs):
+ menuItemDirective(_context, name, permission, for_, layer, view, manager,
+ class_, template, attribute, allowed_interface, allowed_attributes,
+ title, **kwargs)
+
+
# menu selector directive
def menuSelectorDirective(
_context, factory=checker.TrueSelectedChecker,
More information about the Checkins
mailing list