From 15cecb8aed8f9b6e6b318ba912d172cae1e626bf Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 22 Jan 2012 12:00:32 +0100 Subject: [PATCH] provide basic framework for view modes (i.e. tabs); store target view in request for later use --- browser/common.py | 29 ++++++++++++++++++++++++----- browser/node.py | 19 +++++++++++++++++-- browser/node_macros.pt | 15 +++++++++++++++ browser/skin/lobo/body.pt | 1 + browser/skin/lobo/lobo.css | 33 ++++++++++++++++++++++++++++++++- tests/setup.py | 6 +++--- 6 files changed, 92 insertions(+), 11 deletions(-) diff --git a/browser/common.py b/browser/common.py index ae5bac9..faa9efd 100644 --- a/browser/common.py +++ b/browser/common.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2011 Helmut Merz helmutm@cy55.de +# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -58,6 +58,7 @@ from cybertools.relation.interfaces import IRelationRegistry from cybertools.stateful.interfaces import IStateful from cybertools.text import mimetypes from cybertools.typology.interfaces import IType, ITypeManager +from cybertools.util.jeep import Jeep from loops.browser.util import normalizeForUrl from loops.common import adapted, baseObject from loops.config.base import DummyOptions @@ -74,7 +75,7 @@ from loops.versioning.interfaces import IVersionable concept_macros = ViewPageTemplateFile('concept_macros.pt') -conceptMacrosTemplate = concept_macros # +conceptMacrosTemplate = concept_macros resource_macros = ViewPageTemplateFile('resource_macros.pt') @@ -84,14 +85,28 @@ class NameField(schema.ASCIILine): super(NameField, self)._validate(value) +class ViewMode(object): + + def __init__(self, name='view', title=None, url=None, active=False, + description=u''): + self.name = name + self.title = title + self.url = url + self.active = active + self.description = description + + @property + def cssClass(self): + return self.active and u'active' or u'' + + class IAddForm(Interface): name = NameField( title=_(u'Object name'), description=_(u'Name of the object - will be used for addressing the ' - 'object via a URL; should therefore be unique within ' - 'the container and not contain special characters') - ) + u'object via a URL; should therefore be unique within ' + u'the container and not contain special characters')) class AddForm(form.AddForm): @@ -115,6 +130,7 @@ class BaseView(GenericView, I18NView): actions = {} icon = None + modeName = 'view' def __init__(self, context, request): super(BaseView, self).__init__(context, request) @@ -148,6 +164,9 @@ class BaseView(GenericView, I18NView): def breadcrumbs(self): return [] + def viewModes(self): + return Jeep() + @Lazy def name(self): return getName(self.context) diff --git a/browser/node.py b/browser/node.py index e49fdb6..90f4ea9 100644 --- a/browser/node.py +++ b/browser/node.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2011 Helmut Merz helmutm@cy55.de +# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -48,10 +48,11 @@ from cybertools.browser.action import Action from cybertools.browser.view import GenericView from cybertools.stateful.interfaces import IStateful 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.i18n.browser import i18n_macros +from loops.i18n.browser import i18n_macros, LanguageInfo from loops.interfaces import IConcept, IResource, IDocument, IMediaAsset, INode from loops.interfaces import IViewConfiguratorSchema from loops.resource import MediaAsset @@ -113,6 +114,11 @@ class NodeView(BaseView): data.extend(self.virtualTarget.breadcrumbs()) return data + def viewModes(self): + if self.virtualTarget: + return self.virtualTarget.viewModes() + return Jeep() + def recordAccess(self, viewName=''): target = self.virtualTargetObject targetUid = target is not None and util.getUidForObject(target) or '' @@ -911,6 +917,15 @@ class NodeTraverser(ItemTraverser): # we'll use the target object in the node's context viewAnnotations['target'] = target return self.context + target = viewAnnotations.get('target') + if target is not None: # name may be a view name for target + langInfo = LanguageInfo(self.context, request) + adTarget = adapted(target, langInfo) + view = component.queryMultiAdapter((adTarget, request), name=name) + if view is not None: + viewAnnotations['targetView'] = view + view.logInfo('NodeTraverser:targetView = %r' % view) + return self.context obj = super(NodeTraverser, self).publishTraverse(request, name) return obj diff --git a/browser/node_macros.pt b/browser/node_macros.pt index 5470efe..72472e9 100644 --- a/browser/node_macros.pt +++ b/browser/node_macros.pt @@ -240,6 +240,21 @@ + + + + +
+