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:
parent
6f8e716923
commit
b3962aba0e
6 changed files with 62 additions and 17 deletions
|
@ -42,11 +42,11 @@
|
||||||
<metal:block define-macro="image">
|
<metal:block define-macro="image">
|
||||||
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
|
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
|
||||||
<div metal:use-macro="views/node_macros/object_actions" />
|
<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="#"
|
<img src="#"
|
||||||
tal:attributes="src
|
tal:attributes="src
|
||||||
string:${view/url}/.target${view/targetId}/view?version=this" />
|
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" />
|
<metal:fields use-macro="view/comment_macros/comments" />
|
||||||
</div>
|
</div>
|
||||||
</metal:block>
|
</metal:block>
|
||||||
|
@ -55,8 +55,8 @@
|
||||||
<metal:block define-macro="download">
|
<metal:block define-macro="download">
|
||||||
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
|
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
|
||||||
<div metal:use-macro="views/node_macros/object_actions" />
|
<div metal:use-macro="views/node_macros/object_actions" />
|
||||||
<h3 tal:content="item/title">Title</h3>
|
<h1 tal:content="item/title">Title</h1>
|
||||||
<p><i tal:content="item/description">Description</i></p>
|
<p><i tal:content="structure item/renderedDescription">Description</i> </p>
|
||||||
<p>
|
<p>
|
||||||
<span class="button">
|
<span class="button">
|
||||||
<a href="#"
|
<a href="#"
|
||||||
|
|
|
@ -300,6 +300,15 @@
|
||||||
set_schema="loops.interfaces.IExternalFile" />
|
set_schema="loops.interfaces.IExternalFile" />
|
||||||
</class>
|
</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"
|
<adapter factory="loops.resource.TextDocumentAdapter" trusted="True"
|
||||||
provides="loops.interfaces.ITextDocument" />
|
provides="loops.interfaces.ITextDocument" />
|
||||||
<class class="loops.resource.TextDocumentAdapter">
|
<class class="loops.resource.TextDocumentAdapter">
|
||||||
|
@ -353,6 +362,8 @@
|
||||||
<adapter factory="loops.schema.factory.ResourceSchemaFactory"
|
<adapter factory="loops.schema.factory.ResourceSchemaFactory"
|
||||||
for="loops.interfaces.IResource" />
|
for="loops.interfaces.IResource" />
|
||||||
<adapter factory="loops.schema.factory.FileSchemaFactory" />
|
<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.schema.factory.NoteSchemaFactory" />
|
||||||
|
|
||||||
<adapter factory="loops.setup.SetupManager" />
|
<adapter factory="loops.setup.SetupManager" />
|
||||||
|
|
|
@ -752,7 +752,6 @@ class IStorageInfo(Interface):
|
||||||
|
|
||||||
|
|
||||||
class IExternalFile(IFile):
|
class IExternalFile(IFile):
|
||||||
#class IExternalFile(IFile, IStorageInfo):
|
|
||||||
""" A file whose content (data attribute) is not stored in the ZODB
|
""" A file whose content (data attribute) is not stored in the ZODB
|
||||||
but somewhere else, typically in the file system.
|
but somewhere else, typically in the file system.
|
||||||
"""
|
"""
|
||||||
|
@ -764,18 +763,26 @@ class IExternalFile(IFile):
|
||||||
missing_value='',
|
missing_value='',
|
||||||
required=False)
|
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 '
|
externalAddress = Attribute('The full address for accessing the object '
|
||||||
'on the external storage, e.g. a filename or path.')
|
'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):
|
class IImage(IResourceAdapter):
|
||||||
""" A media asset that may be embedded in a (web) page as an image.
|
""" A media asset that may be embedded in a (web) page as an image.
|
||||||
"""
|
"""
|
||||||
|
|
16
resource.py
16
resource.py
|
@ -30,6 +30,7 @@ from zope.app.container.btree import BTreeContainer
|
||||||
from zope.app.container.contained import Contained
|
from zope.app.container.contained import Contained
|
||||||
from zope.app.file.image import Image
|
from zope.app.file.image import Image
|
||||||
from zope.app.security.interfaces import IAuthentication
|
from zope.app.security.interfaces import IAuthentication
|
||||||
|
from zope.contenttype import guess_content_type
|
||||||
from zope.filerepresentation.interfaces import IReadFile, IWriteFile
|
from zope.filerepresentation.interfaces import IReadFile, IWriteFile
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
|
@ -53,7 +54,7 @@ from loops.base import ParentInfo
|
||||||
from loops.common import ResourceAdapterBase, adapted
|
from loops.common import ResourceAdapterBase, adapted
|
||||||
from loops.concept import ResourceRelation
|
from loops.concept import ResourceRelation
|
||||||
from loops.interfaces import IBaseResource, IResource
|
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 IDocument, ITextDocument, IDocumentSchema, IDocumentView
|
||||||
from loops.interfaces import IMediaAsset, IMediaAssetView
|
from loops.interfaces import IMediaAsset, IMediaAssetView
|
||||||
from loops.interfaces import IResourceManager, IResourceManagerContained
|
from loops.interfaces import IResourceManager, IResourceManagerContained
|
||||||
|
@ -387,6 +388,19 @@ class ExternalFileAdapter(FileAdapter):
|
||||||
data = property(getData, setData)
|
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):
|
class DocumentAdapter(ResourceAdapterBase):
|
||||||
""" Common base class for all resource types with a text-like
|
""" Common base class for all resource types with a text-like
|
||||||
data attribute.
|
data attribute.
|
||||||
|
|
|
@ -25,7 +25,7 @@ $Id$
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
|
|
||||||
from cybertools.composer.schema.factory import SchemaFactory
|
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):
|
class ResourceSchemaFactory(SchemaFactory):
|
||||||
|
@ -54,6 +54,17 @@ class FileSchemaFactory(SchemaFactory):
|
||||||
return schema
|
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):
|
class NoteSchemaFactory(SchemaFactory):
|
||||||
|
|
||||||
adapts(INote)
|
adapts(INote)
|
||||||
|
|
6
type.py
6
type.py
|
@ -34,7 +34,8 @@ from cybertools.typology.type import BaseType, TypeManager
|
||||||
from cybertools.typology.interfaces import ITypeManager
|
from cybertools.typology.interfaces import ITypeManager
|
||||||
from loops.interfaces import ILoopsObject, IConcept, IResource
|
from loops.interfaces import ILoopsObject, IConcept, IResource
|
||||||
from loops.interfaces import ITypeConcept
|
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.interfaces import ITextDocument, INote
|
||||||
from loops.concept import Concept
|
from loops.concept import Concept
|
||||||
from loops.resource import Resource, Document, MediaAsset
|
from loops.resource import Resource, Document, MediaAsset
|
||||||
|
@ -272,7 +273,8 @@ class TypeInterfaceSourceList(object):
|
||||||
|
|
||||||
implements(schema.interfaces.IIterableSource)
|
implements(schema.interfaces.IIterableSource)
|
||||||
|
|
||||||
typeInterfaces = (ITypeConcept, IFile, IExternalFile, ITextDocument, INote)
|
typeInterfaces = (ITypeConcept, IFile, IExternalFile, IAddressableExternalFile,
|
||||||
|
ITextDocument, INote)
|
||||||
|
|
||||||
def __init__(self, context):
|
def __init__(self, context):
|
||||||
self.context = context
|
self.context = context
|
||||||
|
|
Loading…
Add table
Reference in a new issue