From e363fc971fc11cf0283556c8f942729727587d1d Mon Sep 17 00:00:00 2001 From: hplattner Date: Thu, 11 Oct 2012 10:25:25 +0200 Subject: [PATCH 01/22] add pydevproject files to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 0d20b64..2375512 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ *.pyc +.project +.pydevproject +.settings From 25541aa4bf62f049aefc4a0ea1f9ca4fe1067227 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 26 Jul 2013 10:59:53 +0200 Subject: [PATCH 02/22] optionally reverse head title parts (like in browser/node.py) --- layout/browser/base.py | 9 ++++++--- layout/browser/node.py | 11 ++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/layout/browser/base.py b/layout/browser/base.py index a6494d2..cef66da 100644 --- a/layout/browser/base.py +++ b/layout/browser/base.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2009 Helmut Merz helmutm@cy55.de +# Copyright (c) 2013 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 @@ -18,8 +18,6 @@ """ Base classes for layout-based views. - -$Id$ """ from zope.app.security.interfaces import IUnauthenticatedPrincipal @@ -29,6 +27,7 @@ from zope.proxy import removeAllProxies from zope.security.proxy import removeSecurityProxy from zope.traversing.browser import absoluteURL +from cybertools.meta.interfaces import IOptions from cybertools.util import format from loops.common import adapted from loops.i18n.browser import LanguageInfo @@ -170,3 +169,7 @@ class BaseView(object): def getMetaDescription(self): return self.context.title + @Lazy + def globalOptions(self): + return IOptions(self.loopsRoot) + diff --git a/layout/browser/node.py b/layout/browser/node.py index e2a7167..46435b1 100644 --- a/layout/browser/node.py +++ b/layout/browser/node.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# Copyright (c) 2013 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 @@ -18,8 +18,6 @@ """ Layout node views. - -$Id$ """ from zope.app.security.interfaces import IUnauthenticatedPrincipal @@ -66,6 +64,9 @@ class LayoutNodeView(Page, BaseView): if self.target is not None: targetView = component.getMultiAdapter((self.target, self.request), name='layout') - return ' - '.join((self.context.title, targetView.title)) + parts = [self.context.title, targetView.title] else: - return self.context.title + parts = [self.context.title] + if self.globalOptions('reverseHeadTitle'): + parts.reverse() + return ' - '.join(parts) From bd3bdbf53747712978c94092004b439bb8d2979f Mon Sep 17 00:00:00 2001 From: hplattner Date: Fri, 26 Jul 2013 14:59:12 +0200 Subject: [PATCH 03/22] fix: media asset download adapter --- browser/form.py | 0 media/browser/asset.py | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) mode change 100644 => 100755 browser/form.py diff --git a/browser/form.py b/browser/form.py old mode 100644 new mode 100755 diff --git a/media/browser/asset.py b/media/browser/asset.py index 630a1c8..a03d0ee 100644 --- a/media/browser/asset.py +++ b/media/browser/asset.py @@ -25,12 +25,14 @@ $Id$ """ from zope.app.pagetemplate import ViewPageTemplateFile +from zope.app.container.contained import NameChooser from zope.cachedescriptors.property import Lazy from zope.security.interfaces import Unauthorized +from zope.traversing.api import getParent from loops.browser.node import NodeView from loops.browser.resource import ResourceView, resource_macros -from loops.common import adapted +from loops.common import adapted, normalizeName from loops.util import _ from loops import util @@ -62,7 +64,7 @@ class MediaAssetView(ResourceView): if useAttachment: filename = obj.localFilename or getName(self.context) #filename = urllib.quote(filename) - filename = NameChooser(getParent(self.context)).normalizeName(filename) + filename = NameChooser(getParent(self.context)).chooseName(filename, self.context) response.setHeader('Content-Disposition', 'attachment; filename=%s' % filename) return data From 2ed2bdb76e4f809aa77ff5dd29990182c721fa4d Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 27 Jul 2013 09:01:55 +0200 Subject: [PATCH 04/22] no name chooser necessary for generating filenames; allow '-' in normalized names --- browser/resource.py | 5 +++-- common.py | 2 +- media/browser/asset.py | 7 ++----- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/browser/resource.py b/browser/resource.py index 0960cb2..2b7a7ec 100644 --- a/browser/resource.py +++ b/browser/resource.py @@ -47,7 +47,7 @@ from loops.browser.common import EditForm, BaseView from loops.browser.concept import BaseRelationView, ConceptRelationView from loops.browser.concept import ConceptConfigureView from loops.browser.node import NodeView, node_macros -from loops.common import adapted, NameChooser +from loops.common import adapted, NameChooser, normalizeName from loops.interfaces import IBaseResource, IDocument, ITextDocument from loops.interfaces import IMediaAsset as legacy_IMediaAsset from loops.interfaces import ITypeConcept @@ -214,7 +214,8 @@ class ResourceView(BaseView): if self.typeOptions('no_normalize_download_filename'): filename = '"%s"' % filename else: - filename = NameChooser(getParent(self.context)).normalizeName(filename) + #filename = NameChooser(getParent(self.context)).normalizeName(filename) + filename = normalizeName(filename) response.setHeader('Content-Disposition', 'attachment; filename=%s' % filename) response.setHeader('Content-Length', len(data)) diff --git a/common.py b/common.py index 3e566af..6c90712 100644 --- a/common.py +++ b/common.py @@ -250,7 +250,7 @@ def normalizeName(baseName): except UnicodeDecodeError: result.append('_') continue - if c in '._': + if c in '._-': # separator and special characters to keep result.append(c) continue diff --git a/media/browser/asset.py b/media/browser/asset.py index a03d0ee..a18deda 100644 --- a/media/browser/asset.py +++ b/media/browser/asset.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# Copyright (c) 2013 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 @@ -20,12 +20,9 @@ Views for displaying media assets. Authors: Johann Schimpf, Erich Seifert. - -$Id$ """ from zope.app.pagetemplate import ViewPageTemplateFile -from zope.app.container.contained import NameChooser from zope.cachedescriptors.property import Lazy from zope.security.interfaces import Unauthorized from zope.traversing.api import getParent @@ -64,7 +61,7 @@ class MediaAssetView(ResourceView): if useAttachment: filename = obj.localFilename or getName(self.context) #filename = urllib.quote(filename) - filename = NameChooser(getParent(self.context)).chooseName(filename, self.context) + filename = normalizeName(filename) response.setHeader('Content-Disposition', 'attachment; filename=%s' % filename) return data From 613b01a44fec27f3decfe7503fec9e5836b1913a Mon Sep 17 00:00:00 2001 From: hplattner Date: Tue, 30 Jul 2013 12:03:49 +0200 Subject: [PATCH 05/22] add baseConceptView property to layoutConceptView --- layout/browser/base.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/layout/browser/base.py b/layout/browser/base.py index cef66da..b5039b8 100644 --- a/layout/browser/base.py +++ b/layout/browser/base.py @@ -29,8 +29,9 @@ from zope.traversing.browser import absoluteURL from cybertools.meta.interfaces import IOptions from cybertools.util import format -from loops.common import adapted +from loops.common import adapted, baseObject from loops.i18n.browser import LanguageInfo +from loops.browser.concept import ConceptView as BaseConceptView from loops.browser.util import normalizeForUrl as normalize from loops import util @@ -73,6 +74,10 @@ class BaseView(object): def virtualTargetView(self): return self.viewAnnotations.get('targetView') + @Lazy + def baseConceptView(self): + return BaseConceptView(baseObject(self.context), self.request) + @Lazy def node(self): return self.viewAnnotations.get('node') From 5658ae68cc3bb4ab0d1e280a235d6272b4439779 Mon Sep 17 00:00:00 2001 From: hplattner Date: Tue, 6 Aug 2013 08:56:33 +0200 Subject: [PATCH 06/22] fix headTitle generation for layout views --- layout/browser/node.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/layout/browser/node.py b/layout/browser/node.py index 46435b1..6e1bb44 100644 --- a/layout/browser/node.py +++ b/layout/browser/node.py @@ -61,12 +61,12 @@ class LayoutNodeView(Page, BaseView): @Lazy def headTitle(self): + parts = [self.context.title] if self.target is not None: targetView = component.getMultiAdapter((self.target, self.request), name='layout') - parts = [self.context.title, targetView.title] - else: - parts = [self.context.title] + if targetView.title not in parts: + parts.append(targetView.title) if self.globalOptions('reverseHeadTitle'): parts.reverse() return ' - '.join(parts) From 21b379522727a7cfe7fa46d47f3a8d10c610ed73 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 8 Aug 2013 11:55:05 +0200 Subject: [PATCH 07/22] fix member registration: use correct form macro from loops/browser --- browser/common.py | 4 ++-- organize/browser/member.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/browser/common.py b/browser/common.py index 82c6d65..eb42fd8 100644 --- a/browser/common.py +++ b/browser/common.py @@ -704,8 +704,8 @@ class BaseView(GenericView, I18NView): if IResource.providedBy(self.target): statesDefs = self.globalOptions('organize.stateful.resource', ()) else: - statesDefs = (self.globalOptions('organize.stateful.concept', []) + - self.typeOptions('organize.stateful', [])) + statesDefs = ((self.globalOptions('organize.stateful.concept') or []) + + (self.typeOptions('organize.stateful') or [])) for std in statesDefs: stf = component.getAdapter(self.target, IStateful, name=std) result.append(stf) diff --git a/organize/browser/member.py b/organize/browser/member.py index 5916929..738b521 100644 --- a/organize/browser/member.py +++ b/organize/browser/member.py @@ -112,7 +112,8 @@ class BaseMemberRegistration(NodeView): @Lazy def macro(self): - return schema_macros.macros['form'] + #return schema_macros.macros['form'] + return organize_macros.macros['register'] def checkPermissions(self): personType = adapted(self.conceptManager['person']) From 2c474bf3a6206612a9c9d8450f04b5567defa498 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 8 Aug 2013 17:17:28 +0200 Subject: [PATCH 08/22] allow for giving submit button a name defined by the view --- browser/form_macros.pt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/browser/form_macros.pt b/browser/form_macros.pt index 47e846b..96158c8 100644 --- a/browser/form_macros.pt +++ b/browser/form_macros.pt @@ -313,7 +313,8 @@ Date: Thu, 22 Aug 2013 09:20:57 +0200 Subject: [PATCH 09/22] avoid error if section has no parent book --- compound/book/view_macros.pt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/compound/book/view_macros.pt b/compound/book/view_macros.pt index 43be71b..c5b1562 100644 --- a/compound/book/view_macros.pt +++ b/compound/book/view_macros.pt @@ -30,12 +30,13 @@ tal:attributes="href pred/targetUrl; title pred/title"> - + - + From 4c3848f8db807789776175af67aa2ec68daaf27d Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 22 Aug 2013 09:40:18 +0200 Subject: [PATCH 10/22] allow access to context attribute from management pages, i.e. for updating security --- knowledge/survey/configure.zcml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/knowledge/survey/configure.zcml b/knowledge/survey/configure.zcml index 423889d..a205abd 100644 --- a/knowledge/survey/configure.zcml +++ b/knowledge/survey/configure.zcml @@ -12,6 +12,8 @@ + @@ -23,6 +25,8 @@ + @@ -34,6 +38,8 @@ + @@ -45,6 +51,8 @@ + From 3c153ce05865c942e357e6b5d8829f38789addce Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 8 Sep 2013 11:59:38 +0200 Subject: [PATCH 11/22] control display of resource titles in book sections; use book views also in old Loopz skin --- browser/loops.css | 9 +++++++++ compound/book/browser.py | 3 ++- compound/book/configure.zcml | 6 +++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/browser/loops.css b/browser/loops.css index 52b9a53..d6b9acc 100644 --- a/browser/loops.css +++ b/browser/loops.css @@ -59,6 +59,15 @@ textarea { margin-top: 0.5em; } +/* elements taken from blueprint (Lobo) skin */ +.span-1, .span-2, .span-3, .span-4, .span-5, .span-6 {float: left;} +.span-1 {width: 105px;} +.span-2 {width: 230px;} +.span-3 {width: 355px;} +.span-4 {width: 480px;} +.span-5 {width: 605px;} +.span-6 {width: 730px;} + table.listing { margin: 1px; margin-top: 6px; diff --git a/compound/book/browser.py b/compound/book/browser.py index dd4df91..2635929 100644 --- a/compound/book/browser.py +++ b/compound/book/browser.py @@ -130,7 +130,8 @@ class Base(object): return IOptions(adapted(dt))(name) def getTitleForResource(self, r): - if self.getOptionsForResource(r, 'showtitle'): + if (IOptions(adapted(r.context.resourceType))('show_title_in_section') or + self.getOptionsForResource(r, 'show_title_in_section')): return r.title def getIconForResource(self, r): diff --git a/compound/book/configure.zcml b/compound/book/configure.zcml index 09a374a..6d3ba0d 100644 --- a/compound/book/configure.zcml +++ b/compound/book/configure.zcml @@ -8,7 +8,7 @@ @@ -16,7 +16,7 @@ @@ -24,7 +24,7 @@ From c7cb323d20bf25862342b6820c300e9c092ccdc0 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 8 Sep 2013 17:14:53 +0200 Subject: [PATCH 12/22] show nested children (grandchildren) in book_topic_view if option 'show_nested_children' is set --- browser/common.py | 1 - browser/skin/lobo/lobo.css | 4 ++++ compound/book/view_macros.pt | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/browser/common.py b/browser/common.py index eb42fd8..7cde1a5 100644 --- a/browser/common.py +++ b/browser/common.py @@ -609,7 +609,6 @@ class BaseView(GenericView, I18NView): for opt in (self.options, self.typeOptions, self.globalOptions): if isinstance(opt, DummyOptions): continue - #import pdb; pdb.set_trace() v = opt for key in keys.split('.'): if isinstance(v, list): diff --git a/browser/skin/lobo/lobo.css b/browser/skin/lobo/lobo.css index 4fbcbd3..ee31522 100644 --- a/browser/skin/lobo/lobo.css +++ b/browser/skin/lobo/lobo.css @@ -302,6 +302,10 @@ fieldset.box td { margin-top: -1px; } +.nested { + margin-left: 2em; +} + .content-1 h1, h1 { padding-top: 0.5em; font-size: 180%; diff --git a/compound/book/view_macros.pt b/compound/book/view_macros.pt index c5b1562..03f6fba 100644 --- a/compound/book/view_macros.pt +++ b/compound/book/view_macros.pt @@ -10,10 +10,26 @@ tal:content="related/title" />
- + + +
+ + + From 0528718523e6b8ce9922adbaeb636b5190cf0ee4 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 18 Sep 2013 09:36:04 +0200 Subject: [PATCH 14/22] allow selection of work items by state via type option --- organize/work/browser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/organize/work/browser.py b/organize/work/browser.py index 3a78a10..8975aba 100644 --- a/organize/work/browser.py +++ b/organize/work/browser.py @@ -253,7 +253,8 @@ class BaseWorkItemsView(object): tsTo += 3600 * 24 - 1 # include full end date if tsFrom or tsTo: result['timeFromTo'] = (tsFrom, tsTo) - state = form.get('wi_state') or self.options.wi_state + state = (form.get('wi_state') or + self.options.wi_state or self.typeOptions.wi_state) if not state: result['state'] = ['planned', 'accepted', 'running', 'done', 'done_x', 'finished', 'delegated', 'moved', 'cancelled'] From a085da00508a53f2006de77fcd6a8e8f12b1686a Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 23 Sep 2013 14:17:00 +0200 Subject: [PATCH 15/22] move full getAction() method to base view; provide 'append_action' options for putting actions from options after internally assigned actions --- browser/common.py | 18 +++++++++++++++--- browser/concept.py | 11 ----------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/browser/common.py b/browser/common.py index 7cde1a5..782d700 100644 --- a/browser/common.py +++ b/browser/common.py @@ -52,6 +52,7 @@ from zope.traversing.browser import absoluteURL from zope.traversing.api import getName, getParent, traverse from cybertools.ajax.dojo import dojoMacroTemplate +from cybertools.browser.action import actions from cybertools.browser.view import GenericView from cybertools.meta.interfaces import IOptions from cybertools.meta.element import Element @@ -720,10 +721,21 @@ class BaseView(GenericView, I18NView): """ Return a list of actions that provide the view and edit actions available for the context object. """ - actions = [] + acts = [] + optKey = 'action.' + category + actNames = (self.options(optKey) or []) + (self.typeOptions(optKey) or []) + if actNames: + acts = list(actions.get(category, actNames, + view=self, page=page, target=target)) if category in self.actions: - actions.extend(self.actions[category](self, page=page, target=target)) - return actions + acts.extend(self.actions[category](self, page, target)) + optKey = 'append_action.' + category + actNames = (self.options(optKey) or []) + (self.typeOptions(optKey) or []) + if actNames: + acts.extend(list(actions.get(category, actNames, + view=self, page=page, target=target))) + return acts + def getAdditionalActions(self, category='object', page=None, target=None): """ Provide additional actions; override by subclass. diff --git a/browser/concept.py b/browser/concept.py index f06c419..cb2027a 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -535,17 +535,6 @@ class ConceptView(BaseView): for node in self.context.getClients(): yield NodeView(node, self.request) - def getActions(self, category='object', page=None, target=None): - acts = [] - optKey = 'action.' + category - actNames = (self.options(optKey) or []) + (self.typeOptions(optKey) or []) - if actNames: - acts = list(actions.get(category, actNames, - view=self, page=page, target=target)) - if category in self.actions: - acts.extend(self.actions[category](self, page, target)) - return acts - def getPortletActions(self, page=None, target=None): if self.portlet_actions: return actions.get('portlet', self.portlet_actions, From b24619fcd787ee25c267776a0be34ad59f0383b8 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 3 Oct 2013 11:26:28 +0200 Subject: [PATCH 16/22] list nested concept structure, controlled by URL parameter 'list_nested' --- browser/concept_macros.pt | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt index eb3ed12..47641d9 100644 --- a/browser/concept_macros.pt +++ b/browser/concept_macros.pt @@ -138,7 +138,8 @@

Children

@@ -171,7 +172,7 @@ - Resource Title + Concept Title + + + + + + @@ -329,6 +338,20 @@ + +
+ + + + + + +
+
+ + From 26906601f23593a01ba637db3b28d1e66ccab8b6 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 5 Oct 2013 09:59:24 +0200 Subject: [PATCH 17/22] allow suppression of empty topics in book views --- compound/book/view_macros.pt | 63 ++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/compound/book/view_macros.pt b/compound/book/view_macros.pt index 03f6fba..f8ffd46 100644 --- a/compound/book/view_macros.pt +++ b/compound/book/view_macros.pt @@ -1,32 +1,39 @@ - -
-

- -

-
- - - -
+ + +
+

+

+
+ + + +
+ - -
-

- -

-
-
+ + +
+

+ +

+
+
+ @@ -120,15 +127,17 @@ - +

Children

+ tal:condition="children">Children

Text Elements

+ tal:condition="textResources">Text Elements
-

From f9801e184b671a5ebe60138dd7dcfdc38c6d35da Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 5 Oct 2013 11:03:47 +0200 Subject: [PATCH 18/22] unify state handling for concepts and resources on display and search --- browser/common.py | 6 +++--- expert/browser/search.py | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/browser/common.py b/browser/common.py index 782d700..18c6362 100644 --- a/browser/common.py +++ b/browser/common.py @@ -702,10 +702,10 @@ class BaseView(GenericView, I18NView): if not checkPermission(self.viewStatesPermission, self.context): return result if IResource.providedBy(self.target): - statesDefs = self.globalOptions('organize.stateful.resource', ()) + statesDefs = (self.globalOptions('organize.stateful.resource') or []) else: - statesDefs = ((self.globalOptions('organize.stateful.concept') or []) + - (self.typeOptions('organize.stateful') or [])) + statesDefs = (self.globalOptions('organize.stateful.concept') or []) + statesDefs += (self.typeOptions('organize.stateful') or []) for std in statesDefs: stf = component.getAdapter(self.target, IStateful, name=std) result.append(stf) diff --git a/expert/browser/search.py b/expert/browser/search.py index 1776e57..2120029 100644 --- a/expert/browser/search.py +++ b/expert/browser/search.py @@ -257,8 +257,6 @@ class Search(ConceptView): return self.viewIterator(result) def checkStates(self, obj): - if not IResource.providedBy(obj): - return True for std, states in self.selectedStates.items(): if std.startswith('state.resource.'): std = std[len('state.resource.'):] From ad144f7f695ea681a86f7d975531dd5f6aea6fdc Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 16 Oct 2013 11:27:18 +0200 Subject: [PATCH 19/22] use CSS class for rendering of description fields, adjust setting for this: no italics, slightly bigger font --- browser/concept_macros.pt | 6 ++++-- browser/lobo/standard.pt | 3 ++- browser/resource_macros.pt | 19 ++++++++++++------- browser/skin/lobo/lobo.css | 17 ++++++++++++----- compound/book/view_macros.pt | 3 ++- media/browser/asset.pt | 3 ++- system/site/view_macros.pt | 3 ++- 7 files changed, 36 insertions(+), 18 deletions(-) diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt index 47641d9..0e725c8 100644 --- a/browser/concept_macros.pt +++ b/browser/concept_macros.pt @@ -64,10 +64,12 @@

-

- Description

+
Description
+ diff --git a/browser/lobo/standard.pt b/browser/lobo/standard.pt index 34a015e..9970ddd 100644 --- a/browser/lobo/standard.pt +++ b/browser/lobo/standard.pt @@ -72,7 +72,8 @@
- +

 
diff --git a/browser/resource_macros.pt b/browser/resource_macros.pt index 406e519..8a70e4f 100644 --- a/browser/resource_macros.pt +++ b/browser/resource_macros.pt @@ -12,9 +12,11 @@

Title

-

- Description

+ +
Description
+
Title
-

Description

+
Description
@@ -63,8 +66,10 @@

Title

-

Description 

-

+

Description
+
+ diff --git a/browser/skin/lobo/lobo.css b/browser/skin/lobo/lobo.css index ee31522..30fdd1a 100644 --- a/browser/skin/lobo/lobo.css +++ b/browser/skin/lobo/lobo.css @@ -22,10 +22,6 @@ body { margin-top: 1em; } -.head-description, .legend { - font-style: italic; -} - ul.view-modes { padding: 0 0 0 2em; margin: 0.7em 0 0 0; @@ -118,12 +114,23 @@ thead th { padding-left: 0; } +.head-description{ + /* font-style: italic; */ + font-size: 110%; +} + .description { - font-style: italic; + /* font-style: italic; */ /* margin-top: 0.5em;*/ + font-size: 110%; margin-bottom: 0.3em; } +.legend { + /* font-style: italic; */ + font-size: 95%; +} + .infotext { font-size: 90%; } diff --git a/compound/book/view_macros.pt b/compound/book/view_macros.pt index f8ffd46..c85a69c 100644 --- a/compound/book/view_macros.pt +++ b/compound/book/view_macros.pt @@ -13,7 +13,8 @@

-
+ diff --git a/system/site/view_macros.pt b/system/site/view_macros.pt index e542cca..2a0bc47 100644 --- a/system/site/view_macros.pt +++ b/system/site/view_macros.pt @@ -11,7 +11,8 @@
  • My Site
    - +
  • From 513e730132c97a36f2136b9e318c94a2d893e75a Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 16 Oct 2013 15:18:11 +0200 Subject: [PATCH 20/22] book, book topics: show only published texts and topics --- compound/book/browser.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/compound/book/browser.py b/compound/book/browser.py index 2635929..e1408a8 100644 --- a/compound/book/browser.py +++ b/compound/book/browser.py @@ -95,6 +95,20 @@ class Base(object): if self.editable: return 'index.html' + def checkState(self, stateful): + if stateful is None: + return True + if stateful.statesDefinition == 'simple_publishing': + return stateful.state in ('published',) + return True + + def children(self): + for c in self.getChildren(): + for stf in c.states or [None]: + if self.checkState(stf): + yield c + break + def getResources(self): relViews = super(Base, self).getResources() return relViews @@ -106,9 +120,12 @@ class Base(object): idx = 0 for rv in self.getResources(): if rv.context.contentType.startswith('text/'): - idx += 1 - result.append(rv) - self.images.append([]) + for stf in rv.states or [None]: + if self.checkState(stf): + idx += 1 + result.append(rv) + self.images.append([]) + break else: self.registerDojoLightbox() url = self.nodeView.getUrlForTarget(rv.context) From e503d9c70cf3622ebd19be381d327d85a4060868 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 16 Oct 2013 18:11:06 +0200 Subject: [PATCH 21/22] control states to filter via global option; check for book topics, texts, and in quicksearch --- browser/common.py | 20 +++++++++++++++++++- compound/book/browser.py | 17 +++-------------- expert/browser/search.py | 4 +++- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/browser/common.py b/browser/common.py index 18c6362..4c77cf5 100644 --- a/browser/common.py +++ b/browser/common.py @@ -698,8 +698,16 @@ class BaseView(GenericView, I18NView): @Lazy def states(self): + return self.getStates() + + @Lazy + def allStates(self): + return self.getStates(False) + + def getStates(self, forDisplay=True): result = [] - if not checkPermission(self.viewStatesPermission, self.context): + if forDisplay and not checkPermission(self.viewStatesPermission, self.context): + # do not display state information return result if IResource.providedBy(self.target): statesDefs = (self.globalOptions('organize.stateful.resource') or []) @@ -711,6 +719,16 @@ class BaseView(GenericView, I18NView): result.append(stf) return result + def checkState(self): + if not self.allStates: + return True + for stf in self.allStates: + option = self.globalOptions( + 'organize.stateful.restrict.' + stf.statesDefinition) + if option: + return stf.state in option + return True + # controlling actions and editing @Lazy diff --git a/compound/book/browser.py b/compound/book/browser.py index e1408a8..a7cae8d 100644 --- a/compound/book/browser.py +++ b/compound/book/browser.py @@ -95,19 +95,10 @@ class Base(object): if self.editable: return 'index.html' - def checkState(self, stateful): - if stateful is None: - return True - if stateful.statesDefinition == 'simple_publishing': - return stateful.state in ('published',) - return True - def children(self): for c in self.getChildren(): - for stf in c.states or [None]: - if self.checkState(stf): - yield c - break + if c.checkState(): + yield c def getResources(self): relViews = super(Base, self).getResources() @@ -120,12 +111,10 @@ class Base(object): idx = 0 for rv in self.getResources(): if rv.context.contentType.startswith('text/'): - for stf in rv.states or [None]: - if self.checkState(stf): + if rv.checkState(): idx += 1 result.append(rv) self.images.append([]) - break else: self.registerDojoLightbox() url = self.nodeView.getUrlForTarget(rv.context) diff --git a/expert/browser/search.py b/expert/browser/search.py index 2120029..02d5852 100644 --- a/expert/browser/search.py +++ b/expert/browser/search.py @@ -70,7 +70,9 @@ class QuickSearchResults(NodeView): fv = FilterView(self.context, self.request) result = fv.apply(result) result.sort(key=lambda x: x.title.lower()) - return self.viewIterator(result) + for v in self.viewIterator(result): + if v.checkState(): + yield v class Search(ConceptView): From a149c1630cf98896aa5ae0285189f77907f9dcda Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 17 Oct 2013 11:21:22 +0200 Subject: [PATCH 22/22] hide link to topic if topic is not accessible because of its state --- compound/book/browser.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compound/book/browser.py b/compound/book/browser.py index a7cae8d..fb6fcf6 100644 --- a/compound/book/browser.py +++ b/compound/book/browser.py @@ -159,7 +159,9 @@ class Base(object): def getParentsForResource(self, r): for c in r.context.getConcepts([self.defaultPredicate]): - if c != self.context and c.conceptType != self.documentTypeType: + if (c != self.context and + c.conceptType != self.documentTypeType and + self.getViewForObject(c).checkState()): yield c