From 4996a51bc63dd81bbc7a92435943a5d3bda1b229 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 3 Oct 2011 14:47:52 +0200 Subject: [PATCH 01/11] new special view 'listsubobjects' for nodes --- CHANGES.txt | 1 + browser/configure.zcml | 8 ++++++++ browser/node.py | 7 ++++++- browser/node_macros.pt | 37 ++++++++++++++++++++++++++++++++++++- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 666b26f..6bdc9e9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,7 @@ $Id$ 1.1 --- +- new special view 'listsubobjects' for nodes - allow for adoption of relations to a predicate interface; with example implementation for a 'has Role' predicate in loops.organize - external collection: provide functionality for automatically populate diff --git a/browser/configure.zcml b/browser/configure.zcml index 92746a0..c358791 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -486,6 +486,14 @@ factory="loops.browser.node.ListResources" permission="zope.View" /> + + Resource Title + tal:content="related/title">Concept Title + +
+ Listing +
+
+
+

Children

+ +
+
+

Resources

+ +
+
+
+ + Date: Mon, 3 Oct 2011 17:41:31 +0200 Subject: [PATCH 02/11] - Lobo layout: provide new part: image grid; make sure image is not repeated if it already appears in header part --- CHANGES.txt | 2 + browser/lobo/configure.zcml | 4 +- browser/lobo/standard.pt | 8 ++-- browser/lobo/standard.py | 90 +++++++++++++++++++++---------------- 4 files changed, 58 insertions(+), 46 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 6bdc9e9..c1b99c7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,8 @@ $Id$ 1.1 --- +- 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 - allow for adoption of relations to a predicate interface; with example implementation for a 'has Role' predicate in loops.organize diff --git a/browser/lobo/configure.zcml b/browser/lobo/configure.zcml index 6355601..db3b254 100644 --- a/browser/lobo/configure.zcml +++ b/browser/lobo/configure.zcml @@ -66,11 +66,11 @@ diff --git a/browser/lobo/standard.pt b/browser/lobo/standard.pt index f344cc6..f8a6afa 100644 --- a/browser/lobo/standard.pt +++ b/browser/lobo/standard.pt @@ -67,18 +67,16 @@ - - + +
-

-
diff --git a/browser/lobo/standard.py b/browser/lobo/standard.py index 1e0de59..91cc2f4 100644 --- a/browser/lobo/standard.py +++ b/browser/lobo/standard.py @@ -31,7 +31,6 @@ from cybertools.typology.interfaces import IType from loops.browser.concept import ConceptView as BaseConceptView from loops.browser.concept import ConceptRelationView as BaseConceptRelationView from loops.browser.resource import ResourceView as BaseResourceView -from loops.browser.resource import ResourceRelationView as BaseResourceRelationView from loops.common import adapted, baseObject @@ -64,7 +63,6 @@ class ConceptView(BaseConceptView): def __init__(self, context, request): super(ConceptView, self).__init__(baseObject(context), request) - self.adapted = context @Lazy def resources(self): @@ -78,6 +76,11 @@ class ConceptView(BaseConceptView): result['files'].append(r) return result + @Lazy + def images(self): + for r in self.resources['images']: + yield r + # properties from base class: title, description, renderedDescription @Lazy @@ -113,23 +116,15 @@ class ConceptView(BaseConceptView): @Lazy def img(self): self.registerDojoLightbox() # also provides access to info popup - for r in self.resources['images']: - url = self.nodeView.getUrlForTarget(r) - src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize)) - return dict(src=src, url=url, - cssClass=self.parentView.imageCssClass) + for r in self.parentView.parent.images: + # fetch from iterator on layout object: avoid duplicates + url = self.nodeView.getUrlForTarget(r) + src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize)) + return dict(src=src, url=url, + cssClass=self.parentView.imageCssClass) -class ConceptRelationView(BaseConceptRelationView, ConceptView): - - def __init__(self, relation, request, contextIsSecond=False, - parent=None, idx=0): - BaseConceptRelationView.__init__(self, relation, request, contextIsSecond) - self.parentView = parent - self.idx = idx - - -class Layout(Base): +class Layout(Base, ConceptView): macroName = 'layout' @@ -140,11 +135,13 @@ class Layout(Base): parts = (self.options('parts') or self.typeOptions('parts') or ['h1', 'g3']) + ti = adapted(self.context.conceptType).typeInterface for p in parts: viewName = 'lobo_' + p view = component.queryMultiAdapter((self.context, self.request), name=viewName) if view is not None: + view.parent = self result.append(view) return result @@ -175,6 +172,12 @@ class BasePart(Base): view.parentView = self return view + def getImages(self): + result = [] + for idx, img in enumerate(self.parent.images): + result.append(ResourceView(img, self.request, parent=self, idx=idx)) + return result + class Grid3(BasePart): @@ -212,13 +215,41 @@ class Header2(BasePart): cssClass = ['span-4', 'span-2 last', 'clear'] -# layout components for presenting lists of resources +# resource parts -class ResourceRelationView(BaseResourceRelationView): + +class ImageGrid3(BasePart): + + macroName = 'imagegrid' + imageSize = 'small' + height = 'auto; padding-bottom: 10px' + gridPattern = ['span-2', 'span-2', 'span-2 last'] + + +# relation views, used for cells (components) of lists and grids + +class ConceptRelationView(BaseConceptRelationView, ConceptView): def __init__(self, relation, request, contextIsSecond=False, parent=None, idx=0): - BaseResourceRelationView.__init__(self, relation, request, contextIsSecond) + BaseConceptRelationView.__init__(self, relation, request, contextIsSecond) + self.parentView = parent + self.idx = idx + + @Lazy + def img(self): + self.registerDojoLightbox() # also provides access to info popup + for r in self.images: + url = self.nodeView.getUrlForTarget(r) + src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize)) + return dict(src=src, url=url, + cssClass=self.parentView.imageCssClass) + + +class ResourceView(BaseResourceView): + + def __init__(self, resource, request, parent=None, idx=0): + BaseResourceView.__init__(self, resource, request) self.parentView = parent self.idx = idx @@ -244,22 +275,3 @@ class ResourceRelationView(BaseResourceRelationView): return dict(src=src, url=url, cssClass=self.parentView.imageCssClass) -class ResourcesPart(BasePart): - - def getResources(self): - result = [] - resourceRels = self.context.getResourceRelations() - for idx, r in enumerate(resourceRels): - result.append(ResourceRelationView(r, self.request, - contextIsSecond=True, parent=self, idx=idx)) - return result - - -class ResourceGrid3(ResourcesPart): - - macroName = 'rgrid' - imageSize = 'small' - height = 'auto; padding-bottom: 10px' - gridPattern = ['span-2', 'span-2', 'span-2 last'] - - From 26472a280e89e1c92ac8dbe1f4dbd5dcc91b88bb Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 7 Oct 2011 20:41:15 +0200 Subject: [PATCH 03/11] show lightbox for links on images that do not lead to a child concept; provide info icon for resources that have the 'showInfo' flag set --- browser/lobo/standard.pt | 42 +++++++++++++++++++++++++++++----------- browser/lobo/standard.py | 26 +++++++++++++++++++------ interfaces.py | 1 + media/interfaces.py | 6 ++++++ 4 files changed, 58 insertions(+), 17 deletions(-) diff --git a/browser/lobo/standard.pt b/browser/lobo/standard.pt index f8a6afa..38322d9 100644 --- a/browser/lobo/standard.pt +++ b/browser/lobo/standard.pt @@ -12,9 +12,9 @@
+ -

@@ -29,10 +29,8 @@
- - -
  + +
 
@@ -51,6 +49,14 @@
@@ -74,7 +80,16 @@ style cell/style">
-
+ + + + + +
@@ -87,15 +102,20 @@ - + + + + diff --git a/browser/lobo/standard.py b/browser/lobo/standard.py index 91cc2f4..b6e02ef 100644 --- a/browser/lobo/standard.py +++ b/browser/lobo/standard.py @@ -120,8 +120,12 @@ class ConceptView(BaseConceptView): # fetch from iterator on layout object: avoid duplicates url = self.nodeView.getUrlForTarget(r) src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize)) - return dict(src=src, url=url, - cssClass=self.parentView.imageCssClass) + fullSrc = ('%s/mediaasset.html?v=%s' % (url, self.parentView.fullImageSize)) + adImg = adapted(r) + showInfo = adImg.showInfo and adImg.metaInfo + return dict(src=src, fullImageUrl=fullSrc, title=r.title, + url=url, cssClass=self.parentView.imageCssClass, + showInfo=showInfo) class Layout(Base, ConceptView): @@ -149,6 +153,7 @@ class Layout(Base, ConceptView): class BasePart(Base): imageSize = 'small' + fullImageSize = 'medium' imageCssClass = '' height = 260 gridPattern = [] @@ -240,10 +245,15 @@ class ConceptRelationView(BaseConceptRelationView, ConceptView): def img(self): self.registerDojoLightbox() # also provides access to info popup for r in self.images: + # fetch from iterator on layout object: avoid duplicates url = self.nodeView.getUrlForTarget(r) src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize)) - return dict(src=src, url=url, - cssClass=self.parentView.imageCssClass) + fullSrc = ('%s/mediaasset.html?v=%s' % (url, self.parentView.fullImageSize)) + adImg = adapted(r) + showInfo = adImg.showInfo and adImg.metaInfo + return dict(src=src, fullImageUrl=fullSrc, title=r.title, + url=url, cssClass=self.parentView.imageCssClass, + showInfo=showInfo) class ResourceView(BaseResourceView): @@ -272,6 +282,10 @@ class ResourceView(BaseResourceView): self.registerDojoLightbox() # also provides access to info popup url = self.nodeView.getUrlForTarget(self.context) src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize)) - return dict(src=src, url=url, - cssClass=self.parentView.imageCssClass) + fullSrc = ('%s/mediaasset.html?v=%s' % (url, self.parentView.fullImageSize)) + adImg = adapted(self.context) + showInfo = adImg.showInfo and adImg.metaInfo + return dict(src=src, fullImageUrl=fullSrc, title=self.context.title, + url=url, cssClass=self.parentView.imageCssClass, + showInfo=showInfo) diff --git a/interfaces.py b/interfaces.py index ebd1fab..b4ec500 100644 --- a/interfaces.py +++ b/interfaces.py @@ -296,6 +296,7 @@ class IBaseResource(ILoopsObject): metaInfo = Attribute('Optional additional information about the resource ' 'provided as text.') + showInfo = Attribute('Show object information in the standard user interface.') def getType(): """ Return a concept that provides the object's type, i.e. the diff --git a/media/interfaces.py b/media/interfaces.py index 6254977..099e3fb 100644 --- a/media/interfaces.py +++ b/media/interfaces.py @@ -39,3 +39,9 @@ class IMediaAsset(IMediaAsset, IExternalFile): missing_value=u'', required=False) + showInfo = schema.Bool( + title=_(u'Show Object Information'), + description=_(u'Show object information in the standard user interface.'), + default=False, + required=False) + From c2410a830ebddb161490a0f99e47f3345bec504b Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 7 Oct 2011 20:56:57 +0200 Subject: [PATCH 04/11] show lightbox for links on images that do not lead to a child concept; provide info icon for resources that have the 'showInfo' flag set --- browser/configure.zcml | 6 ++++++ browser/info.pt | 25 +++++++++++++++++++++++-- browser/lobo/standard.pt | 4 ++-- browser/node.py | 9 +++++++++ 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/browser/configure.zcml b/browser/configure.zcml index c358791..58adf33 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -547,6 +547,12 @@ class="loops.browser.node.ObjectInfo" permission="zope.View" /> + + Creators: + tal:content="info/label">Meta: + + + +
+ + + + + + + + + + + + + + @@ -48,5 +70,4 @@
+

Information

Meta:
-
diff --git a/browser/lobo/standard.pt b/browser/lobo/standard.pt index 38322d9..296312b 100644 --- a/browser/lobo/standard.pt +++ b/browser/lobo/standard.pt @@ -50,7 +50,7 @@ tal:attributes="class python:part.cssClass[0]"> - @@ -82,7 +82,7 @@
- diff --git a/browser/node.py b/browser/node.py index bf2ea68..2ac755c 100644 --- a/browser/node.py +++ b/browser/node.py @@ -607,6 +607,15 @@ class ObjectInfo(NodeView): return self.request.get('dialog', 'object_info') +class MetaInfo(ObjectInfo): + + __call__ = innerHtml + + @Lazy + def macro(self): + return self.macros['meta_info'] + + class InlineEdit(NodeView): """ Provides inline editor as inner HTML""" From 39d75e67cebc4c70e857453ee9f3e74db374fcaa Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 9 Oct 2011 09:57:30 +0200 Subject: [PATCH 05/11] new helper property resourcesByType, e.g. for showing images with a concept --- browser/concept.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/browser/concept.py b/browser/concept.py index 8c693cb..546a22e 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -395,10 +395,22 @@ class ConceptView(BaseView): fv = FilterView(self.context, self.request) rels = self.context.getResourceRelations() for r in rels: - #yield self.childViewFactory(r, self.request, contextIsSecond=True) if fv.check(r.first): yield ResourceRelationView(r, self.request, contextIsSecond=True) + @Lazy + def resourcesByType(self): + result = dict(texts=[], images=[], files=[]) + for rv in self.resources(): + r = rv.context + if r.contentType.startswith('text/'): + result['texts'].append(r) + if r.contentType.startswith('image/'): + result['images'].append(r) + else: + result['files'].append(r) + return result + def unique(self, rels): result = Jeep() for r in rels: From 7c1f7af4a41120419d3b424df76eb68583a0dcdc Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 13 Oct 2011 09:59:23 +0200 Subject: [PATCH 06/11] provide h0 layout part (without image); allow for image display in navigatin menu --- browser/concept.py | 15 +++++++++++++-- browser/lobo/configure.zcml | 8 ++++++++ browser/lobo/standard.pt | 26 ++++++++++++++------------ browser/lobo/standard.py | 8 ++++++++ browser/skin/lobo/lobo.css | 2 +- 5 files changed, 44 insertions(+), 15 deletions(-) diff --git a/browser/concept.py b/browser/concept.py index 546a22e..9fa7d5e 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -350,7 +350,12 @@ class ConceptView(BaseView): #IOptions(adapted(pr.predicate))('hide_parents_for', [])): IOptions(pr.predicate)('hide_parents_for', [])): return True - hideRoles = IOptions(adapted(pr.first.conceptType))('hide_for', None) + hideRoles = None + options = component.queryAdapter(adapted(pr.first), IOptions) + if options is not None: + hideRoles = options('hide_for', None) + if not hideRoles: + hideRoles = IOptions(adapted(pr.first.conceptType))('hide_for', None) if hideRoles is not None: principal = self.request.principal if (IUnauthenticatedPrincipal.providedBy(principal) and @@ -398,10 +403,16 @@ class ConceptView(BaseView): if fv.check(r.first): yield ResourceRelationView(r, self.request, contextIsSecond=True) + @Lazy + def resourcesList(self): + from loops.browser.resource import ResourceRelationView + return [ResourceRelationView(r, self.request, contextIsSecond=True) + for r in self.context.getResourceRelations()] + @Lazy def resourcesByType(self): result = dict(texts=[], images=[], files=[]) - for rv in self.resources(): + for rv in self.resourcesList: r = rv.context if r.contentType.startswith('text/'): result['texts'].append(r) diff --git a/browser/lobo/configure.zcml b/browser/lobo/configure.zcml index db3b254..0be24a7 100644 --- a/browser/lobo/configure.zcml +++ b/browser/lobo/configure.zcml @@ -39,6 +39,14 @@ factory="loops.browser.lobo.standard.List2" permission="zope.View" /> + +
- + +
+ + + + + +
+
diff --git a/browser/lobo/standard.py b/browser/lobo/standard.py index b6e02ef..b1374cd 100644 --- a/browser/lobo/standard.py +++ b/browser/lobo/standard.py @@ -157,6 +157,7 @@ class BasePart(Base): imageCssClass = '' height = 260 gridPattern = [] + showImage = True def getChildren(self): subtypeNames = (self.params.get('subtypes') or [''])[0].split(',') @@ -206,6 +207,13 @@ class List2(BasePart): gridPattern = [['span-4 clear', 'span-2 last']] +class Header0(BasePart): + + macroName = 'header' + cssClass = ['span-6 last', 'clear'] + showImage = False + + class Header1(BasePart): macroName = 'header' diff --git a/browser/skin/lobo/lobo.css b/browser/skin/lobo/lobo.css index b088587..fd323c7 100644 --- a/browser/skin/lobo/lobo.css +++ b/browser/skin/lobo/lobo.css @@ -443,7 +443,7 @@ img.notselected { /* lobo layout-specific classes */ .legend { - margin-top: 3px; + margin-top: 1px; } /* comments */ From 7cf460a7de1d88a096770840e788b3e7b6cb0abf Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 15 Oct 2011 10:12:50 +0200 Subject: [PATCH 07/11] suppress br tag if image is not shown --- browser/lobo/standard.pt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/lobo/standard.pt b/browser/lobo/standard.pt index 051369d..05cdf3f 100644 --- a/browser/lobo/standard.pt +++ b/browser/lobo/standard.pt @@ -63,7 +63,7 @@
- +
 
From 75ae387e7bb39d74a9fcdceaa84a4f2dc75dd958 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 15 Oct 2011 11:29:34 +0200 Subject: [PATCH 08/11] set CSS classes list correctly for header without imagees --- browser/lobo/standard.py | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/lobo/standard.py b/browser/lobo/standard.py index b1374cd..fb847cd 100644 --- a/browser/lobo/standard.py +++ b/browser/lobo/standard.py @@ -212,6 +212,7 @@ class Header0(BasePart): macroName = 'header' cssClass = ['span-6 last', 'clear'] showImage = False + cssClass = ['', 'span-6 last', 'clear'] class Header1(BasePart): From 8bd8a5ca8818d134d414a13423f3d5890fa25c61 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 16 Oct 2011 13:17:57 +0200 Subject: [PATCH 09/11] do not show object actions for anonymous users --- media/browser/asset.pt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/media/browser/asset.pt b/media/browser/asset.pt index 18936c3..9f28f1d 100644 --- a/media/browser/asset.pt +++ b/media/browser/asset.pt @@ -1,6 +1,7 @@
-
+ +

Title


Date: Sun, 16 Oct 2011 13:22:56 +0200 Subject: [PATCH 10/11] show cell title instead of description as link title; use cell (or image) title also for the alt attribute of image elements --- browser/lobo/standard.pt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/browser/lobo/standard.pt b/browser/lobo/standard.pt index 05cdf3f..6c4c2ba 100644 --- a/browser/lobo/standard.pt +++ b/browser/lobo/standard.pt @@ -110,13 +110,15 @@ title cell/img/title"> + class cell/img/cssClass; + alt cell/title" /> + title cell/title"> + class cell/img/cssClass; + alt cell/title" /> From f2497f6ad36b45715742aefe55c856a8809d53cd Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 20 Oct 2011 09:42:43 +0200 Subject: [PATCH 11/11] suppress edit resource action if object may not be modified by current user --- browser/resource.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/browser/resource.py b/browser/resource.py index 88125da..251ca49 100644 --- a/browser/resource.py +++ b/browser/resource.py @@ -243,8 +243,10 @@ class ResourceView(BaseView): # actions def getPortletActions(self, page=None, target=None): - return actions.get('portlet', ['edit_object'], view=self, page=page, - target=target) + if canWrite(target.context, 'data'): + return actions.get('portlet', ['edit_object'], view=self, page=page, + target=target) + return [] def getObjectActions(self, page=None, target=None): acts = ['info']