diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2012-11-03 07:14:33 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2012-11-03 07:14:33 (GMT) |
commit | 7c3705542581099b82ca3acb9ae6e75db99bdeac (patch) | |
tree | c1075ca0619aded4e9d699a3ea1a5ea9738da1fc | |
parent | f3e8a492277ca660331d5183a3faccb4a7c9143d (diff) |
Return defualt values for missed, in storage, properties; it is useful while migration after chaning db scheme
-rw-r--r-- | active_document/volume.py | 13 | ||||
-rwxr-xr-x | tests/units/volume.py | 33 |
2 files changed, 43 insertions, 3 deletions
diff --git a/active_document/volume.py b/active_document/volume.py index 5206c66..96aa6ec 100644 --- a/active_document/volume.py +++ b/active_document/volume.py @@ -206,7 +206,10 @@ class VolumeCommands(CommandsProcessor): if isinstance(prop, StoredProperty): value = doc.get(prop.name, request.accept_language or self._lang) - return prop.on_get(doc, value) + value = prop.on_get(doc, value) + if value is None: + value = prop.default + return value else: meta = prop.on_get(doc, doc.meta(prop.name)) enforce(meta is not None and ('path' in meta or 'url' in meta), @@ -277,6 +280,10 @@ class VolumeCommands(CommandsProcessor): lang = request.accept_language or self._lang metadata = doc.metadata doc.request = request - for prop in request['reply']: - result[prop] = metadata[prop].on_get(doc, doc.get(prop, lang)) + for name in request['reply']: + prop = metadata[name] + value = prop.on_get(doc, doc.get(name, lang)) + if value is None: + value = prop.default + result[name] = value return result diff --git a/tests/units/volume.py b/tests/units/volume.py index 42f7603..f95aa80 100755 --- a/tests/units/volume.py +++ b/tests/units/volume.py @@ -885,6 +885,39 @@ class VolumeTest(tests.Test): guid = self.call('POST', document='testdocument', content={}) self.assertEqual(1, self.call('GET', document='testdocument', guid=guid, prop='prop')) + def test_ReturnDefualtsForMissedProps(self): + + class TestDocument(Document): + + @active_property(slot=1, default='default') + def prop(self, value): + return value + + self.volume = SingleVolume(tests.tmpdir, [TestDocument]) + guid = self.call('POST', document='testdocument', content={'prop': 'set'}) + + self.assertEqual( + [{'prop': 'set'}], + self.call('GET', document='testdocument', reply='prop')['result']) + self.assertEqual( + {'prop': 'set'}, + self.call('GET', document='testdocument', guid=guid, reply='prop')) + self.assertEqual( + 'set', + self.call('GET', document='testdocument', guid=guid, prop='prop')) + + os.unlink('testdocument/%s/%s/prop' % (guid[:2], guid)) + + self.assertEqual( + [{'prop': 'default'}], + self.call('GET', document='testdocument', reply='prop')['result']) + self.assertEqual( + {'prop': 'default'}, + self.call('GET', document='testdocument', guid=guid, reply='prop')) + self.assertEqual( + 'default', + self.call('GET', document='testdocument', guid=guid, prop='prop')) + def call(self, method, document=None, guid=None, prop=None, accept_language=None, content=None, content_stream=None, if_modified_since=None, **kwargs): |