Merge branch 'master' of ssh://git.cy55.de/home/helmutm/git/loops into bbmaster

This commit is contained in:
Helmut Merz 2011-10-04 17:01:30 +02:00
commit 6d5f273f28
7 changed files with 109 additions and 48 deletions

View file

@ -6,6 +6,9 @@ $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
- 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
- external collection: provide functionality for automatically populate - external collection: provide functionality for automatically populate

View file

@ -486,6 +486,14 @@
factory="loops.browser.node.ListResources" factory="loops.browser.node.ListResources"
permission="zope.View" /> permission="zope.View" />
<zope:adapter
name="listsubobjects"
for="loops.interfaces.INode
zope.publisher.interfaces.browser.IBrowserRequest"
provides="zope.interface.Interface"
factory="loops.browser.node.ListSubobjects"
permission="zope.View" />
<zope:adapter <zope:adapter
name="listchildren" name="listchildren"
for="loops.interfaces.INode for="loops.interfaces.INode

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:
url = self.nodeView.getUrlForTarget(r) # fetch from iterator on layout object: avoid duplicates
src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize)) url = self.nodeView.getUrlForTarget(r)
return dict(src=src, url=url, src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize))
cssClass=self.parentView.imageCssClass) return dict(src=src, url=url,
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']

View file

@ -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 # 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 # it under the terms of the GNU General Public License as published by
@ -677,6 +677,11 @@ class ListChildren(SpecialNodeView):
macroName = 'listchildren' macroName = 'listchildren'
class ListSubobjects(SpecialNodeView):
macroName = 'listsubobjects'
class ConfigureView(NodeView): class ConfigureView(NodeView):
""" An editing view for configuring a node, optionally creating """ An editing view for configuring a node, optionally creating
a target object. a target object.

View file

@ -166,12 +166,47 @@
<a href="#" <a href="#"
tal:attributes="href string:${view/url}/.${related/uniqueId}; tal:attributes="href string:${view/url}/.${related/uniqueId};
title related/description" title related/description"
tal:content="related/title">Resource Title</a> tal:content="related/title">Concept Title</a>
</div> </div>
</div> </div>
</metal:children> </metal:children>
<metal:subobjects define-macro="listsubobjects"
tal:define="target nocall:item/targetObjectView">
<div class="content-1"
tal:content="structure item/body"
tal:attributes="ondblclick python:
target and target.openEditWindow('configure.html')
or item.openEditWindow();
id string:${view/itemNum}.body;">
Listing
</div>
<div tal:condition="nocall:target">
<div tal:attributes="ondblclick python: target.openEditWindow('configure.html')"
tal:define="children python:list(target.children())"
tal:condition="children">
<h3 i18n:translate="">Children</h3>
<div tal:repeat="related children">
<a tal:attributes="href python:view.getUrlForTarget(related);
title related/description"
tal:content="related/title">Concept Title</a>
</div>
</div>
<div tal:attributes="ondblclick python: target.openEditWindow('resources.html')"
tal:define="resources python:list(target.resources())"
tal:condition="resources">
<h3 i18n:translate="">Resources</h3>
<div tal:repeat="related resources">
<a tal:attributes="href python:view.getUrlForTarget(related);
title related/description"
tal:content="related/title">Resource Title</a>
</div>
</div>
</div>
</metal:subobjects>
<!-- menu --> <!-- menu -->
<metal:menu define-macro="menu" <metal:menu define-macro="menu"