merge branch master
This commit is contained in:
commit
a10b55117b
7 changed files with 61 additions and 55 deletions
|
@ -58,6 +58,7 @@ from cybertools.relation.interfaces import IRelationRegistry
|
||||||
from cybertools.stateful.interfaces import IStateful
|
from cybertools.stateful.interfaces import IStateful
|
||||||
from cybertools.text import mimetypes
|
from cybertools.text import mimetypes
|
||||||
from cybertools.typology.interfaces import IType, ITypeManager
|
from cybertools.typology.interfaces import IType, ITypeManager
|
||||||
|
from loops.browser.util import normalizeForUrl
|
||||||
from loops.common import adapted, baseObject
|
from loops.common import adapted, baseObject
|
||||||
from loops.config.base import DummyOptions
|
from loops.config.base import DummyOptions
|
||||||
from loops.i18n.browser import I18NView
|
from loops.i18n.browser import I18NView
|
||||||
|
@ -151,6 +152,11 @@ class BaseView(GenericView, I18NView):
|
||||||
def name(self):
|
def name(self):
|
||||||
return getName(self.context)
|
return getName(self.context)
|
||||||
|
|
||||||
|
def makeTargetUrl(self, baseUrl, targetId, title=None):
|
||||||
|
if self.globalOptions('useInformativeURLs') and title:
|
||||||
|
return '%s/.%s-%s' % (baseUrl, targetId, normalizeForUrl(title))
|
||||||
|
return '%s/.%s' % (baseUrl, targetId)
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def principalId(self):
|
def principalId(self):
|
||||||
principal = self.request.principal
|
principal = self.request.principal
|
||||||
|
|
|
@ -292,8 +292,7 @@ class NodeView(BaseView):
|
||||||
def targetUrl(self):
|
def targetUrl(self):
|
||||||
t = self.targetObjectView
|
t = self.targetObjectView
|
||||||
if t is not None:
|
if t is not None:
|
||||||
#return '%s/.target%s' % (self.url, t.uniqueId)
|
return self.makeTargetUrl(self.url, t.uniqueId, t.title)
|
||||||
return '%s/.%s' % (self.url, t.uniqueId)
|
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
def renderTarget(self):
|
def renderTarget(self):
|
||||||
|
@ -445,18 +444,20 @@ class NodeView(BaseView):
|
||||||
def targetRender(self):
|
def targetRender(self):
|
||||||
return u'<div>%s</div>' % self.targetView('download.html', 'show')
|
return u'<div>%s</div>' % self.targetView('download.html', 'show')
|
||||||
|
|
||||||
@Lazy
|
def getViewForTarget(self, obj, setup=True):
|
||||||
def virtualTarget(self):
|
|
||||||
obj = self.virtualTargetObject
|
|
||||||
if obj is not None:
|
if obj is not None:
|
||||||
basicView = component.getMultiAdapter((obj, self.request))
|
basicView = component.getMultiAdapter((obj, self.request))
|
||||||
if obj == self.targetObject:
|
if obj == self.targetObject:
|
||||||
basicView._viewName = self.context.viewName
|
basicView._viewName = self.context.viewName
|
||||||
#if self.context.nodeType != 'text':
|
if setup:
|
||||||
basicView.setupController()
|
basicView.setupController()
|
||||||
if hasattr(basicView, 'view'):
|
if hasattr(basicView, 'view'):
|
||||||
return basicView.view
|
return basicView.view
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def virtualTarget(self):
|
||||||
|
return self.getViewForTarget(self.virtualTargetObject)
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def targetId(self):
|
def targetId(self):
|
||||||
target = self.virtualTargetObject
|
target = self.virtualTargetObject
|
||||||
|
@ -465,10 +466,10 @@ class NodeView(BaseView):
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def virtualTargetUrl(self):
|
def virtualTargetUrl(self):
|
||||||
targetId = self.targetId
|
target = self.virtualTargetObject
|
||||||
if targetId is not None:
|
if target is not None:
|
||||||
#return '%s/.target%s' % (self.url, targetId)
|
tv = BaseView(target, self.request)
|
||||||
return '%s/.%s' % (self.url, targetId)
|
return self.makeTargetUrl(self.url, tv.uniqueId, tv.title)
|
||||||
else:
|
else:
|
||||||
return self.url
|
return self.url
|
||||||
|
|
||||||
|
@ -494,12 +495,10 @@ class NodeView(BaseView):
|
||||||
""" Return URL of given target view given as .XXX URL.
|
""" Return URL of given target view given as .XXX URL.
|
||||||
"""
|
"""
|
||||||
if isinstance(target, BaseView):
|
if isinstance(target, BaseView):
|
||||||
#return '%s/.target%s' % (self.url, target.uniqueId)
|
return self.makeTargetUrl(self.url, target.uniqueId, target.title)
|
||||||
return '%s/.%s' % (self.url, target.uniqueId)
|
|
||||||
else:
|
else:
|
||||||
#return ('%s/.target%s' %
|
return self.makeTargetUrl(self.url, util.getUidForObject(target),
|
||||||
return ('%s/.%s' %
|
target.title)
|
||||||
(self.url, util.getUidForObject(target)))
|
|
||||||
|
|
||||||
def getActions(self, category='object', target=None):
|
def getActions(self, category='object', target=None):
|
||||||
actions = []
|
actions = []
|
||||||
|
@ -900,21 +899,6 @@ class NodeTraverser(ItemTraverser):
|
||||||
return self.context.getLoopsRoot()
|
return self.context.getLoopsRoot()
|
||||||
if name.startswith('.'):
|
if name.startswith('.'):
|
||||||
name = self.cleanUpTraversalStack(request, name)[1:]
|
name = self.cleanUpTraversalStack(request, name)[1:]
|
||||||
#traversalStack = request._traversal_stack
|
|
||||||
#while traversalStack and traversalStack[0].startswith('.target'):
|
|
||||||
# # skip obsolete target references in the url
|
|
||||||
# name = traversalStack.pop(0)
|
|
||||||
#traversedNames = request._traversed_names
|
|
||||||
#if traversedNames:
|
|
||||||
# lastTraversed = traversedNames[-1]
|
|
||||||
# if lastTraversed.startswith('.target') and lastTraversed != name:
|
|
||||||
# # let <base .../> tag show the current object
|
|
||||||
# traversedNames[-1] = name
|
|
||||||
#if len(name) > len('.target'):
|
|
||||||
# uid = int(name[len('.target'):])
|
|
||||||
# target = util.getObjectForUid(uid)
|
|
||||||
#else:
|
|
||||||
# target = self.context.target
|
|
||||||
target = self.getTarget(name)
|
target = self.getTarget(name)
|
||||||
if target is not None:
|
if target is not None:
|
||||||
# remember self.context in request
|
# remember self.context in request
|
||||||
|
|
|
@ -141,7 +141,7 @@
|
||||||
tal:condition="nocall:target">
|
tal:condition="nocall:target">
|
||||||
<div tal:repeat="related item/resources">
|
<div tal:repeat="related item/resources">
|
||||||
<a href="#"
|
<a href="#"
|
||||||
tal:attributes="href string:${view/url}/.target${related/uniqueId};
|
tal:attributes="href python:view.getUrlForTarget(related);
|
||||||
title related/description"
|
title related/description"
|
||||||
tal:content="related/title">Resource Title</a>
|
tal:content="related/title">Resource Title</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -164,7 +164,7 @@
|
||||||
tal:condition="nocall:target">
|
tal:condition="nocall:target">
|
||||||
<div tal:repeat="related item/children">
|
<div tal:repeat="related item/children">
|
||||||
<a href="#"
|
<a href="#"
|
||||||
tal:attributes="href string:${view/url}/.${related/uniqueId};
|
tal:attributes="href python:view.getUrlForTarget(related);
|
||||||
title related/description"
|
title related/description"
|
||||||
tal:content="related/title">Concept Title</a>
|
tal:content="related/title">Concept Title</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -18,8 +18,6 @@
|
||||||
|
|
||||||
"""
|
"""
|
||||||
View class for resource objects.
|
View class for resource objects.
|
||||||
|
|
||||||
$Id$
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import urllib
|
import urllib
|
||||||
|
@ -134,9 +132,6 @@ class ResourceView(BaseView):
|
||||||
else:
|
else:
|
||||||
return self.template.macros['download']
|
return self.template.macros['download']
|
||||||
|
|
||||||
#def __init__(self, context, request):
|
|
||||||
# super(ResourceView, self).__init__(context, request)
|
|
||||||
|
|
||||||
def setupController(self):
|
def setupController(self):
|
||||||
cont = self.controller
|
cont = self.controller
|
||||||
if cont is None:
|
if cont is None:
|
||||||
|
@ -157,6 +152,20 @@ class ResourceView(BaseView):
|
||||||
subMacro=version_macros.macros['portlet_versions'],
|
subMacro=version_macros.macros['portlet_versions'],
|
||||||
priority=25, info=self)
|
priority=25, info=self)
|
||||||
|
|
||||||
|
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):
|
||||||
|
for c in self.context.getConcepts([self.defaultPredicate]):
|
||||||
|
return self.nodeView.getViewForTarget(c, setup=False)
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def view(self):
|
def view(self):
|
||||||
context = self.context
|
context = self.context
|
||||||
|
|
|
@ -27,14 +27,21 @@
|
||||||
<div id="content" class="span-6"
|
<div id="content" class="span-6"
|
||||||
metal:define-macro="content">
|
metal:define-macro="content">
|
||||||
<metal:breadcrumbs define-slot="breadcrumbs">
|
<metal:breadcrumbs define-slot="breadcrumbs">
|
||||||
<div tal:define="crumbs view/breadcrumbs"
|
<table tal:define="crumbs view/breadcrumbs"
|
||||||
tal:condition="crumbs">
|
tal:condition="crumbs">
|
||||||
<span i18n:translate="">You are here:</span>
|
<tr>
|
||||||
<span tal:repeat="crumb crumbs">
|
<td style="white-space: nowrap; vertical-align: top; width: 10%"
|
||||||
<a tal:attributes="href crumb/url"
|
i18n:translate="">You are here:</td>
|
||||||
tal:content="crumb/label" />
|
<td>
|
||||||
<span tal:condition="not:repeat/crumb/end"> > </span></span>
|
<span style="white-space: nowrap"
|
||||||
</div></metal:breadcrumbs>
|
tal:repeat="crumb crumbs">
|
||||||
|
<a tal:attributes="href crumb/url"
|
||||||
|
tal:content="crumb/label" />
|
||||||
|
<span tal:condition="not:repeat/crumb/end"> > </span></span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</metal:breadcrumbs>
|
||||||
<div metal:define-slot="actions"></div>
|
<div metal:define-slot="actions"></div>
|
||||||
<div metal:define-slot="message"></div>
|
<div metal:define-slot="message"></div>
|
||||||
<metal:content define-slot="content">
|
<metal:content define-slot="content">
|
||||||
|
|
|
@ -18,10 +18,9 @@
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Utilities.
|
Utilities.
|
||||||
|
|
||||||
$Id$
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
from zope.app.pagetemplate import ViewPageTemplateFile
|
from zope.app.pagetemplate import ViewPageTemplateFile
|
||||||
from zope.app.publisher.browser.menu import BrowserMenu
|
from zope.app.publisher.browser.menu import BrowserMenu
|
||||||
from zope.app.publisher.interfaces.browser import IBrowserSubMenuItem
|
from zope.app.publisher.interfaces.browser import IBrowserSubMenuItem
|
||||||
|
@ -65,3 +64,9 @@ def html_quote(text, character_entities=((u'&', u'&'), (u'<', u'<' ),
|
||||||
for re, name in character_entities:
|
for re, name in character_entities:
|
||||||
text = text.replace(re, name)
|
text = text.replace(re, name)
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
pattern = re.compile(r'[ /\?\+%]')
|
||||||
|
|
||||||
|
def normalizeForUrl(text):
|
||||||
|
return pattern.sub('-', text)
|
||||||
|
|
|
@ -22,8 +22,6 @@ Base classes for layout-based views.
|
||||||
$Id$
|
$Id$
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import re
|
|
||||||
|
|
||||||
from zope.app.security.interfaces import IUnauthenticatedPrincipal
|
from zope.app.security.interfaces import IUnauthenticatedPrincipal
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
|
@ -34,6 +32,7 @@ from zope.traversing.browser import absoluteURL
|
||||||
from cybertools.util import format
|
from cybertools.util import format
|
||||||
from loops.common import adapted
|
from loops.common import adapted
|
||||||
from loops.i18n.browser import LanguageInfo
|
from loops.i18n.browser import LanguageInfo
|
||||||
|
from loops.browser.util import normalizeForUrl as normalize
|
||||||
from loops import util
|
from loops import util
|
||||||
|
|
||||||
|
|
||||||
|
@ -167,11 +166,7 @@ class BaseView(object):
|
||||||
|
|
||||||
def getKeywords(self):
|
def getKeywords(self):
|
||||||
return self.context.title.split()
|
return self.context.title.split()
|
||||||
|
|
||||||
def getMetaDescription(self):
|
def getMetaDescription(self):
|
||||||
return self.context.title
|
return self.context.title
|
||||||
|
|
||||||
pattern = re.compile(r'[ /\?\+%]')
|
|
||||||
|
|
||||||
def normalize(text):
|
|
||||||
return pattern.sub('-', text)
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue