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):