[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