Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2012-11-14 11:30:21 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-11-14 11:30:24 (GMT)
commit35cf4bac15cfbf7b2a1354dd8f45269d41b84ac3 (patch)
treeb8a3f6dc7f12e2f7ea6ed7bc068452b108557661
parent7c3705542581099b82ca3acb9ae6e75db99bdeac (diff)
Save MIME type while PUTing blobs
-rw-r--r--active_document/commands.py7
-rw-r--r--active_document/directory.py7
-rw-r--r--active_document/volume.py3
-rwxr-xr-xtests/units/volume.py22
4 files changed, 34 insertions, 5 deletions
diff --git a/active_document/commands.py b/active_document/commands.py
index 185eb6f..58cb53f 100644
--- a/active_document/commands.py
+++ b/active_document/commands.py
@@ -16,6 +16,7 @@
import logging
from active_document import env
+from active_document.metadata import PropertyMeta
from active_toolkit import enforce
@@ -88,6 +89,7 @@ class Request(dict):
content = None
content_stream = None
content_length = None
+ content_type = None
access_level = env.ACCESS_REMOTE
accept_language = None
commands = None
@@ -226,7 +228,10 @@ class CommandsProcessor(object):
response=response)
if not response.content_type:
- response.content_type = cmd.mime_type
+ if isinstance(result, PropertyMeta):
+ response.content_type = result.get('mime_type')
+ if not response.content_type:
+ response.content_type = cmd.mime_type
return result
diff --git a/active_document/directory.py b/active_document/directory.py
index a298278..b2306a0 100644
--- a/active_document/directory.py
+++ b/active_document/directory.py
@@ -189,7 +189,8 @@ class Directory(object):
return iterate(), mset.get_matches_estimated()
- def set_blob(self, guid, prop, data=None, size=None, **kwargs):
+ def set_blob(self, guid, prop, data=None, size=None, mime_type=None,
+ **kwargs):
"""Receive BLOB property.
This function works in parallel to setting non-BLOB properties values
@@ -210,8 +211,10 @@ class Directory(object):
_logger.debug('Received %r BLOB property from %s[%s]',
prop.name, self.metadata.name, guid)
+ if not mime_type:
+ mime_type = prop.mime_type
record.set_blob(prop.name, data, size, seqno=seqno,
- mime_type=prop.mime_type, **kwargs)
+ mime_type=mime_type, **kwargs)
if record.consistent:
self._post(guid, {'seqno': seqno}, False)
diff --git a/active_document/volume.py b/active_document/volume.py
index 96aa6ec..c9fa81d 100644
--- a/active_document/volume.py
+++ b/active_document/volume.py
@@ -264,7 +264,8 @@ class VolumeCommands(CommandsProcessor):
yield directory, doc
for name, value in blobs:
- directory.set_blob(doc.guid, name, value)
+ directory.set_blob(doc.guid, name, value,
+ mime_type=request.content_type)
def _preget(self, request):
metadata = self.volume[request['document']].metadata
diff --git a/tests/units/volume.py b/tests/units/volume.py
index f95aa80..a1b4021 100755
--- a/tests/units/volume.py
+++ b/tests/units/volume.py
@@ -152,6 +152,25 @@ class VolumeTest(tests.Test):
self.call('PUT', document='testdocument', guid=guid, prop='blob', content=None)
self.assertRaises(NotFound, self.call, 'GET', document='testdocument', guid=guid, prop='blob')
+ def test_SetBLOBsWithMimeType(self):
+
+ class TestDocument(Document):
+
+ @active_property(BlobProperty, mime_type='default')
+ def blob(self, value):
+ return value
+
+ self.volume = SingleVolume(tests.tmpdir, [TestDocument])
+ guid = self.call('POST', document='testdocument', content={})
+
+ self.call('PUT', document='testdocument', guid=guid, prop='blob', content='blob1')
+ self.assertEqual('default', self.call('GET', document='testdocument', guid=guid, prop='blob')['mime_type'])
+ self.assertEqual('default', self.response.content_type)
+
+ self.call('PUT', document='testdocument', guid=guid, prop='blob', content='blob1', content_type='foo')
+ self.assertEqual('foo', self.call('GET', document='testdocument', guid=guid, prop='blob')['mime_type'])
+ self.assertEqual('foo', self.response.content_type)
+
def test_GetBLOBs(self):
class TestDocument(Document):
@@ -920,7 +939,7 @@ class VolumeTest(tests.Test):
def call(self, method, document=None, guid=None, prop=None,
accept_language=None, content=None, content_stream=None,
- if_modified_since=None, **kwargs):
+ content_type=None, if_modified_since=None, **kwargs):
class TestRequest(Request):
@@ -930,6 +949,7 @@ class VolumeTest(tests.Test):
request = TestRequest(kwargs)
request.content = content
request.content_stream = content_stream
+ request.content_type = content_type
request.accept_language = accept_language
request.if_modified_since = if_modified_since
request['method'] = method