[Zope-Checkins]
SVN: Products.Five/branches/philikon-local-components/component/
get rid of zpt customization prototype. it won't be ready in
time for Five 1.5/Zope2.10
Philipp von Weitershausen
philikon at philikon.de
Tue Apr 25 04:49:17 EDT 2006
Log message for revision 67584:
get rid of zpt customization prototype. it won't be ready in time for Five 1.5/Zope2.10
Changed:
U Products.Five/branches/philikon-local-components/component/browser.py
U Products.Five/branches/philikon-local-components/component/component.txt
U Products.Five/branches/philikon-local-components/component/components.pt
U Products.Five/branches/philikon-local-components/component/configure.zcml
D Products.Five/branches/philikon-local-components/component/customizezpt.pt
U Products.Five/branches/philikon-local-components/component/tests.py
D Products.Five/branches/philikon-local-components/component/zpt.py
D Products.Five/branches/philikon-local-components/component/zpt.txt
D Products.Five/branches/philikon-local-components/component/zptviews.pt
-=-
Modified: Products.Five/branches/philikon-local-components/component/browser.py
===================================================================
--- Products.Five/branches/philikon-local-components/component/browser.py 2006-04-25 08:46:29 UTC (rev 67583)
+++ Products.Five/branches/philikon-local-components/component/browser.py 2006-04-25 08:49:16 UTC (rev 67584)
@@ -15,26 +15,14 @@
$Id$
"""
-import os.path
-
-from Acquisition import aq_inner
from Products.Five.browser import BrowserView
-from Products.Five.component import enableSite, disableSite, findSite
+from Products.Five.component import enableSite, disableSite
from Products.Five.component.interfaces import IObjectManagerSite
-from Products.Five.component.zpt import ZPTViewFactory, IRegisteredViewPageTemplate
-from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
-import zope.interface
-import zope.component
-import zope.dottedname.resolve
-from zope.component.globalregistry import base
from zope.component.persistentregistry import PersistentComponents
-from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.traversing.browser import absoluteURL
from zope.app.component.hooks import clearSite
-from zope.app.apidoc.presentation import getViews
-class ComponentsView(BrowserView):
+class ObjectManagerSiteView(BrowserView):
def update(self):
form = self.request.form
@@ -72,114 +60,3 @@
clearSite()
self.context.setSiteManage(None)
-
-def mangleAbsoluteFilename(filename):
- """
- Mangle an absolute filename when the file happens to be in a
- package. The mangled name will then be of the form::
-
- <dotted package name>/<base filename>.
-
- For example, let's take Five's configure.zcml as an example. We
- assemble it in an OS-independent way so this test works on all
- platforms:
-
- >>> def filesystemPath(*elements):
- ... return os.path.sep.join(elements)
-
- We see that the filename is now mangled:
-
- >>> mangleAbsoluteFilename(filesystemPath(
- ... '', 'path', 'to', 'Products', 'Five', 'configure.zcml'))
- 'Products.Five/configure.zcml'
-
- The name of a file that's not in a package is returned unchanged:
-
- >>> not_in_a_package = filesystemPath('', 'path', 'to', 'configure.zcml')
- >>> mangleAbsoluteFilename(not_in_a_package) == not_in_a_package
- True
- """
- if not os.path.isabs(filename):
- raise ValueError("Can only determine package for absolute filenames")
- dir, basename = os.path.split(filename)
- pieces = dir.split(os.path.sep)
- if pieces[0] == '':
- pieces = pieces[1:]
- while pieces:
- try:
- zope.dottedname.resolve.resolve('.'.join(pieces))
- break
- except ImportError:
- pieces = pieces[1:]
- if not pieces:
- return filename
- return '.'.join(pieces) + '/' + basename
-
-class CustomizationView(BrowserView):
-
- def templateViewRegistrations(self):
- for reg in getViews(zope.interface.providedBy(self.context),
- IBrowserRequest):
- factory = reg.factory
- while hasattr(factory, 'factory'):
- factory = factory.factory
- #XXX this should really be dealt with using a marker interface
- # on the view factory
- if hasattr(factory, '__name__') and \
- factory.__name__.startswith('SimpleViewClass'):
- yield reg
-
- def templateViewRegInfo(self):
- def regkey(reg):
- return reg.name
- for reg in sorted(self.templateViewRegistrations(), key=regkey):
- yield {
- 'viewname': reg.name,
- 'for': reg.required[0].__identifier__,
- 'type': reg.required[1].__identifier__,
- 'zptfile': mangleAbsoluteFilename(reg.factory.index.filename),
- 'zcmlfile': mangleAbsoluteFilename(reg.info.file)
- }
-
- def templateFromViewname(self, viewname):
- view = zope.component.getMultiAdapter((self.context, self.request),
- name=viewname)
- return view.index
-
- def doCustomizeTemplate(self, viewname):
- # find the nearest site
- site = findSite(self.context, IObjectManagerSite)
- if site is None:
- raise TypeError("No site found") #TODO find right exception
-
- # we're using the original filename of the template, not the
- # view name to avoid potential conflicts and/or confusion in
- # URLs
- template = self.templateFromViewname(viewname)
- zpt_id = os.path.basename(template.filename)
-
- viewzpt = ZopePageTemplate(zpt_id, template.read())
- zope.interface.alsoProvides(viewzpt, IRegisteredViewPageTemplate)
- site._setObject(zpt_id, viewzpt) #XXXthere could be a naming conflict
- components = site.getSiteManager()
-
- # find out the view registration object so we can get at the
- # provided and required interfaces
- for reg in getViews(zope.interface.providedBy(self.context),
- IBrowserRequest):
- if reg.name == viewname:
- break
-
- view_factory = ZPTViewFactory(viewzpt, viewname)
- components.registerAdapter(view_factory, required=reg.required,
- provided=reg.provided, name=viewname) #XXX info?
-
- viewzpt = getattr(site, zpt_id)
- return viewzpt
-
- def customizeTemplate(self, viewname):
- viewzpt = self.doCustomizeTemplate(viewname)
- # to get a "direct" URL we use aq_inner for a straight
- # acquisition chain
- url = absoluteURL(aq_inner(viewzpt), self.request) + "/manage_workspace"
- self.request.RESPONSE.redirect(url)
Modified: Products.Five/branches/philikon-local-components/component/component.txt
===================================================================
--- Products.Five/branches/philikon-local-components/component/component.txt 2006-04-25 08:46:29 UTC (rev 67583)
+++ Products.Five/branches/philikon-local-components/component/component.txt 2006-04-25 08:49:16 UTC (rev 67584)
@@ -67,6 +67,5 @@
Clean up:
---------
-#XXX somehow this makes the zpt.txt tests fail
-# >>> from zope.component.testing import tearDown
-# >>> tearDown()
+ >>> from zope.component.testing import tearDown
+ >>> tearDown()
Modified: Products.Five/branches/philikon-local-components/component/components.pt
===================================================================
--- Products.Five/branches/philikon-local-components/component/components.pt 2006-04-25 08:46:29 UTC (rev 67583)
+++ Products.Five/branches/philikon-local-components/component/components.pt 2006-04-25 08:49:16 UTC (rev 67584)
@@ -18,11 +18,6 @@
</div>
</form>
- <p tal:condition="not:view/isSite">XXX perhaps list locally
- registered comonents here, or just give some stats about locally
- registered objects with links to pages who actually show them...
- XXX</p>
-
</div>
</body>
Modified: Products.Five/branches/philikon-local-components/component/configure.zcml
===================================================================
--- Products.Five/branches/philikon-local-components/component/configure.zcml 2006-04-25 08:46:29 UTC (rev 67583)
+++ Products.Five/branches/philikon-local-components/component/configure.zcml 2006-04-25 08:49:16 UTC (rev 67584)
@@ -17,31 +17,9 @@
<browser:page
for="OFS.interfaces.IObjectManager"
name="components.html"
- class=".browser.ComponentsView"
+ class=".browser.ObjectManagerSiteView"
template="components.pt"
permission="five.ManageSite"
/>
- <browser:pages
- for="OFS.interfaces.ISimpleItem"
- class=".browser.CustomizationView"
- permission="five.ManageSite">
-
- <browser:page
- name="zptviews.html"
- template="zptviews.pt"
- />
- <browser:page
- name="customizezpt.html"
- template="customizezpt.pt"
- />
- <browser:page
- name="customizezpt"
- attribute="customizeTemplate"
- />
-
- </browser:pages>
-
- <subscriber handler=".zpt.unregisterViewWhenZPTIsDeleted" />
-
</configure>
Deleted: Products.Five/branches/philikon-local-components/component/customizezpt.pt
===================================================================
--- Products.Five/branches/philikon-local-components/component/customizezpt.pt 2006-04-25 08:46:29 UTC (rev 67583)
+++ Products.Five/branches/philikon-local-components/component/customizezpt.pt 2006-04-25 08:49:16 UTC (rev 67584)
@@ -1,26 +0,0 @@
-<html metal:use-macro="context/@@standard_macros/view"
- i18n:domain="zope">
- <body>
- <div metal:fill-slot="body">
-
- <p i18n:translate="">This is the source of the
- <code tal:content="request/form/viewname">viewname</code>:</p>
-
- <pre style="background-color: #cccccc; border: 1px solid black; padding: 5px;"
- tal:content="python:view.templateFromViewname(request.form['viewname']).read()">
- template source
- </pre>
-
- <form action="@@customizezpt" method="post"
- enctype="multipart/form-data">
-
- <input type="hidden" name="viewname" value="theviewname"
- tal:attributes="value request/form/viewname" />
- <input type="submit" name="" value="Customize" />
-
- </form>
-
- </div>
- </body>
-
-</html>
Modified: Products.Five/branches/philikon-local-components/component/tests.py
===================================================================
--- Products.Five/branches/philikon-local-components/component/tests.py 2006-04-25 08:46:29 UTC (rev 67583)
+++ Products.Five/branches/philikon-local-components/component/tests.py 2006-04-25 08:49:16 UTC (rev 67584)
@@ -23,8 +23,6 @@
def test_suite():
return unittest.TestSuite([
DocFileSuite('component.txt', package="Products.Five.component"),
- DocFileSuite('zpt.txt', package="Products.Five.component"),
- DocTestSuite('Products.Five.component.browser')
])
if __name__ == '__main__':
Deleted: Products.Five/branches/philikon-local-components/component/zpt.py
===================================================================
--- Products.Five/branches/philikon-local-components/component/zpt.py 2006-04-25 08:46:29 UTC (rev 67583)
+++ Products.Five/branches/philikon-local-components/component/zpt.py 2006-04-25 08:49:16 UTC (rev 67584)
@@ -1,113 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 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.
-#
-##############################################################################
-"""Component browser views
-
-$Id$
-"""
-from Acquisition import aq_inner, aq_acquire
-from Products.PageTemplates.Expressions import SecureModuleImporter
-from Products.Five.browser import BrowserView
-from Products.Five.component import findSite
-
-import zope.component
-import zope.interface
-from zope.pagetemplate.interfaces import IPageTemplate
-from zope.app.container.interfaces import IObjectRemovedEvent
-
-class IZPTViewFactory(zope.interface.Interface):
- """Marker interface for those view factories that invoke locally
- registered components.
-
- By finding factories that provide this interface we can find the
- registration object for a locally registered template and, for
- example, unregister the view when the template is deleted."""
- template = zope.interface.Attribute("The ZPT template to invoke.")
-
-class ZPTViewFactory(object):
- """View factory that gets registered with a local component
- registry.
-
- When this factory is invoked, it returns a view that in turn
- invokes the template upon publishing. We hold a (potentially
- persistent) reference only to the Page Template, everything else
- needed for the template (e.g. its view class) is constructed by
- the view."""
- zope.interface.implements(IZPTViewFactory)
-
- def __init__(self, template, name):
- self.template = template
- self.name = name
-
- def __call__(self, context, request):
- return ZPTView(self.template, self.name, context, request)
-
-class ZPTView(BrowserView):
- """View that invokes a locally placed ZopePageTemplate object.
- """
-
- def __init__(self, template, name, context, request):
- self.template = template
- self.context = context
- self.request = request
-
- # this is needed for Zope 2's publication which wants to
- # record some metadata in the transaction, among others the
- # name of published objects
- self.__name__ = name
-
- def _findViewClass(self):
- #XXX we might want to walk up to the next site instead, not
- # just go to the global one directly
- gsm = zope.component.getGlobalSiteManager()
- view = gsm.queryMultiAdapter((self.context, self.request),
- zope.interface.Interface, self.__name__)
- if view is not None:
- return view
- return self
-
- def _zptNamespace(self):
- root = aq_acquire(self.context, 'getPhysicalRoot')()
- here = aq_inner(self.context)
- return {
- 'template': self.template,
- 'nothing': None,
- 'request': self.request,
- 'here': here,
- 'context': here,
- 'container': here,
- 'view': self._findViewClass(),
- 'root': root,
- 'modules': SecureModuleImporter,
- }
-
- def __call__(self, *args, **kwargs):
- namespace = self._zptNamespace()
- if not kwargs.has_key('args'):
- kwargs['args'] = args
- namespace['options'] = kwargs
- return self.template.pt_render(namespace)
-
-class IRegisteredViewPageTemplate(IPageTemplate):
- """Marker interface for registered view page templates
- """
-
- at zope.component.adapter(IRegisteredViewPageTemplate, IObjectRemovedEvent)
-def unregisterViewWhenZPTIsDeleted(zpt, event):
- components = zope.component.getSiteManager(zpt)
- for reg in components.registeredAdapters():
- if (IZPTViewFactory.providedBy(reg.factory) and
- reg.factory.template == zpt):
- break
- components.unregisterAdapter(reg.factory, reg.required, reg.provided,
- reg.name)
Deleted: Products.Five/branches/philikon-local-components/component/zpt.txt
===================================================================
--- Products.Five/branches/philikon-local-components/component/zpt.txt 2006-04-25 08:46:29 UTC (rev 67583)
+++ Products.Five/branches/philikon-local-components/component/zpt.txt 2006-04-25 08:49:16 UTC (rev 67584)
@@ -1,207 +0,0 @@
-Locally customizing template-based views
-========================================
-
-This document describes a typical story of locally customizing a
-global view component. The steps in this story are:
-
-1. Making a folder a site
-
-2. Walking up to an object and getting a list of its template-based
- views
-
-3. Selecting a particular view, seeing its template source and
- deciding to customize it
-
-4. Customizing the template and seeing the customized template take
- effect
-
-5. Deleting the template and seeing the old view take over again
-
-
-Setup
------
-
-Before we can start we need to load some important ZCML:
-
- >>> from Products.Five import zcml
- >>> import Products.Five.component
- >>> import zope.app.event
- >>> zcml.load_config('meta.zcml', Products.Five)
- >>> zcml.load_config('permissions.zcml', Products.Five)
- >>> zcml.load_config('traversing.zcml', Products.Five)
- >>> zcml.load_config('configure.zcml', Products.Five.component)
- >>> zcml.load_config('configure.zcml', zope.app.event)
-
-We should also create a root object:
-
- >>> from OFS.Application import Application
- >>> root = Application()
-
-
-1. Turning an ObjectManager into a site
-----------------------------------------
-
-Let's create a folder that we'll turn into a Zope3-style site:
-
- >>> from OFS.ObjectManager import ObjectManager
- >>> site = ObjectManager()
-
-We need to add it to the root so that objects contained in it have a
-proper acquisition chain all the way to the top:
-
- >>> id = root._setObject('site', site)
- >>> site = root.site
-
-Now we make this a real site by using a view that a) sets
-``IObjectManagerSite``, b) sets a traversal hook and c) gives the site
-a component registration object (formerly known as site manager):
-
- >>> import zope.component
- >>> from zope.publisher.browser import TestRequest
- >>> request = TestRequest()
- >>> view = zope.component.getMultiAdapter((site, request),
- ... name=u"components.html")
- >>> view.makeSite()
-
-Now the site provides ``IObjectManagerSite``:
-
- >>> from Products.Five.component.interfaces import IObjectManagerSite
- >>> IObjectManagerSite.providedBy(site)
- True
-
-And it has a site manager (component registry):
-
- >>> site.getSiteManager() #doctest: +ELLIPSIS
- <zope.component.persistentregistry.PersistentComponents object at ...>
-
-
-2. Template-based views available on an object
-----------------------------------------------
-
-Let's create a simple content object that we put into the folder
-(a.k.a. the site):
-
- >>> from Products.Five.tests.testing.simplecontent import SimpleContent
- >>> item = SimpleContent('item', 'An item')
- >>> site._setOb('item', item)
- >>> item = site.item
-
-Let's get a list of views (that also shows where each view is
-registered at):
-
- >>> view = zope.component.getMultiAdapter((item, request),
- ... name=u"zptviews.html")
- >>> view = view.__of__(item)
- >>> from pprint import pprint
- >>> viewnames = [reg.name for reg in view.templateViewRegistrations()]
- >>> viewnames.sort()
- >>> pprint(viewnames)
- [u'customizezpt.html', u'zptviews.html']
-
-
-3. and 4. Customizing a template-based view
--------------------------------------------
-
-In the list of template-based browser views we can select one and see
-the source of its template:
-
- >>> view = zope.component.getMultiAdapter((item, request),
- ... name=u"customizezpt.html")
- >>> view = view.__of__(item)
- >>> template = view.templateFromViewname(u'customizezpt.html')
- >>> import os.path
- >>> os.path.basename(template.filename)
- 'customizezpt.pt'
-
- >>> print template.read() #doctest: +ELLIPSIS
- <html metal:use-macro="context/@@standard_macros/view"
- i18n:domain="zope">
- ...
- <p i18n:translate="">This is the source of the
- <code tal:content="request/form/viewname">viewname</code>:</p>
- ...
-
-We now hit the customize button and get a customized ZPT template:
-
- >>> zpt = view.doCustomizeTemplate(u'customizezpt.html')
-
-That actually creates a PageTemplate object in the nearest site
-(perhaps later we'd like to have the option to pick which of the sites
-above us should be targeted)
-
- >>> zpt = getattr(site, 'customizezpt.pt')
- >>> print zpt.read() #doctest: +ELLIPSIS
- <html metal:use-macro="context/@@standard_macros/view"
- i18n:domain="zope">
- ...
- <p i18n:translate="">This is the source of the
- <code tal:content="request/form/viewname">viewname</code>:</p>
- ...
-
-It also registers this component as a view now, so when we look up the
-view again, we get the customized one. Therefore let us actually
-change the template to give us some info output:
-
- >>> zpt.pt_edit("""
- ... context: <tal:var replace="structure context" />
- ... container: <tal:var replace="structure container" />
- ... root: <tal:var replace="structure root" />
- ... template: <tal:var replace="structure nocall:template" />
- ... request: <tal:var replace="structure python:repr(request)" />
- ... view: <tal:var replace="structure nocall:view" />
- ... modules: <tal:var replace="structure modules" />
- ... options: <tal:var replace="structure options" />
- ... nothing: <tal:var replace="structure nothing" />
- ... """, content_type=None)
-
-In order to be able to look up the customized view now, we need to
-make the site the current site:
-
- >>> from zope.app.component.hooks import setSite
- >>> setSite(site)
-
-Now look it up and compare its output:
-
- >>> view = zope.component.getMultiAdapter((item, request),
- ... name=u"customizezpt.html")
- >>> view = view.__of__(item)
- >>> print view() #doctest: +ELLIPSIS
- context: <SimpleContent at item>
- container: <SimpleContent at item>
- root: <Application at >
- template: <ZopePageTemplate at customizezpt.pt>
- request: <zope.publisher.browser.TestRequest instance URL=http://127.0.0.1>
- view: <Products.Five.metaclass.SimpleViewClass from .../Five/component/customizezpt.pt object at ...>
- modules: <Products.PageTemplates.ZRPythonExpr._SecureModuleImporter instance at ...>
- options: {'args': ()}
- nothing:
- <BLANKLINE>
-
-
-5. Deleting view templates
---------------------------
-
-Once in a while we would like to get rid of the customized view. The
-easiest way to do that is to simply delete the template:
-
- >>> if True:
- ... site._delObject('customizezpt.pt')
-
-Now the view look-up is back to the old way:
-
- >>> view = zope.component.getMultiAdapter((item, request),
- ... name=u"customizezpt.html")
- >>> print view.index.read() #doctest: +ELLIPSIS
- <html metal:use-macro="context/@@standard_macros/view"
- i18n:domain="zope">
- ...
- <p i18n:translate="">This is the source of the
- <code tal:content="request/form/viewname">viewname</code>:</p>
- ...
-
-
-Clean up:
----------
-
- >>> from zope.app.testing.placelesssetup import tearDown
- >>> tearDown()
Deleted: Products.Five/branches/philikon-local-components/component/zptviews.pt
===================================================================
--- Products.Five/branches/philikon-local-components/component/zptviews.pt 2006-04-25 08:46:29 UTC (rev 67583)
+++ Products.Five/branches/philikon-local-components/component/zptviews.pt 2006-04-25 08:49:16 UTC (rev 67584)
@@ -1,33 +0,0 @@
-<html metal:use-macro="context/@@standard_macros/view"
- i18n:domain="zope">
- <body>
- <div metal:fill-slot="body">
-
- <p i18n:translate="">Template-based (global) browser views available
- for this component:</p>
-
- <table>
- <tr>
- <th></th>
- <th>Name of View</th>
- <th>Registration Info</th>
- </tr>
- <tr tal:repeat="info view/templateViewRegInfo">
- <td><img src="misc_/PageTemplates/zpt.gif"
- tal:attributes="src string:${context/@@absolute_url}/misc_/PageTemplates/zpt.gif" /></td>
- <td>
- <a href=""
- tal:attributes="href string:@@customizetemplate.html?viewname=${info/viewname}"
- tal:content="info/viewname">
- </a>
- </td>
- <td><code tal:content="info/zptfile">zptfile</code><br />
- <code tal:content="info/for">for</code><br />
- <code tal:content="info/zcmlfile">zcmlfile</code></td>
- </tr>
- </table>
-
- </div>
- </body>
-
-</html>
More information about the Zope-Checkins
mailing list