diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2012-11-14 11:30:21 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2012-11-14 11:30:24 (GMT) |
commit | 35cf4bac15cfbf7b2a1354dd8f45269d41b84ac3 (patch) | |
tree | b8a3f6dc7f12e2f7ea6ed7bc068452b108557661 | |
parent | 7c3705542581099b82ca3acb9ae6e75db99bdeac (diff) |
Save MIME type while PUTing blobs
-rw-r--r-- | active_document/commands.py | 7 | ||||
-rw-r--r-- | active_document/directory.py | 7 | ||||
-rw-r--r-- | active_document/volume.py | 3 | ||||
-rwxr-xr-x | tests/units/volume.py | 22 |
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 |