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
	
	 helmutm
						helmutm