- Lobo layout: provide new part: image grid; make sure image is not repeated if

it already appears in header part
This commit is contained in:
Helmut Merz 2011-10-03 17:41:31 +02:00
parent 4996a51bc6
commit 0390c4084b
4 changed files with 58 additions and 46 deletions

View file

@ -6,6 +6,8 @@ $Id$
1.1 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 - new special view 'listsubobjects' for nodes
- allow for adoption of relations to a predicate interface; - allow for adoption of relations to a predicate interface;
with example implementation for a 'has Role' predicate in loops.organize with example implementation for a 'has Role' predicate in loops.organize

View file

@ -66,11 +66,11 @@
<!-- parts for displaying resources --> <!-- parts for displaying resources -->
<zope:adapter <zope:adapter
name="lobo_rg3" name="lobo_ig3"
for="loops.interfaces.IConcept for="loops.interfaces.IConcept
loops.browser.skin.Lobo" loops.browser.skin.Lobo"
provides="zope.interface.Interface" provides="zope.interface.Interface"
factory="loops.browser.lobo.standard.ResourceGrid3" factory="loops.browser.lobo.standard.ImageGrid3"
permission="zope.View" /> permission="zope.View" />
</configure> </configure>

View file

@ -67,18 +67,16 @@
<!-- resources listing macros --> <!-- resources listing macros -->
<metal:block define-macro="rgrid"> <metal:block define-macro="imagegrid"
<tal:cell repeat="cell part/getResources"> tal:define="showImageLink python:True">
<tal:cell repeat="cell part/getImages">
<div tal:attributes="class cell/cssClass; <div tal:attributes="class cell/cssClass;
style cell/style"> style cell/style">
<a tal:attributes="href cell/targetUrl;
title cell/description">
<metal:image use-macro="item/macros/image" /> <metal:image use-macro="item/macros/image" />
<div class="legend"> <div class="legend">
<b tal:content="cell/title" /><br /> <b tal:content="cell/title" /><br />
<i tal:content="cell/description" /> <i tal:content="cell/description" />
</div> </div>
</a>
</div> </div>
</tal:cell> </tal:cell>
</metal:block> </metal:block>

View file

@ -31,7 +31,6 @@ from cybertools.typology.interfaces import IType
from loops.browser.concept import ConceptView as BaseConceptView from loops.browser.concept import ConceptView as BaseConceptView
from loops.browser.concept import ConceptRelationView as BaseConceptRelationView from loops.browser.concept import ConceptRelationView as BaseConceptRelationView
from loops.browser.resource import ResourceView as BaseResourceView from loops.browser.resource import ResourceView as BaseResourceView
from loops.browser.resource import ResourceRelationView as BaseResourceRelationView
from loops.common import adapted, baseObject from loops.common import adapted, baseObject
@ -64,7 +63,6 @@ class ConceptView(BaseConceptView):
def __init__(self, context, request): def __init__(self, context, request):
super(ConceptView, self).__init__(baseObject(context), request) super(ConceptView, self).__init__(baseObject(context), request)
self.adapted = context
@Lazy @Lazy
def resources(self): def resources(self):
@ -78,6 +76,11 @@ class ConceptView(BaseConceptView):
result['files'].append(r) result['files'].append(r)
return result return result
@Lazy
def images(self):
for r in self.resources['images']:
yield r
# properties from base class: title, description, renderedDescription # properties from base class: title, description, renderedDescription
@Lazy @Lazy
@ -113,23 +116,15 @@ class ConceptView(BaseConceptView):
@Lazy @Lazy
def img(self): def img(self):
self.registerDojoLightbox() # also provides access to info popup self.registerDojoLightbox() # also provides access to info popup
for r in self.resources['images']: for r in self.parentView.parent.images:
# fetch from iterator on layout object: avoid duplicates
url = self.nodeView.getUrlForTarget(r) url = self.nodeView.getUrlForTarget(r)
src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize)) src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize))
return dict(src=src, url=url, return dict(src=src, url=url,
cssClass=self.parentView.imageCssClass) cssClass=self.parentView.imageCssClass)
class ConceptRelationView(BaseConceptRelationView, ConceptView): class Layout(Base, 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):
macroName = 'layout' macroName = 'layout'
@ -140,11 +135,13 @@ class Layout(Base):
parts = (self.options('parts') or parts = (self.options('parts') or
self.typeOptions('parts') or self.typeOptions('parts') or
['h1', 'g3']) ['h1', 'g3'])
ti = adapted(self.context.conceptType).typeInterface
for p in parts: for p in parts:
viewName = 'lobo_' + p viewName = 'lobo_' + p
view = component.queryMultiAdapter((self.context, self.request), view = component.queryMultiAdapter((self.context, self.request),
name=viewName) name=viewName)
if view is not None: if view is not None:
view.parent = self
result.append(view) result.append(view)
return result return result
@ -175,6 +172,12 @@ class BasePart(Base):
view.parentView = self view.parentView = self
return view 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): class Grid3(BasePart):
@ -212,13 +215,41 @@ class Header2(BasePart):
cssClass = ['span-4', 'span-2 last', 'clear'] 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, def __init__(self, relation, request, contextIsSecond=False,
parent=None, idx=0): 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.parentView = parent
self.idx = idx self.idx = idx
@ -244,22 +275,3 @@ class ResourceRelationView(BaseResourceRelationView):
return dict(src=src, url=url, return dict(src=src, url=url,
cssClass=self.parentView.imageCssClass) 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']