Rendering of document data (on view/node) depending on contentType
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1047 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
7103463483
commit
788e21dc8c
6 changed files with 119 additions and 2 deletions
37
README.txt
37
README.txt
|
@ -347,6 +347,41 @@ A node object provides the targetSchema of its target:
|
||||||
>>> IMediaAssetView.providedBy(m111)
|
>>> IMediaAssetView.providedBy(m111)
|
||||||
True
|
True
|
||||||
|
|
||||||
|
A node's target is rendered using the NodeView's renderTargetBody()
|
||||||
|
method. This makes use of a browser view registered for the target interface,
|
||||||
|
and of a lot of other stuff needed for the rendering machine.
|
||||||
|
|
||||||
|
>>> from zope.app.publisher.interfaces.browser import IBrowserView
|
||||||
|
>>> from zope.publisher.interfaces.browser import IBrowserRequest
|
||||||
|
>>> from loops.browser.resource import DocumentView
|
||||||
|
>>> ztapi.provideAdapter(IDocument, Interface, DocumentView,
|
||||||
|
... with=(IBrowserRequest,))
|
||||||
|
|
||||||
|
>>> from zope.component.interfaces import IFactory
|
||||||
|
>>> from zope.app.renderer import plaintext
|
||||||
|
>>> ztapi.provideUtility(IFactory, plaintext.PlainTextSourceFactory,
|
||||||
|
... 'zope.source.plaintext')
|
||||||
|
>>> ztapi.provideAdapter(plaintext.IPlainTextSource, Interface,
|
||||||
|
... plaintext.PlainTextToHTMLRenderer,
|
||||||
|
... with=(IBrowserRequest,))
|
||||||
|
>>> from zope.app.renderer import rest
|
||||||
|
>>> ztapi.provideUtility(IFactory, rest.ReStructuredTextSourceFactory,
|
||||||
|
... 'zope.source.rest')
|
||||||
|
>>> ztapi.provideAdapter(rest.IReStructuredTextSource, Interface,
|
||||||
|
... rest.ReStructuredTextToHTMLRenderer,
|
||||||
|
... with=(IBrowserRequest,))
|
||||||
|
|
||||||
|
>>> m112.target = doc1
|
||||||
|
>>> view = NodeView(m112, TestRequest())
|
||||||
|
>>> view.renderTargetBody()
|
||||||
|
u''
|
||||||
|
>>> doc1.data = u'Test data\n\nAnother paragraph'
|
||||||
|
>>> view.renderTargetBody()
|
||||||
|
u'Test data<br />\n<br />\nAnother paragraph'
|
||||||
|
>>> doc1.contentType = 'text/restructured'
|
||||||
|
>>> view.renderTargetBody()
|
||||||
|
u'<p>Test data</p>\n<p>Another paragraph</p>\n'
|
||||||
|
|
||||||
It is possible to edit a target's attributes directly in an
|
It is possible to edit a target's attributes directly in an
|
||||||
edit form provided by the node:
|
edit form provided by the node:
|
||||||
|
|
||||||
|
@ -388,7 +423,7 @@ Let's add some more nodes and reorder them:
|
||||||
['m111', 'm112', 'm113', 'm114']
|
['m111', 'm112', 'm113', 'm114']
|
||||||
|
|
||||||
A special management view provides methods for moving objects down, up,
|
A special management view provides methods for moving objects down, up,
|
||||||
to the bottom, and to the top
|
to the bottom, and to the top.
|
||||||
|
|
||||||
>>> from cybertools.container.ordered import OrderedContainerView
|
>>> from cybertools.container.ordered import OrderedContainerView
|
||||||
>>> view = OrderedContainerView(m11, TestRequest())
|
>>> view = OrderedContainerView(m11, TestRequest())
|
||||||
|
|
|
@ -390,4 +390,12 @@
|
||||||
name="node.html"
|
name="node.html"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<zope:adapter
|
||||||
|
for="loops.interfaces.IDocument
|
||||||
|
zope.publisher.interfaces.browser.IBrowserRequest"
|
||||||
|
provides="zope.interface.Interface"
|
||||||
|
factory="loops.browser.resource.DocumentView"
|
||||||
|
permission="zope.View"
|
||||||
|
/>
|
||||||
|
|
||||||
</configure>
|
</configure>
|
||||||
|
|
|
@ -72,6 +72,13 @@ class NodeView(object):
|
||||||
return targetView()
|
return targetView()
|
||||||
return u''
|
return u''
|
||||||
|
|
||||||
|
def renderTargetBody(self):
|
||||||
|
target = self.target
|
||||||
|
if target is not None:
|
||||||
|
targetView = zapi.getMultiAdapter((target, self.request))
|
||||||
|
return targetView.render()
|
||||||
|
return u''
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def page(self):
|
def page(self):
|
||||||
page = self.context.getPage()
|
page = self.context.getPage()
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
tal:condition="target"
|
tal:condition="target"
|
||||||
tal:attributes="class string:content-$level;
|
tal:attributes="class string:content-$level;
|
||||||
ondblclick python: item.editable and onclick or ''"
|
ondblclick python: item.editable and onclick or ''"
|
||||||
tal:content="structure target/data">
|
tal:content="structure view/renderTargetBody">
|
||||||
The body
|
The body
|
||||||
</div>
|
</div>
|
||||||
</tal:body>
|
</tal:body>
|
||||||
|
|
59
browser/resource.py
Normal file
59
browser/resource.py
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#
|
||||||
|
# Copyright (c) 2006 Helmut Merz helmutm@cy55.de
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
"""
|
||||||
|
View class for resource objects.
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
"""
|
||||||
|
|
||||||
|
from zope.cachedescriptors.property import Lazy
|
||||||
|
from zope.app import zapi
|
||||||
|
from zope.app.dublincore.interfaces import ICMFDublinCore
|
||||||
|
from zope.proxy import removeAllProxies
|
||||||
|
from zope.security import canAccess, canWrite
|
||||||
|
from zope.security.proxy import removeSecurityProxy
|
||||||
|
|
||||||
|
from loops.interfaces import IDocument, IMediaAsset
|
||||||
|
|
||||||
|
renderingFactories = {
|
||||||
|
'text/plain': 'zope.source.plaintext',
|
||||||
|
'text/stx': 'zope.source.stx',
|
||||||
|
'text/structured': 'zope.source.stx',
|
||||||
|
'text/rest': 'zope.source.rest',
|
||||||
|
'text/restructured': 'zope.source.rest',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentView(object):
|
||||||
|
|
||||||
|
def __init__(self, context, request):
|
||||||
|
self.context = context
|
||||||
|
self.request = request
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
""" Return the rendered content (data) of the context object.
|
||||||
|
"""
|
||||||
|
text = self.context.data
|
||||||
|
typeKey = renderingFactories.get(self.context.contentType,
|
||||||
|
renderingFactories['text/plain'])
|
||||||
|
source = zapi.createObject(typeKey, text)
|
||||||
|
view = zapi.getMultiAdapter((removeAllProxies(source), self.request))
|
||||||
|
return view.render()
|
||||||
|
|
||||||
|
|
|
@ -170,6 +170,14 @@ class IDocumentSchema(IResourceSchema):
|
||||||
missing_value=u'',
|
missing_value=u'',
|
||||||
required=False)
|
required=False)
|
||||||
|
|
||||||
|
contentType = schema.Choice(
|
||||||
|
title=_(u'Content Type'),
|
||||||
|
description=_(u'Content type (format) of the data field'),
|
||||||
|
values=('text/restructured', 'text/structured', 'text/html',
|
||||||
|
'text/plain',),
|
||||||
|
default='text/restructured',
|
||||||
|
required=True)
|
||||||
|
|
||||||
|
|
||||||
class IDocumentView(IDocumentSchema):
|
class IDocumentView(IDocumentSchema):
|
||||||
""" Used for accessing a document via a node's target attribute"""
|
""" Used for accessing a document via a node's target attribute"""
|
||||||
|
|
Loading…
Add table
Reference in a new issue