From b6867167544801b981839c510bd171e131c800b8 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 27 Jan 2012 07:55:13 +0100 Subject: [PATCH] use targetView entry in request annotations for calling views declared for adapted concept map objects (i.e. type interfaces) --- CHANGES.txt | 2 ++ browser/common.py | 3 ++- browser/concept.py | 7 +++++-- browser/node.py | 24 ++++++++++++++++++------ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index c1b99c7..84b81d2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,8 @@ $Id$ 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 it already appears in header part - new special view 'listsubobjects' for nodes diff --git a/browser/common.py b/browser/common.py index 5ac05ae..eb48a6e 100644 --- a/browser/common.py +++ b/browser/common.py @@ -133,6 +133,7 @@ class BaseView(GenericView, I18NView): modeName = 'view' def __init__(self, context, request): + context = baseObject(context) super(BaseView, self).__init__(context, request) # TODO: get rid of removeSecurityProxy() call - not yet... self.context = removeSecurityProxy(context) @@ -211,7 +212,7 @@ class BaseView(GenericView, I18NView): @Lazy def viewAnnotations(self): - return self.request.annotations.get('loops.view', {}) + return self.request.annotations.setdefault('loops.view', {}) @Lazy def node(self): diff --git a/browser/concept.py b/browser/concept.py index 6d349d2..9265492 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -234,13 +234,16 @@ class ConceptView(BaseView): def description(self): return self.adapted.description + @Lazy + def targetUrl(self): + return self.nodeView.getUrlForTarget(self.context) + 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))) + data.append(dict(label=self.title, url=self.targetUrl)) return data @Lazy diff --git a/browser/node.py b/browser/node.py index 90f4ea9..71b327c 100644 --- a/browser/node.py +++ b/browser/node.py @@ -51,7 +51,7 @@ from cybertools.typology.interfaces import IType, ITypeManager from cybertools.util.jeep import Jeep from cybertools.xedit.browser import ExternalEditorView 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.interfaces import IConcept, IResource, IDocument, IMediaAsset, INode from loops.interfaces import IViewConfiguratorSchema @@ -204,9 +204,8 @@ class NodeView(BaseView): name = self.request.get('loops.viewName', '') or self.context.viewName if name and '?' in name: name, params = name.split('?', 1) - ann = self.request.annotations.get('loops.view', {}) + ann = self.viewAnnotations ann['params'] = params - self.request.annotations['loops.view'] = ann if name: adapter = component.queryMultiAdapter( (self.context, self.request), name=name) @@ -216,10 +215,13 @@ class NodeView(BaseView): @Lazy def item(self): + tv = self.viewAnnotations.get('targetView') + if tv is not None: + return tv viewName = self.request.get('loops.viewName') or '' # was there a .target... element in the URL? #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: basicView = component.getMultiAdapter((target, self.request), name=viewName) # xxx: obsolete when self.targetObject is virtual target: @@ -230,6 +232,9 @@ class NodeView(BaseView): @Lazy def targetItem(self): + tv = self.viewAnnotations.get('targetView') + if tv is not None: + return tv viewName = self.request.get('loops.viewName') or '' target = self.virtualTargetObject if target is not None: @@ -400,7 +405,7 @@ class NodeView(BaseView): @Lazy def virtualTargetObject(self): - target = self.request.annotations.get('loops.view', {}).get('target') + target = self.viewAnnotations.get('target') if target is None: target = self.context.target if target is not None: @@ -417,6 +422,9 @@ class NodeView(BaseView): return None def targetView(self, name='index.html', methodName='show'): + tv = self.viewAnnotations.get('targetView') + if tv is not None: + return tv if '?' in name: name, params = name.split('?', 1) target = self.virtualTargetObject @@ -462,6 +470,9 @@ class NodeView(BaseView): @Lazy def virtualTarget(self): + tv = self.viewAnnotations.get('targetView') + if tv is not None: + return tv return self.getViewForTarget(self.virtualTargetObject) @Lazy @@ -503,6 +514,7 @@ class NodeView(BaseView): if isinstance(target, BaseView): return self.makeTargetUrl(self.url, target.uniqueId, target.title) else: + target = baseObject(target) return self.makeTargetUrl(self.url, util.getUidForObject(target), target.title) @@ -922,7 +934,7 @@ class NodeTraverser(ItemTraverser): langInfo = LanguageInfo(self.context, request) adTarget = adapted(target, langInfo) view = component.queryMultiAdapter((adTarget, request), name=name) - if view is not None: + if isinstance(view, BaseView): viewAnnotations['targetView'] = view view.logInfo('NodeTraverser:targetView = %r' % view) return self.context