diff --git a/configure.zcml b/configure.zcml
index a4400f4..44015d2 100644
--- a/configure.zcml
+++ b/configure.zcml
@@ -385,6 +385,12 @@
set_schema="loops.interfaces.INote" />
+
+
+
+
+
diff --git a/resource.py b/resource.py
index feb0ccd..72a7b34 100644
--- a/resource.py
+++ b/resource.py
@@ -32,6 +32,7 @@ from zope.filerepresentation.interfaces import IReadFile, IWriteFile
from zope.cachedescriptors.property import Lazy
from zope.component import adapts
from zope.dublincore.interfaces import IZopeDublinCore
+from zope.filerepresentation.interfaces import IFileFactory
from zope.i18nmessageid import MessageFactory
from zope.interface import implements
from zope.size.interfaces import ISized
@@ -58,7 +59,7 @@ from loops.interfaces import ITypeConcept
from loops.interfaces import ILoopsContained
from loops.interfaces import IIndexAttributes
from loops.concept import ResourceRelation
-from loops.common import ResourceAdapterBase
+from loops.common import ResourceAdapterBase, adapted
from loops.versioning.util import getMaster
from loops.view import TargetRelation
@@ -401,15 +402,15 @@ class DocumentWriteFileAdapter(object):
self.context = context
def write(self, data):
- # TODO: use typeInterface...
- ti = IType(self.context).typeInterface
- context = ti is None and self.context or ti(self.context)
+ #ti = IType(self.context).typeInterface
+ #context = ti is None and self.context or ti(self.context)
+ context = adapted(self.context)
if ITextDocument.providedBy(context) or IDocument.providedBy(context):
context.data = unicode(data.replace('\r', ''), 'UTF-8')
else:
+ # don't decode files or external files even if contentType == 'text/...'
# TODO: make use of tmpfile when using external files
context.data = data
- #ITextDocument(self.context).data = unicode(data.replace('\r', ''), 'UTF-8')
notify(ObjectModifiedEvent(self.context, Attributes(IResource, 'data')))
@@ -421,11 +422,40 @@ class DocumentReadFileAdapter(object):
def __init__(self, context):
self.context = context
+ @Lazy
+ def data(self):
+ return adapted(self.context).data
+
def read(self):
- return self.context.data.encode('UTF-8')
+ data = self.data
+ if type(data) is unicode:
+ return self.data.encode('UTF-8')
+ else:
+ return data
def size(self):
- return len(self.context.data)
+ return len(self.data)
+
+
+class ExternalFileFactory(object):
+
+ implements(IFileFactory)
+ adapts(IResourceManager)
+
+ def __init__(self, context):
+ self.context = removeSecurityProxy(context)
+
+ def __call__(self, name, contentType, data):
+ res = Resource()
+ self.context[name] = res # to be able to set resourceType
+ cm = self.context.getLoopsRoot().getConceptManager()
+ res.resourceType = cm['extfile']
+ obj = adapted(res)
+ obj.contentType = contentType
+ obj.data = data
+ notify(ObjectModifiedEvent(res))
+ del self.context[name] # will be set again by put
+ return res
class IndexAttributes(object):
@@ -492,4 +522,3 @@ class ResourceTypeSourceList(object):
def __len__(self):
return len(self.resourceTypes)
-