use targetView entry in request annotations for calling views declared for adapted concept map objects (i.e. type interfaces)

This commit is contained in:
Helmut Merz 2012-01-27 07:55:13 +01:00
parent a06447bade
commit b686716754
4 changed files with 27 additions and 9 deletions

View file

@ -6,6 +6,8 @@ $Id$
1.1 1.1
--- ---
- use targetView entry in request annotations for calling views declared
for adapted concept map objects (i.e. type interfaces)
- Lobo layout: provide new part: image grid; make sure image is not repeated if - Lobo layout: provide new part: image grid; make sure image is not repeated if
it already appears in header part it already appears in header part
- new special view 'listsubobjects' for nodes - new special view 'listsubobjects' for nodes

View file

@ -133,6 +133,7 @@ class BaseView(GenericView, I18NView):
modeName = 'view' modeName = 'view'
def __init__(self, context, request): def __init__(self, context, request):
context = baseObject(context)
super(BaseView, self).__init__(context, request) super(BaseView, self).__init__(context, request)
# TODO: get rid of removeSecurityProxy() call - not yet... # TODO: get rid of removeSecurityProxy() call - not yet...
self.context = removeSecurityProxy(context) self.context = removeSecurityProxy(context)
@ -211,7 +212,7 @@ class BaseView(GenericView, I18NView):
@Lazy @Lazy
def viewAnnotations(self): def viewAnnotations(self):
return self.request.annotations.get('loops.view', {}) return self.request.annotations.setdefault('loops.view', {})
@Lazy @Lazy
def node(self): def node(self):

View file

@ -234,13 +234,16 @@ class ConceptView(BaseView):
def description(self): def description(self):
return self.adapted.description return self.adapted.description
@Lazy
def targetUrl(self):
return self.nodeView.getUrlForTarget(self.context)
def breadcrumbs(self): def breadcrumbs(self):
data = [] data = []
if self.breadcrumbsParent is not None: if self.breadcrumbsParent is not None:
data.extend(self.breadcrumbsParent.breadcrumbs()) data.extend(self.breadcrumbsParent.breadcrumbs())
if self.context != self.nodeView.targetObject: if self.context != self.nodeView.targetObject:
data.append(dict(label=self.title, data.append(dict(label=self.title, url=self.targetUrl))
url=self.nodeView.getUrlForTarget(self.context)))
return data return data
@Lazy @Lazy

View file

@ -51,7 +51,7 @@ from cybertools.typology.interfaces import IType, ITypeManager
from cybertools.util.jeep import Jeep from cybertools.util.jeep import Jeep
from cybertools.xedit.browser import ExternalEditorView from cybertools.xedit.browser import ExternalEditorView
from loops.browser.action import actions, DialogAction from loops.browser.action import actions, DialogAction
from loops.common import adapted, AdapterBase from loops.common import adapted, AdapterBase, baseObject
from loops.i18n.browser import i18n_macros, LanguageInfo from loops.i18n.browser import i18n_macros, LanguageInfo
from loops.interfaces import IConcept, IResource, IDocument, IMediaAsset, INode from loops.interfaces import IConcept, IResource, IDocument, IMediaAsset, INode
from loops.interfaces import IViewConfiguratorSchema from loops.interfaces import IViewConfiguratorSchema
@ -204,9 +204,8 @@ class NodeView(BaseView):
name = self.request.get('loops.viewName', '') or self.context.viewName name = self.request.get('loops.viewName', '') or self.context.viewName
if name and '?' in name: if name and '?' in name:
name, params = name.split('?', 1) name, params = name.split('?', 1)
ann = self.request.annotations.get('loops.view', {}) ann = self.viewAnnotations
ann['params'] = params ann['params'] = params
self.request.annotations['loops.view'] = ann
if name: if name:
adapter = component.queryMultiAdapter( adapter = component.queryMultiAdapter(
(self.context, self.request), name=name) (self.context, self.request), name=name)
@ -216,10 +215,13 @@ class NodeView(BaseView):
@Lazy @Lazy
def item(self): def item(self):
tv = self.viewAnnotations.get('targetView')
if tv is not None:
return tv
viewName = self.request.get('loops.viewName') or '' viewName = self.request.get('loops.viewName') or ''
# was there a .target... element in the URL? # was there a .target... element in the URL?
#target = self.virtualTargetObject # ignores page even for direktly assignd target #target = self.virtualTargetObject # ignores page even for direktly assignd target
target = self.request.annotations.get('loops.view', {}).get('target') target = self.viewAnnotations.get('target')
if target is not None: if target is not None:
basicView = component.getMultiAdapter((target, self.request), name=viewName) basicView = component.getMultiAdapter((target, self.request), name=viewName)
# xxx: obsolete when self.targetObject is virtual target: # xxx: obsolete when self.targetObject is virtual target:
@ -230,6 +232,9 @@ class NodeView(BaseView):
@Lazy @Lazy
def targetItem(self): def targetItem(self):
tv = self.viewAnnotations.get('targetView')
if tv is not None:
return tv
viewName = self.request.get('loops.viewName') or '' viewName = self.request.get('loops.viewName') or ''
target = self.virtualTargetObject target = self.virtualTargetObject
if target is not None: if target is not None:
@ -400,7 +405,7 @@ class NodeView(BaseView):
@Lazy @Lazy
def virtualTargetObject(self): def virtualTargetObject(self):
target = self.request.annotations.get('loops.view', {}).get('target') target = self.viewAnnotations.get('target')
if target is None: if target is None:
target = self.context.target target = self.context.target
if target is not None: if target is not None:
@ -417,6 +422,9 @@ class NodeView(BaseView):
return None return None
def targetView(self, name='index.html', methodName='show'): def targetView(self, name='index.html', methodName='show'):
tv = self.viewAnnotations.get('targetView')
if tv is not None:
return tv
if '?' in name: if '?' in name:
name, params = name.split('?', 1) name, params = name.split('?', 1)
target = self.virtualTargetObject target = self.virtualTargetObject
@ -462,6 +470,9 @@ class NodeView(BaseView):
@Lazy @Lazy
def virtualTarget(self): def virtualTarget(self):
tv = self.viewAnnotations.get('targetView')
if tv is not None:
return tv
return self.getViewForTarget(self.virtualTargetObject) return self.getViewForTarget(self.virtualTargetObject)
@Lazy @Lazy
@ -503,6 +514,7 @@ class NodeView(BaseView):
if isinstance(target, BaseView): if isinstance(target, BaseView):
return self.makeTargetUrl(self.url, target.uniqueId, target.title) return self.makeTargetUrl(self.url, target.uniqueId, target.title)
else: else:
target = baseObject(target)
return self.makeTargetUrl(self.url, util.getUidForObject(target), return self.makeTargetUrl(self.url, util.getUidForObject(target),
target.title) target.title)
@ -922,7 +934,7 @@ class NodeTraverser(ItemTraverser):
langInfo = LanguageInfo(self.context, request) langInfo = LanguageInfo(self.context, request)
adTarget = adapted(target, langInfo) adTarget = adapted(target, langInfo)
view = component.queryMultiAdapter((adTarget, request), name=name) view = component.queryMultiAdapter((adTarget, request), name=name)
if view is not None: if isinstance(view, BaseView):
viewAnnotations['targetView'] = view viewAnnotations['targetView'] = view
view.logInfo('NodeTraverser:targetView = %r' % view) view.logInfo('NodeTraverser:targetView = %r' % view)
return self.context return self.context