- provide additional metaInfo field, e.g. for storing source and rights
information for media assets; show this in info popup; link image to info popup in Lobo skin standard views - Lobo listings: allow for restriction of children listed to certain types
This commit is contained in:
parent
3a30efffe3
commit
7223b08b5a
12 changed files with 87 additions and 20 deletions
|
@ -6,6 +6,10 @@ $Id$
|
||||||
1.1
|
1.1
|
||||||
---
|
---
|
||||||
|
|
||||||
|
- provide additional ``metaInfo`` field, e.g. for storing source and rights
|
||||||
|
information for media assets; show this in info popup;
|
||||||
|
link image to info popup in Lobo skin standard views
|
||||||
|
- Lobo listings: allow for restriction of children listed to certain types
|
||||||
- media assets: allow for access restriction for viewing larger than a
|
- media assets: allow for access restriction for viewing larger than a
|
||||||
given maximum size (via option ``media.unauthorized_max_size``)
|
given maximum size (via option ``media.unauthorized_max_size``)
|
||||||
- external editor functionality: include title field in data in order to
|
- external editor functionality: include title field in data in order to
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<tr tal:repeat="info item/additionalInfos">
|
<tr tal:repeat="info item/additionalInfos">
|
||||||
<td><span i18n:translate=""
|
<td><span i18n:translate=""
|
||||||
tal:content="info/label">Creators</span>:</td>
|
tal:content="info/label">Creators</span>:</td>
|
||||||
<td tal:content="info/value"></td>
|
<td tal:content="structure info/value"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2"><br />
|
<td colspan="2"><br />
|
||||||
|
|
|
@ -48,7 +48,8 @@
|
||||||
<metal:block define-macro="header1">
|
<metal:block define-macro="header1">
|
||||||
<div tal:define="cell part/getView">
|
<div tal:define="cell part/getView">
|
||||||
<metal:headline use-macro="item/macros/headline" />
|
<metal:headline use-macro="item/macros/headline" />
|
||||||
<div tal:attributes="class python:part.cssClass[0]">
|
<div tal:define="showImageLink python:True"
|
||||||
|
tal:attributes="class python:part.cssClass[0]">
|
||||||
<metal:image use-macro="item/macros/image" />
|
<metal:image use-macro="item/macros/image" />
|
||||||
</div>
|
</div>
|
||||||
<div tal:attributes="class python:part.cssClass[1]">
|
<div tal:attributes="class python:part.cssClass[1]">
|
||||||
|
@ -65,7 +66,8 @@
|
||||||
|
|
||||||
|
|
||||||
<metal:block define-macro="header2">
|
<metal:block define-macro="header2">
|
||||||
<div tal:define="cell part/getView">
|
<div tal:define="cell part/getView;
|
||||||
|
showImageLink python:True">
|
||||||
<metal:headline use-macro="item/macros/headline" />
|
<metal:headline use-macro="item/macros/headline" />
|
||||||
<metal:image use-macro="item/macros/image" />
|
<metal:image use-macro="item/macros/image" />
|
||||||
<metal:text use-macro="item/macros/text" />
|
<metal:text use-macro="item/macros/text" />
|
||||||
|
@ -76,9 +78,18 @@
|
||||||
<!-- basic component macros -->
|
<!-- basic component macros -->
|
||||||
|
|
||||||
<metal:image define-macro="image">
|
<metal:image define-macro="image">
|
||||||
<img tal:condition="cell/img"
|
<tal:img condition="cell/img">
|
||||||
tal:attributes="src cell/img/src;
|
<a title="Information about this object."
|
||||||
class cell/img/cssClass" />
|
tal:omit-tag="not:showImageLink|python:False"
|
||||||
|
i18n:attributes="title"
|
||||||
|
tal:define="url string:${cell/img/url}/object_info.html"
|
||||||
|
tal:attributes="href url;
|
||||||
|
onclick string:objectDialog('', '$url?dialog=');; return false">
|
||||||
|
<img tal:condition="cell/img"
|
||||||
|
tal:attributes="src cell/img/src;
|
||||||
|
class cell/img/cssClass" />
|
||||||
|
</a>
|
||||||
|
</tal:img>
|
||||||
</metal:image>
|
</metal:image>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,11 @@ class Base(BaseConceptView):
|
||||||
def macro(self):
|
def macro(self):
|
||||||
return self.macros[self.macroName]
|
return self.macros[self.macroName]
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def params(self):
|
||||||
|
ann = self.request.annotations.get('loops.view', {})
|
||||||
|
return parse_qs(ann.get('params') or '')
|
||||||
|
|
||||||
|
|
||||||
class ConceptView(BaseConceptView):
|
class ConceptView(BaseConceptView):
|
||||||
|
|
||||||
|
@ -106,10 +111,10 @@ class ConceptView(BaseConceptView):
|
||||||
@Lazy
|
@Lazy
|
||||||
def img(self):
|
def img(self):
|
||||||
for r in self.resources['images']:
|
for r in self.resources['images']:
|
||||||
src = ('%s/mediaasset.html?v=%s' %
|
url = self.nodeView.getUrlForTarget(r)
|
||||||
(self.nodeView.getUrlForTarget(r),
|
src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize))
|
||||||
self.parentView.imageSize))
|
return dict(src=src, url=url,
|
||||||
return dict(src=src, cssClass=self.parentView.imageCssClass)
|
cssClass=self.parentView.imageCssClass)
|
||||||
|
|
||||||
|
|
||||||
class ConceptRelationView(BaseConceptRelationView, ConceptView):
|
class ConceptRelationView(BaseConceptRelationView, ConceptView):
|
||||||
|
@ -127,9 +132,7 @@ class Layout(Base):
|
||||||
|
|
||||||
def getParts(self):
|
def getParts(self):
|
||||||
result = []
|
result = []
|
||||||
ann = self.request.annotations.get('loops.view', {})
|
parts = (self.params.get('parts') or ['h1,g3'])[0].split(',')
|
||||||
params = parse_qs(ann.get('params') or '')
|
|
||||||
parts = (params.get('parts') or ['h1,g3'])[0].split(',')
|
|
||||||
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),
|
||||||
|
@ -147,9 +150,14 @@ class BasePart(Base):
|
||||||
gridPattern = []
|
gridPattern = []
|
||||||
|
|
||||||
def getChildren(self):
|
def getChildren(self):
|
||||||
|
subtypeNames = (self.params.get('subtypes') or [''])[0].split(',')
|
||||||
|
subtypes = [self.conceptManager[st] for st in subtypeNames if st]
|
||||||
result = []
|
result = []
|
||||||
for idx, r in enumerate(
|
childRels = self.context.getChildRelations([self.defaultPredicate])
|
||||||
self.context.getChildRelations([self.defaultPredicate])):
|
if subtypes:
|
||||||
|
childRels = [r for r in childRels
|
||||||
|
if r.second.conceptType in subtypes]
|
||||||
|
for idx, r in enumerate(childRels):
|
||||||
result.append(ConceptRelationView(r, self.request,
|
result.append(ConceptRelationView(r, self.request,
|
||||||
contextIsSecond=True, parent=self, idx=idx))
|
contextIsSecond=True, parent=self, idx=idx))
|
||||||
return result
|
return result
|
||||||
|
|
|
@ -107,6 +107,8 @@ class Concept(Contained, Persistent):
|
||||||
|
|
||||||
workspaceInformation = None
|
workspaceInformation = None
|
||||||
|
|
||||||
|
metaInfo = u''
|
||||||
|
|
||||||
def __init__(self, title=u''):
|
def __init__(self, title=u''):
|
||||||
self.title = title
|
self.title = title
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
@ -90,6 +90,9 @@ class IConceptSchema(Interface):
|
||||||
missing_value=u'',
|
missing_value=u'',
|
||||||
required=False)
|
required=False)
|
||||||
|
|
||||||
|
metaInfo = Attribute('Optional additional information about the concept '
|
||||||
|
'provided as text.')
|
||||||
|
|
||||||
# let these fields always appear on top:
|
# let these fields always appear on top:
|
||||||
IConceptSchema['title'].order = 1
|
IConceptSchema['title'].order = 1
|
||||||
IConceptSchema['description'].order = 2
|
IConceptSchema['description'].order = 2
|
||||||
|
@ -291,6 +294,9 @@ class IBaseResource(ILoopsObject):
|
||||||
missing_value='',
|
missing_value='',
|
||||||
required=False)
|
required=False)
|
||||||
|
|
||||||
|
metaInfo = Attribute('Optional additional information about the resource '
|
||||||
|
'provided as text.')
|
||||||
|
|
||||||
def getType():
|
def getType():
|
||||||
""" Return a concept that provides the object's type, i.e. the
|
""" Return a concept that provides the object's type, i.e. the
|
||||||
resourceType attribute.
|
resourceType attribute.
|
||||||
|
@ -361,6 +367,9 @@ class IResourceSchema(Interface):
|
||||||
missing_value='',
|
missing_value='',
|
||||||
required=False)
|
required=False)
|
||||||
|
|
||||||
|
metaInfo = Attribute('Optional additional information about the resource '
|
||||||
|
'provided as text.')
|
||||||
|
|
||||||
|
|
||||||
class IResource(ILoopsObject, IPotentialTarget):
|
class IResource(ILoopsObject, IPotentialTarget):
|
||||||
""" A resource is an atomic information element that is made
|
""" A resource is an atomic information element that is made
|
||||||
|
@ -404,7 +413,7 @@ class IDocument(IDocumentSchema, IResource):
|
||||||
|
|
||||||
|
|
||||||
# media asset is obsolete - replaced by plain Resource with
|
# media asset is obsolete - replaced by plain Resource with
|
||||||
# resourceType = file.
|
# resourceType = file or the new media asset stuff in loops.media.
|
||||||
|
|
||||||
class IMediaAssetView(IResourceSchema):
|
class IMediaAssetView(IResourceSchema):
|
||||||
""" Used for accessing a media asset via a node's target attribute"""
|
""" Used for accessing a media asset via a node's target attribute"""
|
||||||
|
|
Binary file not shown.
|
@ -3,7 +3,7 @@ msgstr ""
|
||||||
|
|
||||||
"Project-Id-Version: $Id$\n"
|
"Project-Id-Version: $Id$\n"
|
||||||
"POT-Creation-Date: 2007-05-22 12:00 CET\n"
|
"POT-Creation-Date: 2007-05-22 12:00 CET\n"
|
||||||
"PO-Revision-Date: 2011-04-30 12:00 CET\n"
|
"PO-Revision-Date: 2011-08-21 12:00 CET\n"
|
||||||
"Last-Translator: Helmut Merz <helmutm@cy55.de>\n"
|
"Last-Translator: Helmut Merz <helmutm@cy55.de>\n"
|
||||||
"Language-Team: loops developers <helmutm@cy55.de>\n"
|
"Language-Team: loops developers <helmutm@cy55.de>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
|
@ -233,6 +233,9 @@ msgstr "Aktionen"
|
||||||
msgid "Print this page"
|
msgid "Print this page"
|
||||||
msgstr "Diese Seite ausdrucken"
|
msgstr "Diese Seite ausdrucken"
|
||||||
|
|
||||||
|
msgid "Object Information"
|
||||||
|
msgstr "Informationen über dieses Objekt"
|
||||||
|
|
||||||
msgid "Information about this object."
|
msgid "Information about this object."
|
||||||
msgstr "Informationen über dieses Objekt."
|
msgstr "Informationen über dieses Objekt."
|
||||||
|
|
||||||
|
@ -245,6 +248,9 @@ msgstr "Mit 'External Editor' bearbeiten."
|
||||||
msgid "Type"
|
msgid "Type"
|
||||||
msgstr "Typ"
|
msgstr "Typ"
|
||||||
|
|
||||||
|
msgid "modified"
|
||||||
|
msgstr "Änderungsdatum"
|
||||||
|
|
||||||
msgid "Modification Date"
|
msgid "Modification Date"
|
||||||
msgstr "Änderungsdatum"
|
msgstr "Änderungsdatum"
|
||||||
|
|
||||||
|
@ -254,6 +260,12 @@ msgstr "Größe"
|
||||||
msgid "Author(s)"
|
msgid "Author(s)"
|
||||||
msgstr "Autor(en)"
|
msgstr "Autor(en)"
|
||||||
|
|
||||||
|
msgid "Creators"
|
||||||
|
msgstr "Bearbeiter"
|
||||||
|
|
||||||
|
msgid "Meta Information"
|
||||||
|
msgstr "Meta-Informationen"
|
||||||
|
|
||||||
msgid "Parents"
|
msgid "Parents"
|
||||||
msgstr "Oberbegriffe"
|
msgstr "Oberbegriffe"
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,7 @@ class MediaAsset(MediaAssetFile, ExternalFileAdapter):
|
||||||
implements(IMediaAsset)
|
implements(IMediaAsset)
|
||||||
|
|
||||||
_adapterAttributes = ExternalFileAdapter._adapterAttributes + ('modified',)
|
_adapterAttributes = ExternalFileAdapter._adapterAttributes + ('modified',)
|
||||||
|
_contextAttributes = list(IMediaAsset)
|
||||||
|
|
||||||
isMediaAsset = True
|
isMediaAsset = True
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ from zope.security.interfaces import Unauthorized
|
||||||
from loops.browser.node import NodeView
|
from loops.browser.node import NodeView
|
||||||
from loops.browser.resource import ResourceView, resource_macros
|
from loops.browser.resource import ResourceView, resource_macros
|
||||||
from loops.common import adapted
|
from loops.common import adapted
|
||||||
|
from loops.util import _
|
||||||
from loops import util
|
from loops import util
|
||||||
|
|
||||||
template = ViewPageTemplateFile('asset.pt')
|
template = ViewPageTemplateFile('asset.pt')
|
||||||
|
@ -81,6 +82,14 @@ class MediaAssetView(ResourceView):
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def additionalInfos(self):
|
||||||
|
mi = self.adapted.metaInfo
|
||||||
|
if not mi:
|
||||||
|
return []
|
||||||
|
return [dict(label=_(u'Meta Information'),
|
||||||
|
value=self.renderDescription(mi))]
|
||||||
|
|
||||||
|
|
||||||
class MediaAssetNodeView(NodeView):
|
class MediaAssetNodeView(NodeView):
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2008 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
|
||||||
|
@ -22,11 +22,20 @@ Media asset management interface definitions.
|
||||||
$Id$
|
$Id$
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from zope import schema
|
||||||
|
|
||||||
from cybertools.media.interfaces import IMediaAsset
|
from cybertools.media.interfaces import IMediaAsset
|
||||||
from loops.interfaces import IExternalFile
|
from loops.interfaces import IExternalFile
|
||||||
|
from loops.util import _
|
||||||
|
|
||||||
|
|
||||||
class IMediaAsset(IMediaAsset, IExternalFile):
|
class IMediaAsset(IMediaAsset, IExternalFile):
|
||||||
|
|
||||||
pass
|
metaInfo = schema.Text(
|
||||||
|
title=_(u'Meta Information'),
|
||||||
|
description=_(u'A text giving some background information '
|
||||||
|
u'about a media asset, like source, rights, etc.'),
|
||||||
|
default=u'',
|
||||||
|
missing_value=u'',
|
||||||
|
required=False)
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,8 @@ class Resource(Image, Contained):
|
||||||
|
|
||||||
storageName = None
|
storageName = None
|
||||||
|
|
||||||
|
metaInfo = u''
|
||||||
|
|
||||||
_size = _width = _height = 0
|
_size = _width = _height = 0
|
||||||
|
|
||||||
def __init__(self, title=u''):
|
def __init__(self, title=u''):
|
||||||
|
|
Loading…
Add table
Reference in a new issue