add resource type AddressableExternalFile

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3203 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2009-02-04 14:36:23 +00:00
parent 6f8e716923
commit b3962aba0e
6 changed files with 62 additions and 17 deletions

View file

@ -42,11 +42,11 @@
<metal:block define-macro="image">
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
<div metal:use-macro="views/node_macros/object_actions" />
<h3 tal:content="item/title">Title</h3><br />
<h1 tal:content="item/title">Title</h1><br />
<img src="#"
tal:attributes="src
string:${view/url}/.target${view/targetId}/view?version=this" />
<p><i tal:content="item/description">Description</i></p>
<p><i tal:content="structure item/renderedDescription">Description</i></p>
<metal:fields use-macro="view/comment_macros/comments" />
</div>
</metal:block>
@ -55,8 +55,8 @@
<metal:block define-macro="download">
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
<div metal:use-macro="views/node_macros/object_actions" />
<h3 tal:content="item/title">Title</h3>
<p><i tal:content="item/description">Description</i></p>
<h1 tal:content="item/title">Title</h1>
<p><i tal:content="structure item/renderedDescription">Description</i>&nbsp;</p>
<p>
<span class="button">
<a href="#"

View file

@ -300,6 +300,15 @@
set_schema="loops.interfaces.IExternalFile" />
</class>
<adapter factory="loops.resource.AddressableExternalFileAdapter" trusted="True"
provides="loops.interfaces.IAddressableExternalFile" />
<class class="loops.resource.AddressableExternalFileAdapter">
<require permission="zope.View"
interface="loops.interfaces.IAddressableExternalFile" />
<require permission="zope.ManageContent"
set_schema="loops.interfaces.IAddressableExternalFile" />
</class>
<adapter factory="loops.resource.TextDocumentAdapter" trusted="True"
provides="loops.interfaces.ITextDocument" />
<class class="loops.resource.TextDocumentAdapter">
@ -353,6 +362,8 @@
<adapter factory="loops.schema.factory.ResourceSchemaFactory"
for="loops.interfaces.IResource" />
<adapter factory="loops.schema.factory.FileSchemaFactory" />
<adapter factory="loops.schema.factory.AddressableFileSchemaFactory"
for="loops.interfaces.IAddressableExternalFile" />
<adapter factory="loops.schema.factory.NoteSchemaFactory" />
<adapter factory="loops.setup.SetupManager" />

View file

@ -752,7 +752,6 @@ class IStorageInfo(Interface):
class IExternalFile(IFile):
#class IExternalFile(IFile, IStorageInfo):
""" A file whose content (data attribute) is not stored in the ZODB
but somewhere else, typically in the file system.
"""
@ -764,18 +763,26 @@ class IExternalFile(IFile):
missing_value='',
required=False)
#externalAddress = schema.BytesLine(
# title=_(u'External Address'),
# description=_(u'The full address for accessing the object '
# 'on the external storage, e.g. a filename or path.'),
# default='',
# missing_value='',
# required=False)
externalAddress = Attribute('The full address for accessing the object '
'on the external storage, e.g. a filename or path.')
class IAddressableExternalFile(IExternalFile):
""" A file whose content (data attribute) is not stored in the ZODB
but somewhere else, typically in the file system; the data won't
be provided by uploading a file but by explicitly specifying
the address of the file.
"""
externalAddress = schema.BytesLine(
title=_(u'External Address'),
description=_(u'The full address for accessing the object '
'on the external storage, e.g. a filename or path.'),
default='',
missing_value='',
required=False)
class IImage(IResourceAdapter):
""" A media asset that may be embedded in a (web) page as an image.
"""

View file

@ -30,6 +30,7 @@ from zope.app.container.btree import BTreeContainer
from zope.app.container.contained import Contained
from zope.app.file.image import Image
from zope.app.security.interfaces import IAuthentication
from zope.contenttype import guess_content_type
from zope.filerepresentation.interfaces import IReadFile, IWriteFile
from zope.cachedescriptors.property import Lazy
from zope.component import adapts
@ -53,7 +54,7 @@ from loops.base import ParentInfo
from loops.common import ResourceAdapterBase, adapted
from loops.concept import ResourceRelation
from loops.interfaces import IBaseResource, IResource
from loops.interfaces import IFile, IExternalFile, INote
from loops.interfaces import IFile, IExternalFile, IAddressableExternalFile, INote
from loops.interfaces import IDocument, ITextDocument, IDocumentSchema, IDocumentView
from loops.interfaces import IMediaAsset, IMediaAssetView
from loops.interfaces import IResourceManager, IResourceManagerContained
@ -387,6 +388,19 @@ class ExternalFileAdapter(FileAdapter):
data = property(getData, setData)
class AddressableExternalFileAdapter(ExternalFileAdapter):
implements(IAddressableExternalFile)
def setExternalAddress(self, addr):
super(AddressableExternalFileAdapter, self).setExternalAddress(addr)
contentType = guess_content_type(self.externalAddress, self.data[:100])
if contentType:
self.contentType = contentType[0]
externalAddress = property(ExternalFileAdapter.getExternalAddress,
setExternalAddress)
class DocumentAdapter(ResourceAdapterBase):
""" Common base class for all resource types with a text-like
data attribute.

View file

@ -25,7 +25,7 @@ $Id$
from zope.component import adapts
from cybertools.composer.schema.factory import SchemaFactory
from loops.interfaces import IResourceAdapter, IFile, INote
from loops.interfaces import IResourceAdapter, IFile, INote, IAddressableExternalFile
class ResourceSchemaFactory(SchemaFactory):
@ -54,6 +54,17 @@ class FileSchemaFactory(SchemaFactory):
return schema
class AddressableFileSchemaFactory(SchemaFactory):
adapts(IAddressableExternalFile)
def __call__(self, interface, **kw):
schema = super(AddressableFileSchemaFactory, self).__call__(interface, **kw)
schema.fields.remove('data')
#schema.fields.remove('contentType')
return schema
class NoteSchemaFactory(SchemaFactory):
adapts(INote)

View file

@ -34,7 +34,8 @@ from cybertools.typology.type import BaseType, TypeManager
from cybertools.typology.interfaces import ITypeManager
from loops.interfaces import ILoopsObject, IConcept, IResource
from loops.interfaces import ITypeConcept
from loops.interfaces import IResourceAdapter, IFile, IExternalFile, IImage
from loops.interfaces import IResourceAdapter, IFile, IExternalFile, \
IAddressableExternalFile, IImage
from loops.interfaces import ITextDocument, INote
from loops.concept import Concept
from loops.resource import Resource, Document, MediaAsset
@ -272,7 +273,8 @@ class TypeInterfaceSourceList(object):
implements(schema.interfaces.IIterableSource)
typeInterfaces = (ITypeConcept, IFile, IExternalFile, ITextDocument, INote)
typeInterfaces = (ITypeConcept, IFile, IExternalFile, IAddressableExternalFile,
ITextDocument, INote)
def __init__(self, context):
self.context = context