[CMF-checkins] SVN: CMF/trunk/C Merged CMFonFive into CMF itself.

Florent Guillaume fg at nuxeo.com
Sat Sep 24 11:51:32 EDT 2005


Log message for revision 38594:
  Merged CMFonFive into CMF itself.
  Switched tests to doctests.
  
  

Changed:
  U   CMF/trunk/CHANGES.txt
  U   CMF/trunk/CMFCore/__init__.py
  A   CMF/trunk/CMFCore/browser/
  A   CMF/trunk/CMFCore/browser/__init__.py
  A   CMF/trunk/CMFCore/browser/configure.zcml
  A   CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py
  A   CMF/trunk/CMFCore/browser/meta.zcml
  A   CMF/trunk/CMFCore/configure.zcml
  A   CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml
  A   CMF/trunk/CMFCore/fiveactionstool.py
  A   CMF/trunk/CMFCore/meta.zcml
  A   CMF/trunk/CMFCore/tests/fiveactions.zcml
  A   CMF/trunk/CMFCore/tests/test_fiveactionstool.py
  U   CMF/trunk/CMFDefault/configure.zcml
  A   CMF/trunk/CMFDefault/skin/
  A   CMF/trunk/CMFDefault/skin/__init__.py
  A   CMF/trunk/CMFDefault/skin/configure.zcml
  A   CMF/trunk/CMFDefault/skin/five_template.pt

-=-
Modified: CMF/trunk/CHANGES.txt
===================================================================
--- CMF/trunk/CHANGES.txt	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CHANGES.txt	2005-09-24 15:51:32 UTC (rev 38594)
@@ -2,6 +2,19 @@
 
   New Features
 
+    - The features of CMFonFive have been folder into CMFCore and
+      CMFDefault:
+
+      * Zope 3 menus (browser:menu) are bridged to CMF actions using the
+        portal_fiveactions tool. Any menuItem registered will be
+        accessible though the portal_actions tool, where the menu for
+        which the item was registered will be used as the action
+        category.
+
+      * The Zope 3 'cmf' skin layer provides integration between the
+        Zope3 standard macros and the CMF main template, by redefining
+        five_template.pt.
+
     - TypeInformation and newstyle Actions: Added i18n support.
       If 'i18n_domain' is specified, 'title' and 'description' are returned as
       MassageID objects instead of strings. This allows to use different i18n

Modified: CMF/trunk/CMFCore/__init__.py
===================================================================
--- CMF/trunk/CMFCore/__init__.py	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/__init__.py	2005-09-24 15:51:32 UTC (rev 38594)
@@ -22,6 +22,7 @@
 import ActionsTool, UndoTool, RegistrationTool, SkinsTool
 import MemberDataTool, TypesTool
 import URLTool
+import fiveactionstool
 import DirectoryView, FSImage, FSFile, FSPropertiesObject
 import FSDTMLMethod, FSPythonScript, FSSTXMethod
 import FSPageTemplate
@@ -55,6 +56,7 @@
     MemberDataTool.MemberDataTool,
     TypesTool.TypesTool,
     URLTool.URLTool,
+    fiveactionstool.FiveActionsTool,
     )
 
 this_module = modules[ __name__ ]

Added: CMF/trunk/CMFCore/browser/__init__.py
===================================================================
--- CMF/trunk/CMFCore/browser/__init__.py	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/browser/__init__.py	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1 @@
+# import this


Property changes on: CMF/trunk/CMFCore/browser/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFCore/browser/configure.zcml
===================================================================
--- CMF/trunk/CMFCore/browser/configure.zcml	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/browser/configure.zcml	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,13 @@
+<configure
+  xmlns="http://namespaces.zope.org/zope"
+  xmlns:browser="http://namespaces.zope.org/browser"
+  i18n_domain="cmf"
+  >
+
+  <!-- Set up default menus as action categories. -->
+  <browser:menu
+    id="object"
+    title="Object menu"
+    />
+
+</configure>


Property changes on: CMF/trunk/CMFCore/browser/configure.zcml
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py
===================================================================
--- CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,161 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation 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.
+#
+##############################################################################
+"""Global Browser Menu Service
+
+Five-based adaptation of the one in Zope 3.0.
+
+$Id$
+"""
+
+from zope.security.interfaces import Unauthorized, Forbidden
+from zope.interface import implementedBy
+from Products.Five.security import checkPermission, CheckerPublic
+from zope.app.publication.browser import PublicationTraverser
+from zope.app.component.interface import provideInterface
+
+from zope.app.publisher.browser.globalbrowsermenuservice import \
+     globalBrowserMenuService
+from zope.app.publisher.browser.globalbrowsermenuservice import MenuItem
+
+from zope.interface.interfaces import IInterface
+from types import ClassType
+
+
+def addMenuItem(menu_id, interface, action, title,
+                description='', filter_string=None, permission=None,
+                extra=None,
+                ):
+    registry = globalBrowserMenuService._registry[menu_id].registry
+
+    if permission:
+        if permission == 'zope.Public':
+            permission = CheckerPublic
+
+    if interface is not None and not IInterface.providedBy(interface):
+        if isinstance(interface, (type, ClassType)):
+            interface = implementedBy(interface)
+        else:
+            raise TypeError(
+                "The interface argument must be an interface (or None) "
+                "or a class.")
+
+    data = registry.get(interface) or []
+    data.append(
+        MenuItem(action, title, description, filter_string, permission, extra)
+        )
+    registry.register(interface, data)
+
+
+def getMenu(menu_id, object, request, max=999999):
+    traverser = PublicationTraverser()
+
+    result = []
+    seen = {}
+
+    # stuff for figuring out the selected view
+    request_url = request.getURL()
+
+    for item in globalBrowserMenuService.getAllMenuItems(menu_id, object):
+
+        # Make sure we don't repeat a specification for a given title
+        title = item.title
+        if title in seen:
+            continue
+        seen[title] = 1
+
+        permission = item.permission
+        action = item.action
+
+        if permission:
+            # If we have an explicit permission, check that we
+            # can access it.
+            if not checkPermission(permission, object):
+                continue
+
+        elif action:
+            # Otherwise, test access by attempting access
+            path = action
+            l = action.find('?')
+            if l >= 0:
+               path = action[:l]
+            try:
+                v = traverser.traverseRelativeURL(
+                    request, object, path)
+                # TODO:
+                # tickle the security proxy's checker
+                # we're assuming that view pages are callable
+                # this is a pretty sound assumption
+                v.__call__
+            except (Unauthorized, Forbidden):
+                continue # Skip unauthorized or forbidden
+
+        normalized_action = action
+        if action.startswith('@@'):
+            normalized_action = action[2:]
+
+        if request_url.endswith('/'+normalized_action):
+            selected='selected'
+        elif request_url.endswith('/++view++'+normalized_action):
+            selected='selected'
+        elif request_url.endswith('/@@'+normalized_action):
+            selected='selected'
+        else:
+            selected=''
+
+        result.append({
+            'title': title,
+            'description': item.description,
+            'action': "%s" % action,
+            'filter': item.filter,
+            'selected': selected,
+            'extra': item.extra,
+            })
+
+        if len(result) >= max:
+            return result
+
+    return result
+
+
+
+def menuItemDirective(_context, menu, for_,
+                      action, title, description='', filter=None,
+                      permission=None, extra=None):
+    return menuItemsDirective(_context, menu, for_).menuItem(
+        _context, action, title, description, filter, permission, extra)
+
+
+class menuItemsDirective(object):
+
+    def __init__(self, _context, menu, for_):
+        self.interface = for_
+        self.menu = menu
+
+    def menuItem(self, _context, action, title, description='',
+                 filter=None, permission=None, extra=None):
+        _context.action(
+            discriminator = ('browser:menuItem',
+                             self.menu, self.interface, title),
+            callable = addMenuItem,
+            args = (self.menu, self.interface,
+                    action, title, description, filter, permission, extra),
+            ),
+
+    def __call__(self, _context):
+        _context.action(
+            discriminator = None,
+            callable = provideInterface,
+            args = (self.interface.__module__+'.'+self.interface.getName(),
+                    self.interface)
+            )


Property changes on: CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFCore/browser/meta.zcml
===================================================================
--- CMF/trunk/CMFCore/browser/meta.zcml	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/browser/meta.zcml	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,34 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:meta="http://namespaces.zope.org/meta">
+
+  <meta:directives namespace="http://namespaces.zope.org/cmf">
+
+    <meta:directive
+        name="menu"
+        schema="zope.app.publisher.browser.metadirectives.IMenuDirective"
+        handler="zope.app.publisher.browser.globalbrowsermenuservice.menuDirective"
+        />
+
+    <meta:directive
+        name="menuItem"
+        schema="zope.app.publisher.browser.metadirectives.IMenuItemDirective"
+        handler=".browser.globalbrowsermenuservice.menuItemDirective"
+        />
+
+    <meta:complexDirective
+        name="menuItems"
+        schema="zope.app.publisher.browser.metadirectives.IMenuItemsDirective"
+        handler=".browser.globalbrowsermenuservice.menuItemsDirective"
+        >
+
+      <meta:subdirective
+          name="menuItem"
+          schema="zope.app.publisher.browser.metadirectives.IMenuItemSubdirective"
+          />
+
+    </meta:complexDirective>
+
+  </meta:directives>
+
+</configure>


Property changes on: CMF/trunk/CMFCore/browser/meta.zcml
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFCore/configure.zcml
===================================================================
--- CMF/trunk/CMFCore/configure.zcml	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/configure.zcml	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,5 @@
+<configure xmlns="http://namespaces.zope.org/zope">
+
+  <include package=".browser"/>
+
+</configure>


Property changes on: CMF/trunk/CMFCore/configure.zcml
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml
===================================================================
--- CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,8 @@
+<dtml-var manage_page_header>
+<dtml-var manage_tabs>
+
+<h3><code>portal_fiveactions</code> Tool</h3>
+
+<p>This tool provides a bridge from Zope 3 menus to CMF actions.</p>
+
+<dtml-var manage_page_footer>


Property changes on: CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFCore/fiveactionstool.py
===================================================================
--- CMF/trunk/CMFCore/fiveactionstool.py	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/fiveactionstool.py	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,103 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation 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.
+#
+##############################################################################
+""" Five actions tool.
+
+$Id$
+"""
+
+from AccessControl import ClassSecurityInfo
+from Globals import InitializeClass
+from Globals import DTMLFile
+from OFS.SimpleItem import SimpleItem
+
+from ActionInformation import ActionInformation
+from ActionProviderBase import ActionProviderBase
+from Expression import Expression
+from permissions import ManagePortal
+from utils import UniqueObject
+from utils import _dtmldir
+
+from zope.app.publisher.browser.globalbrowsermenuservice import \
+     globalBrowserMenuService
+from browser.globalbrowsermenuservice import getMenu
+
+
+class FiveActionsTool(UniqueObject, SimpleItem, ActionProviderBase):
+    """Five actions tool.
+
+    Provides a bridge that makes Zope 3 menus available as CMF actions.
+    """
+
+    __implements__ = ActionProviderBase.__implements__
+
+    id = 'portal_fiveactions'
+    meta_type = 'CMF Five Actions Tool'
+
+    security = ClassSecurityInfo()
+
+    manage_options = (({'label': 'Overview',
+                        'action': 'manage_overview'},
+                       ) +
+                      SimpleItem.manage_options)
+
+    #
+    # ZMI methods
+    #
+
+    security.declareProtected(ManagePortal, 'manage_overview')
+    manage_overview = DTMLFile('explainFiveActionsTool', _dtmldir)
+
+    #
+    # ActionProvider
+    #
+
+    security.declarePrivate('listActions')
+    def listActions(self, info=None, object=None):
+        """ List all the actions defined by a provider.
+        """
+        if object is None and info is not None:
+            # BBB (according to the interface)
+            object = info.content
+        if object is None:
+            # The tool itself doesn't provide any action
+            return ()
+
+        actions = []
+        for mid in globalBrowserMenuService._registry.keys():
+            menu = getMenu(mid, object, self.REQUEST)
+            for entry in menu:
+                # The action needs a unique name, so we'll build one
+                # from the object_id and the action url. That is sure
+                # to be unique.
+                action = str(entry['action'])
+                if object is None:
+                    act_id = 'action_%s' % action
+                else:
+                    act_id = 'action_%s_%s' % (object.getId(), action)
+
+                if entry['filter'] is None:
+                    filter = None
+                else:
+                    filter = Expression(text=str(entry['filter']))
+
+                act = ActionInformation(id=act_id,
+                    title=str(entry['title']),
+                    action=Expression(text='string:%s' % action),
+                    condition=filter,
+                    category=str(mid),
+                    visible=1)
+                actions.append(act)
+        return tuple(actions)
+
+
+InitializeClass(FiveActionsTool)


Property changes on: CMF/trunk/CMFCore/fiveactionstool.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFCore/meta.zcml
===================================================================
--- CMF/trunk/CMFCore/meta.zcml	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/meta.zcml	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,5 @@
+<configure xmlns="http://namespaces.zope.org/zope">
+
+  <include file="browser/meta.zcml"/>
+
+</configure>


Property changes on: CMF/trunk/CMFCore/meta.zcml
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFCore/tests/fiveactions.zcml
===================================================================
--- CMF/trunk/CMFCore/tests/fiveactions.zcml	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/tests/fiveactions.zcml	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,29 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    i18n_domain="cmf"
+    >
+
+  <browser:menu
+      id="mymenu"
+      title="CMF menu" />
+
+  <browser:menuItem
+      for="Products.Five.testing.simplecontent.ISimpleContent"
+      menu="mymenu"
+      title="Public Test Menu Item"
+      action="public.html"
+      description="This is a public test menu item"
+      permission="zope.Public"
+      />
+
+  <browser:menuItem
+      for="Products.Five.testing.simplecontent.ISimpleContent"
+      menu="mymenu"
+      title="Protected Test Menu Item"
+      action="protected.html"
+      description="This is a protected test menu item"
+      permission="zope2.ManageUsers"
+      />
+
+</configure>


Property changes on: CMF/trunk/CMFCore/tests/fiveactions.zcml
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFCore/tests/test_fiveactionstool.py
===================================================================
--- CMF/trunk/CMFCore/tests/test_fiveactionstool.py	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/tests/test_fiveactionstool.py	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,86 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation 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.
+#
+##############################################################################
+""" Unit tests for five actions tool.
+
+$Id$
+"""
+
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+
+def test_fiveactionstool():
+    """
+    Test the Five actions tool.
+
+    Some basic setup:
+
+      >>> from zope.app.tests.placelesssetup import setUp, tearDown
+      >>> setUp()
+
+      >>> import Products.Five
+      >>> import Products.CMFCore
+      >>> from Products.Five import zcml
+      >>> zcml.load_config('meta.zcml', Products.Five)
+      >>> zcml.load_config('permissions.zcml', Products.Five)
+      >>> zcml.load_config('meta.zcml', Products.CMFCore)
+      >>> folder = self.folder
+
+    Let's create a Five actions tool:
+
+      >>> from Products.CMFCore.fiveactionstool import FiveActionsTool
+      >>> folder.tool = FiveActionsTool()
+      >>> tool = folder.tool # rewrap
+
+    Let's create some simple content object providing ISimpleContent:
+
+      >>> from Products.Five.testing.simplecontent import SimpleContent
+      >>> foo = SimpleContent('foo', 'Foo')
+
+    Now we'll load a configuration file specifying some menu and menu
+    items for ISimpleContent.
+
+      >>> import Products.CMFCore.tests
+      >>> zcml.load_config('fiveactions.zcml', Products.CMFCore.tests)
+
+    Let's look what the tool lists as actions for such an object. Note
+    that 'action_content_protected.html' is not present, as it was
+    protected by a more restrictive permission:
+
+      >>> actions = tool.listActions(object=foo)
+      >>> [(action.category, action.id) for action in actions]
+      [('mymenu', 'action_foo_public.html')]
+
+    When looking at an object not implementing ISimpleContent, we see no
+    actions:
+
+      >>> tool.listActions(object=folder)
+      ()
+
+    The tool itself doesn't have any actions:
+
+      >>> tool.listActions()
+      ()
+
+    Cleanup:
+
+      >>> tearDown()
+    """
+
+def test_suite():
+    from Testing.ZopeTestCase import ZopeDocTestSuite
+    return ZopeDocTestSuite()
+
+if __name__ == '__main__':
+    framework()


Property changes on: CMF/trunk/CMFCore/tests/test_fiveactionstool.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: CMF/trunk/CMFDefault/configure.zcml
===================================================================
--- CMF/trunk/CMFDefault/configure.zcml	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFDefault/configure.zcml	2005-09-24 15:51:32 UTC (rev 38594)
@@ -4,4 +4,6 @@
 
   <include package=".browser"/>
 
+  <include package=".skin"/>
+
 </configure>

Added: CMF/trunk/CMFDefault/skin/__init__.py
===================================================================
--- CMF/trunk/CMFDefault/skin/__init__.py	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFDefault/skin/__init__.py	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1 @@
+# import this


Property changes on: CMF/trunk/CMFDefault/skin/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFDefault/skin/configure.zcml
===================================================================
--- CMF/trunk/CMFDefault/skin/configure.zcml	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFDefault/skin/configure.zcml	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,28 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    i18n_domain="cmf">
+
+  <browser:layer
+      name="cmf"
+      />
+
+  <browser:skin
+      name="cmf"
+      layers="cmf default"
+      />
+
+  <browser:defaultSkin
+      name="cmf"
+      />
+
+  <!-- Define a default template with css-oriented slots -->
+  <browser:page
+      for="*"
+      template="five_template.pt"
+      name="five_template"
+      permission="zope.Public"
+      layer="cmf"
+      />
+
+</configure>


Property changes on: CMF/trunk/CMFDefault/skin/configure.zcml
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: CMF/trunk/CMFDefault/skin/five_template.pt
===================================================================
--- CMF/trunk/CMFDefault/skin/five_template.pt	2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFDefault/skin/five_template.pt	2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,15 @@
+<metal:block define-macro="page"><metal:block use-macro="here/main_template/macros/master">
+ <metal:block fill-slot="base">
+   <metal:block define-slot="base" />
+ </metal:block>
+ <metal:block fill-slot="header">
+   <metal:block define-slot="header" />
+ </metal:block>
+ <metal:block fill-slot="css_slot">
+   <metal:block define-slot="style_slot" />
+ </metal:block>
+ <metal:block fill-slot="main">
+   <metal:block define-slot="body" />
+ </metal:block>
+</metal:block>
+</metal:block>


Property changes on: CMF/trunk/CMFDefault/skin/five_template.pt
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the CMF-checkins mailing list