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