diff --git a/CHANGES.txt b/CHANGES.txt index 666b26f..c1b99c7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,9 @@ $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 - external collection: provide functionality for automatically populate diff --git a/browser/configure.zcml b/browser/configure.zcml index 931a0ce..9541ac7 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -486,6 +486,14 @@ factory="loops.browser.node.ListResources" permission="zope.View" /> + + 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'] - - diff --git a/browser/node.py b/browser/node.py index 5636d5c..2f35326 100644 --- a/browser/node.py +++ b/browser/node.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2010 Helmut Merz helmutm@cy55.de +# Copyright (c) 2011 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 @@ -677,6 +677,11 @@ class ListChildren(SpecialNodeView): macroName = 'listchildren' +class ListSubobjects(SpecialNodeView): + + macroName = 'listsubobjects' + + class ConfigureView(NodeView): """ An editing view for configuring a node, optionally creating a target object. diff --git a/browser/node_macros.pt b/browser/node_macros.pt index 0c2151b..2f7af3c 100644 --- a/browser/node_macros.pt +++ b/browser/node_macros.pt @@ -166,12 +166,47 @@ Resource Title + tal:content="related/title">Concept Title + +
+ Listing +
+
+
+

Children

+ +
+
+

Resources

+ +
+
+
+ +