diff --git a/browser/configure.zcml b/browser/configure.zcml index bf02b92..03533cc 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -125,13 +125,13 @@ permission="zope.ManageContent" /> - + />--> - + />--> - + />--> >> types = typeManager.types - >>> sorted(t.token for t in types) + >>> sorted((t.token) for t in types) ['.loops/concepts/predicate', '.loops/concepts/topic', '.loops/concepts/type', 'loops.resource.Document', 'loops.resource.MediaAsset'] diff --git a/interfaces.py b/interfaces.py index f044a44..ac54a1c 100644 --- a/interfaces.py +++ b/interfaces.py @@ -300,8 +300,8 @@ class IMediaAsset(IMediaAssetSchema, IResource, IBaseAsset): """ A resource containing a (typically binary) file-like content or an image. """ - - + + class IResourceManager(ILoopsObject, IContainer): """ A manager/container for resources. """ @@ -516,6 +516,34 @@ class ITypeConcept(Interface): source="loops.TypeInterfaceSource", required=False) + # viewName = schema.TextLine() + + +class IResourceAdapter(Interface): + """ Base interface for adapters for resources. This is the base interface + of the interfaces to be used as typeInterface attribute on type concepts + specifying resource types. + """ + + +class IFile(IResourceAdapter): + """ A media asset that is not shown on a (web) page like an image but + may be downloaded instead. + """ + + +class IImage(IResourceAdapter): + """ A media asset that may be embedded in a (web) page as an image. + """ + + +class ITextDocument(IResourceAdapter): + """ A resource containing some sort of plain text that may be rendered and + edited without necessarily involving a special external application + (like e.g. OpenOffice); typical content types are text/html, text/xml, + text/restructured, etc. + """ + # view configurator stuff diff --git a/type.py b/type.py index 67cf412..9e2dd69 100644 --- a/type.py +++ b/type.py @@ -31,12 +31,17 @@ from zope import schema from zope.security.proxy import removeSecurityProxy from cybertools.typology.type import BaseType, TypeManager from loops.interfaces import ILoopsObject, IConcept, IResource -from loops.interfaces import ITypeConcept +from loops.interfaces import ITypeConcept, IResourceAdapter, IFile, IImage from loops.concept import Concept -from loops.resource import Document, MediaAsset +from loops.resource import Resource, Document, MediaAsset class LoopsType(BaseType): + + adapts(ILoopsObject) + + factoryMapping = dict(concept=Concept, resource=Resource) + containerMapping = dict(concept='concepts', resource='resources') @Lazy def title(self): @@ -52,55 +57,79 @@ class LoopsType(BaseType): def tokenForSearch(self): tp = self.typeProvider typeName = tp is None and 'unknown' or str(zapi.getName(tp)) - return ':'.join(('loops:concept', typeName,)) + return ':'.join(('loops', self.qualifiers[0], typeName,)) + + @Lazy + def typeInterface(self): + adapter = zapi.queryAdapter(self.typeProvider, ITypeConcept) + if adapter is not None: + return adapter.typeInterface + else: + conceptType = self.typeProvider + typeConcept = self.root.getConceptManager().getTypeConcept() + if conceptType is typeConcept: + return ITypeConcept + return None + + @Lazy + def qualifiers(self): + ti = self.typeInterface + if ti is None or not issubclass(ti, IResourceAdapter): + return ('concept',) + return ('resource',) + + @Lazy + def factory(self): + return self.factoryMapping.get(self.qualifiers[0], Concept) + + @Lazy + def defaultContainer(self): + return self.root[self.containerMapping.get(self.qualifiers[0], 'concept')] @Lazy def root(self): return self.context.getLoopsRoot() - -class ConceptType(LoopsType): - """ The IType adapter for concept objects. - """ - - adapts(IConcept) - - qualifiers = ('concept',) - factory = Concept - @Lazy def typeProvider(self): return self.context.conceptType - @Lazy - def defaultContainer(self): - return self.root.getConceptManager() - @Lazy - def typeInterface(self): - adapter = zapi.queryAdapter(self.typeProvider, ITypeConcept) - if adapter is not None: # always gives TypeConcept - return adapter.typeInterface - else: - conceptType = self.typeProvider - if conceptType is conceptType.getLoopsRoot().getConceptManager().getTypeConcept(): - return ITypeConcept - return None - - -class ConceptTypeInfo(ConceptType): +class LoopsTypeInfo(LoopsType): + """ The type info class used by the type manager for listing types. + """ def __init__(self, typeProvider): self.typeProvider = self.context = typeProvider +class ConceptType(LoopsType): + """ The IType adapter for concept objects. + Probably obsolete because all real stuff has gone to LoopsType. + """ + + adapts(IConcept) + + +class ConceptTypeInfo(LoopsTypeInfo): + """ The type info class used by the type manager for listing types. + Probably obsolete because all real stuff has gone to LoopsTypeInfo. + """ + + class ResourceType(LoopsType): + """ The 'old-style' resource type - different classes (Document, MediaAsset) + per type. Will be replaced by new style types that are governed by + type concepts as is already the case for concepts. + """ adapts(IResource) typeTitles = {'MediaAsset': u'Media Asset'} + typeInterface = None qualifiers = ('resource',) + typeProvider = None @Lazy def title(self): @@ -204,6 +233,7 @@ class TypeInterfaceSourceList(object): implements(schema.interfaces.IIterableSource) + #typeInterfaces = (ITypeConcept, IFile, IImage,) typeInterfaces = (ITypeConcept,) def __init__(self, context):