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)
 | 
			
		||||
  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
 | 
			
		||||
edit form provided by the node:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -388,7 +423,7 @@ Let's add some more nodes and reorder them:
 | 
			
		|||
  ['m111', 'm112', 'm113', 'm114']
 | 
			
		||||
      
 | 
			
		||||
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
 | 
			
		||||
  >>> view = OrderedContainerView(m11, TestRequest())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -390,4 +390,12 @@
 | 
			
		|||
      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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,6 +72,13 @@ class NodeView(object):
 | 
			
		|||
            return targetView()
 | 
			
		||||
        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
 | 
			
		||||
    def page(self):
 | 
			
		||||
        page = self.context.getPage()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@
 | 
			
		|||
               tal:condition="target"
 | 
			
		||||
               tal:attributes="class string:content-$level;
 | 
			
		||||
                               ondblclick python: item.editable and onclick or ''"
 | 
			
		||||
               tal:content="structure target/data">
 | 
			
		||||
               tal:content="structure view/renderTargetBody">
 | 
			
		||||
            The body
 | 
			
		||||
          </div>
 | 
			
		||||
  </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'',
 | 
			
		||||
                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):
 | 
			
		||||
    """ Used for accessing a document via a node's target attribute"""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue