Merge branch 'master' into bbmaster
This commit is contained in:
commit
a218d22b93
7 changed files with 44 additions and 6 deletions
|
@ -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'},
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue