From b6867167544801b981839c510bd171e131c800b8 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 27 Jan 2012 07:55:13 +0100 Subject: [PATCH 1/3] 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 From 2a7a5f8a1d31bf53d51d52661e24753f23b71fe2 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 28 Jan 2012 19:51:12 +0100 Subject: [PATCH 2/3] directly call target view from node view if target view is marked as top-level --- browser/common.py | 1 + browser/node.py | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/browser/common.py b/browser/common.py index eb48a6e..641ee5f 100644 --- a/browser/common.py +++ b/browser/common.py @@ -131,6 +131,7 @@ class BaseView(GenericView, I18NView): actions = {} icon = None modeName = 'view' + isToplevel = False def __init__(self, context, request): context = baseObject(context) diff --git a/browser/node.py b/browser/node.py index 71b327c..a19f898 100644 --- a/browser/node.py +++ b/browser/node.py @@ -83,6 +83,13 @@ class NodeView(BaseView): viewConfig = getViewConfiguration(context, request) self.setSkin(viewConfig.get('skinName')) + def __call__(self, *args, **kw): + tv = self.viewAnnotations.get('targetView') + if tv is not None: + if tv.isToplevel: + return tv(*args, **kw) + return super(NodeView, self).__call__(*args, **kw) + @Lazy def macro(self): return self.template.macros['content'] @@ -424,7 +431,7 @@ class NodeView(BaseView): def targetView(self, name='index.html', methodName='show'): tv = self.viewAnnotations.get('targetView') if tv is not None: - return tv + return tv() if '?' in name: name, params = name.split('?', 1) target = self.virtualTargetObject From 46c0e997d4038b3a0e53abbd6f2469cbc116df64 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 29 Jan 2012 11:25:26 +0100 Subject: [PATCH 3/3] use target view (set via node traverser) only if requested as default (index.html) view --- browser/node.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/browser/node.py b/browser/node.py index a19f898..8c4ea1d 100644 --- a/browser/node.py +++ b/browser/node.py @@ -429,9 +429,10 @@ 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 name == 'index.html': # only when called for default view + tv = self.viewAnnotations.get('targetView') + if tv is not None: + return tv() if '?' in name: name, params = name.split('?', 1) target = self.virtualTargetObject