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">
|
||||
<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> </p>
|
||||
<p>
|
||||
<span class="button">
|
||||
<a href="#"
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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.
|
||||
"""
|
||||
|
|
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.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.
|
||||
|
|
|
@ -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)
|
||||
|
|
6
type.py
6
type.py
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue