Merge branch 'master' into bbmaster

This commit is contained in:
Helmut Merz 2011-12-04 11:24:43 +01:00
commit a218d22b93
7 changed files with 44 additions and 6 deletions

View file

@ -659,7 +659,9 @@ Breadcrumbs
>>> loopsRoot.options = ['showBreadcrumbs'] >>> loopsRoot.options = ['showBreadcrumbs']
>>> m114.nodeType = 'page' >>> m114.nodeType = 'page'
>>> m114.target = cc1 >>> m114.target = cc1
>>> view = NodeView(m114, TestRequest()) >>> request = TestRequest()
>>> view = NodeView(m114, request)
>>> request.annotations.setdefault('loops.view', {})['nodeView'] = view
>>> view.breadcrumbs() >>> view.breadcrumbs()
[{'url': 'http://127.0.0.1/loops/views/m1', 'label': u'Menu'}, [{'url': 'http://127.0.0.1/loops/views/m1', 'label': u'Menu'},
{'url': 'http://127.0.0.1/loops/views/m1/m11', 'label': u'Zope'}, {'url': 'http://127.0.0.1/loops/views/m1/m11', 'label': u'Zope'},

View file

@ -416,8 +416,8 @@ class BaseView(GenericView, I18NView):
if contentType == u'text/html': if contentType == u'text/html':
return text return text
return u'<pre>%s</pre>' % util.html_quote(text) return u'<pre>%s</pre>' % util.html_quote(text)
source = component.createObject(typeKey, text) source = removeAllProxies(component.createObject(typeKey, text))
view = component.getMultiAdapter((removeAllProxies(source), self.request)) view = component.getMultiAdapter((source, self.request))
return view.render() return view.render()
def renderDescription(self, text=None): def renderDescription(self, text=None):

View file

@ -234,6 +234,19 @@ class ConceptView(BaseView):
def description(self): def description(self):
return self.adapted.description return self.adapted.description
def breadcrumbs(self):
data = []
if self.breadcrumbsParent is not None:
data.extend(self.breadcrumbsParent.breadcrumbs())
if self.context != self.nodeView.targetObject:
data.append(dict(label=self.title,
url=self.nodeView.getUrlForTarget(self.context)))
return data
@Lazy
def breadcrumbsParent(self):
return None
def getData(self, omit=('title', 'description')): def getData(self, omit=('title', 'description')):
data = self.instance.applyTemplate(context=self.context, request=self.request) data = self.instance.applyTemplate(context=self.context, request=self.request)
for k in omit: for k in omit:

View file

@ -176,6 +176,10 @@ table.records th, table.records td {
border: 1px solid black; border: 1px solid black;
} }
table.report td {
vertical-align: top;
}
dl.docutils dt { dl.docutils dt {
font-weight: bold; font-weight: bold;
margin-top: 0.3em; margin-top: 0.3em;

View file

@ -15,7 +15,8 @@
<div metal:define-macro="results"> <div metal:define-macro="results">
<table tal:define="results view/results"> <table class="report"
tal:define="results view/results">
<tr> <tr>
<th tal:repeat="col view/displayedColumns" <th tal:repeat="col view/displayedColumns"
tal:content="col/title" tal:content="col/title"

View file

@ -21,16 +21,27 @@ Field definitions for reports.
""" """
from cybertools.composer.report.field import Field from cybertools.composer.report.field import Field
from loops.common import baseObject
from loops import util from loops import util
class TextField(Field):
format = 'text/restructured'
def getDisplayValue(self, row):
value = self.getValue(row)
return row.parent.context.view.renderText(value, self.format)
class UrlField(Field): class UrlField(Field):
renderer = 'target' renderer = 'target'
def getDisplayValue(self, row): def getDisplayValue(self, row):
nv = row.parent.context.view.nodeView nv = row.parent.context.view.nodeView
return dict(title=self.getValue(row), url=nv.getUrlForTarget(row.context)) return dict(title=self.getValue(row),
url=nv.getUrlForTarget(baseObject(row.context)))
class TargetField(Field): class TargetField(Field):

View file

@ -14,6 +14,8 @@ from zope.app.catalog.text import TextIndex
from zope.app.container.interfaces import IObjectRemovedEvent from zope.app.container.interfaces import IObjectRemovedEvent
from zope.app.principalannotation import PrincipalAnnotationUtility from zope.app.principalannotation import PrincipalAnnotationUtility
from zope.app.principalannotation.interfaces import IPrincipalAnnotationUtility from zope.app.principalannotation.interfaces import IPrincipalAnnotationUtility
from zope.app.renderer.rest import IReStructuredTextSource,\
ReStructuredTextToHTMLRenderer, ReStructuredTextSourceFactory
from zope.app.security.principalregistry import principalRegistry from zope.app.security.principalregistry import principalRegistry
from zope.app.security.interfaces import IAuthentication from zope.app.security.interfaces import IAuthentication
from zope.app.session.interfaces import IClientIdManager, ISessionDataContainer from zope.app.session.interfaces import IClientIdManager, ISessionDataContainer
@ -122,8 +124,13 @@ class TestSite(object):
component.provideUtility(principalRegistry, IAuthentication) component.provideUtility(principalRegistry, IAuthentication)
component.provideAdapter(session.ClientId) component.provideAdapter(session.ClientId)
component.provideAdapter(session.Session) component.provideAdapter(session.Session)
component.provideUtility(session.RAMSessionDataContainer(), ISessionDataContainer) component.provideUtility(session.RAMSessionDataContainer(),
ISessionDataContainer)
component.provideUtility(ClientIdManager()) component.provideUtility(ClientIdManager())
component.provideUtility(ReStructuredTextSourceFactory,
name='zope.source.rest')
component.provideAdapter(ReStructuredTextToHTMLRenderer,
(IReStructuredTextSource, IBrowserRequest), Interface)
component.provideAdapter(LoopsType) component.provideAdapter(LoopsType)
component.provideAdapter(ConceptType) component.provideAdapter(ConceptType)