more clean-up of resource types - old MediaAsset objects are now mapped to Resource objects with resourceType 'file'

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1291 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2006-08-07 16:21:33 +00:00
parent e860cf5a07
commit acc878a63d
6 changed files with 54 additions and 59 deletions

View file

@ -8,7 +8,7 @@ The loops platform is built up of three parts:
(1) concepts: simple interconnected objects usually representing
meta-information
(2) resources: (possibly large) atomic objects like documents and media assets
(2) resources: (possibly large) atomic objects like documents and files
(3) views: objects (usually hierarchically organized nodes) providing
access to and presenting concepts or resources
@ -31,8 +31,7 @@ Let's start with creating a few example concepts, putting them in a
top-level loops container and a concept manager:
>>> from loops import Loops
>>> site['loops'] = Loops()
>>> loopsRoot = site['loops']
>>> loopsRoot = site['loops'] = Loops()
>>> from loops.concept import ConceptManager, Concept
>>> loopsRoot['concepts'] = ConceptManager()
@ -230,11 +229,11 @@ Index attributes adapter
Resources and what they have to do with Concepts
================================================
>>> from loops.interfaces import IResource, IDocument, IMediaAsset
>>> from loops.interfaces import IResource, IDocument
We first need a resource manager:
>>> from loops.resource import ResourceManager
>>> from loops.resource import ResourceManager, Resource
>>> loopsRoot['resources'] = ResourceManager()
>>> resources = loopsRoot['resources']
@ -251,11 +250,11 @@ A common type of resource is a document:
>>> doc1.contentType
u''
Another one is a media asset:
We can also directly use Resource objects; these behave like files.
In fact, by using resource types we can explicitly assign a resource
the 'file' type, but we will use this feature later:
>>> from loops.interfaces import IMediaAsset
>>> from loops.resource import MediaAsset
>>> img = MediaAsset(u'A png Image')
>>> img = Resource(u'A png Image')
For testing we use some simple files from the tests directory:
@ -270,7 +269,7 @@ For testing we use some simple files from the tests directory:
>>> img.contentType
'image/png'
>>> pdf = MediaAsset(u'A pdf File')
>>> pdf = Resource(u'A pdf File')
>>> pdf.data = open(os.path.join(path, 'test.pdf')).read()
>>> pdf.getSize()
25862
@ -499,8 +498,7 @@ view; these views we have to provide as multi-adapters:
>>> sorted((t.token, t.title) for t in view.targetTypes())
[('.loops/concepts/topic', u'Topic'), ('.loops/concepts/type', u'Type'),
('.loops/concepts/unknown', u'Unknown Type'),
('loops.resource.Document', u'Document'),
('loops.resource.MediaAsset', u'Media Asset')]
('loops.resource.Document', u'Document')]
>>> view.update()
True
>>> sorted(resources.keys())

View file

@ -188,7 +188,9 @@
<require
permission="zope.View"
interface=".interfaces.IBaseResource" />
interface=".interfaces.IBaseResource
zope.app.size.interfaces.ISized" />
<require
permission="zope.ManageContent"
@ -289,8 +291,8 @@
<adapter factory="loops.type.ConceptType" />
<adapter factory="loops.type.ResourceType"
for="loops.interfaces.IDocument" />
<adapter factory="loops.type.ResourceType"
for="loops.interfaces.IMediaAsset" />
<!--<adapter factory="loops.type.ResourceType"
for="loops.interfaces.IMediaAsset" />-->
<adapter factory="loops.type.LoopsTypeManager" />
<adapter factory="loops.type.TypeConcept" trusted="True" />

View file

@ -12,7 +12,7 @@ Let's first do some basic imports
>>> from zope.app.testing.setup import placefulSetUp, placefulTearDown
>>> site = placefulSetUp(True)
>>> from zope import interface, component
>>> from zope.app import zapi
>>> from zope.app.tests import ztapi
@ -25,7 +25,7 @@ and provide a relation registry:
>>> from cybertools.relation.registry import DummyRelationRegistry
>>> from zope.app.testing import ztapi
>>> ztapi.provideUtility(IRelationRegistry, DummyRelationRegistry())
and care for some type adapter machinery:
>>> from loops.interfaces import IConcept
@ -35,7 +35,7 @@ and care for some type adapter machinery:
Now we can setup a simple loops site with its manager objects, using a
loops setup manager:
>>> from loops import Loops
>>> loopsRoot = site['loops'] = Loops()
@ -46,7 +46,7 @@ loops setup manager:
u'has Type'
We also add some example concepts,
>>> from loops.concept import Concept
>>> cc1 = Concept(u'Zope')
>>> concepts['cc1'] = cc1
@ -59,21 +59,21 @@ We also add some example concepts,
u'Zope 3'
resources,
>>> from loops.resource import Resource
>>> file1 = resources['file1'] = Resource(u'A file')
>>> file1.resourceType = concepts['file']
(the use of Document and MediaAsset may get deprecated soon:)
(the use of Document may get deprecated soon:)
>>> from loops.resource import Document, MediaAsset
>>> from loops.resource import Document
>>> doc1 = Document(u'Zope Info')
>>> resources['doc1'] = doc1
>>> doc1.title
u'Zope Info'
>>> img1 = MediaAsset(u'An Image')
>>> resources['img1'] = img1
>>> img1 = resources['img1'] = Resource(u'An Image')
>>> img1.resourceType = concepts['file']
and nodes (in view space):
@ -81,7 +81,7 @@ and nodes (in view space):
>>> m1 = Node(u'Home')
>>> views['m1'] = m1
>>> m1.nodeType = 'menu'
>>> m1p1 = Node(u'Page')
>>> m1['p1'] = m1p1
>>> m1p1.nodeType = 'page'
@ -160,7 +160,7 @@ lazy properties, one should always get a new adapter:
<class 'loops.concept.Concept'>
Now let's have a look at resources.
>>> from loops.interfaces import IResource
>>> from loops.type import LoopsType
>>> component.provideAdapter(LoopsType, (IResource,), IType)
@ -177,12 +177,12 @@ Now let's have a look at resources.
<loops.resource.ResourceManager object ...>
>>> file1_type.factory
<class 'loops.resource.Resource'>
(The use of Document and MediaAsset will be deprecated soon...)
>>> from loops.interfaces import IResource
(The use of Document will be deprecated soon...)
>>> from loops.interfaces import IResource, IDocument
>>> from loops.type import ResourceType
>>> ztapi.provideAdapter(IResource, IType, ResourceType)
>>> ztapi.provideAdapter(IDocument, IType, ResourceType)
>>> doc1_type = IType(doc1)
>>> doc1_type.title
@ -197,10 +197,14 @@ Now let's have a look at resources.
<loops.resource.ResourceManager object ...>
>>> doc1_type.factory
<class 'loops.resource.Document'>
>>> img1_type = IType(img1)
>>> img1_type.token
'.loops/concepts/file'
>>> img1_type.tokenForSearch
'loops:resource:file'
>>> img1_type.title
u'Media Asset'
u'File'
Can we find out somehow which types are available? This is the time to look
for a type manager. This could be a utility; but in the loops package it
@ -217,10 +221,10 @@ get a type manager from all loops objects, always with the same context:
>>> types = typeManager.types
>>> sorted(t.token for t in types)
['.loops/concepts/file', '.loops/concepts/image', '.loops/concepts/predicate',
'.loops/concepts/textdocument', '.loops/concepts/topic',
'.loops/concepts/type',
'loops.resource.Document', 'loops.resource.MediaAsset']
['.loops/concepts/file', '.loops/concepts/image', '.loops/concepts/predicate',
'.loops/concepts/textdocument', '.loops/concepts/topic',
'.loops/concepts/type',
'loops.resource.Document']
>>> typeManager.getType('.loops/concepts/topic') == cc1_type
True
@ -233,9 +237,8 @@ condition:
['.loops/concepts/predicate', '.loops/concepts/topic', '.loops/concepts/type']
>>> types = typeManager.listTypes(exclude=('concept',))
>>> sorted(t.token for t in types)
['.loops/concepts/file', '.loops/concepts/image',
'.loops/concepts/textdocument', 'loops.resource.Document',
'loops.resource.MediaAsset']
['.loops/concepts/file', '.loops/concepts/image',
'.loops/concepts/textdocument', 'loops.resource.Document']
Type-based interfaces and adapters
@ -264,7 +267,7 @@ i.e. the 'topic' concept, via an adapter:
... implements(ITopic)
... def __init__(self, context): pass
>>> component.provideAdapter(Topic, (IConcept,), ITopic)
>>> ITypeConcept(topic).typeInterface = ITopic
>>> cc1.conceptType = topic
@ -308,7 +311,7 @@ the concept...
...but only when the view exists, i.e. there is a class registered as a
view/multi-adapter with this name:
>>> sq_view is sq_baseView
True
@ -368,7 +371,7 @@ browser).
>>> from loops.browser.node import ViewPropertiesConfigurator
>>> component.provideAdapter(ViewPropertiesConfigurator, (INode,),
... IViewConfiguratorSchema)
>>> pageConfigurator = IViewConfiguratorSchema(m1)
>>> pageConfigurator.skinName = 'SuperSkin'

View file

@ -305,21 +305,14 @@ class IDocument(IDocumentSchema, IResource):
"""
class IMediaAssetSchema(IResourceSchema):
# media asset is probably obsolete - replaced by plain Resource with
# resourceType = file.
data = schema.Bytes(
title=_(u'Data'),
description=_(u'Media asset file'),
default='',
missing_value='',
required=False)
class IMediaAssetView(IMediaAssetSchema):
class IMediaAssetView(IResourceSchema):
""" Used for accessing a media asset via a node's target attribute"""
class IMediaAsset(IMediaAssetSchema, IResource, IBaseAsset):
class IMediaAsset(IResourceSchema, IResource, IBaseAsset):
""" A resource containing a (typically binary) file-like content
or an image.
"""

View file

@ -46,7 +46,7 @@ from cybertools.typology.interfaces import ITypeManager
from interfaces import IBaseResource, IResource
from interfaces import IFile
from interfaces import IDocument, IDocumentSchema, IDocumentView
from interfaces import IMediaAsset, IMediaAssetSchema, IMediaAssetView
from interfaces import IMediaAsset, IMediaAssetView
from interfaces import IResourceManager, IResourceManagerContained
from interfaces import ILoopsContained
from interfaces import IIndexAttributes
@ -192,9 +192,6 @@ class FileAdapter(ResourceAdapterBase):
implements(IFile)
# TODO: provide specialized access to data attribute analog to zope.app.file;
# automatically set contentType...
class DocumentWriteFileAdapter(object):

View file

@ -133,7 +133,8 @@ class ResourceType(LoopsType):
#adapts(IResource)
typeTitles = {'MediaAsset': u'Media Asset'}
#typeTitles = {'MediaAsset': u'Media Asset'}
typeTitles = {}
typeInterface = None
qualifiers = ('resource',)
@ -212,7 +213,8 @@ class LoopsTypeManager(TypeManager):
def resourceTypes(self):
return tuple([ResourceTypeInfo(self.context, cls)
for cls in (Document, MediaAsset)])
for cls in (Document,)])
#for cls in (Document, MediaAsset)])
class TypeConcept(AdapterBase):