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-03 07:14:33 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-11-03 07:14:33 (GMT)
commit7c3705542581099b82ca3acb9ae6e75db99bdeac (patch)
treec1075ca0619aded4e9d699a3ea1a5ea9738da1fc
parentf3e8a492277ca660331d5183a3faccb4a7c9143d (diff)
Return defualt values for missed, in storage, properties; it is useful while migration after chaning db scheme
-rw-r--r--active_document/volume.py13
-rwxr-xr-xtests/units/volume.py33
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):