fixed same bug for nested List inside MapField, little code refactoring, added test for nested list and nested reference fields
This commit is contained in:
parent
31f7769199
commit
ebaba95eb3
@ -219,11 +219,9 @@ class DeReference(object):
|
|||||||
data[k]._data[field_name] = self.object_map.get(v.id, v)
|
data[k]._data[field_name] = self.object_map.get(v.id, v)
|
||||||
elif isinstance(v, (dict, SON)) and '_ref' in v:
|
elif isinstance(v, (dict, SON)) and '_ref' in v:
|
||||||
data[k]._data[field_name] = self.object_map.get(v['_ref'].id, v)
|
data[k]._data[field_name] = self.object_map.get(v['_ref'].id, v)
|
||||||
elif isinstance(v, dict) and depth <= self.max_depth:
|
elif isinstance(v, (dict, list, tuple)) and depth <= self.max_depth:
|
||||||
item_name = "{0}.{1}.{2}".format(name, k, field_name)
|
item_name = "{0}.{1}.{2}".format(name, k, field_name)
|
||||||
data[k]._data[field_name] = self._attach_objects(v, depth, instance=instance, name=item_name)
|
data[k]._data[field_name] = self._attach_objects(v, depth, instance=instance, name=item_name)
|
||||||
elif isinstance(v, (list, tuple)) and depth <= self.max_depth:
|
|
||||||
data[k]._data[field_name] = self._attach_objects(v, depth, instance=instance, name=name)
|
|
||||||
elif isinstance(v, (dict, list, tuple)) and depth <= self.max_depth:
|
elif isinstance(v, (dict, list, tuple)) and depth <= self.max_depth:
|
||||||
item_name = '%s.%s' % (name, k) if name else name
|
item_name = '%s.%s' % (name, k) if name else name
|
||||||
data[k] = self._attach_objects(v, depth - 1, instance=instance, name=item_name)
|
data[k] = self._attach_objects(v, depth - 1, instance=instance, name=item_name)
|
||||||
|
@ -828,12 +828,17 @@ class DeltaTest(unittest.TestCase):
|
|||||||
self.assertEqual(org2.name, 'New Org 2')
|
self.assertEqual(org2.name, 'New Org 2')
|
||||||
|
|
||||||
def test_delta_for_nested_map_fields(self):
|
def test_delta_for_nested_map_fields(self):
|
||||||
|
class UInfoDocument(Document):
|
||||||
|
phone = StringField()
|
||||||
|
|
||||||
class EmbeddedRole(EmbeddedDocument):
|
class EmbeddedRole(EmbeddedDocument):
|
||||||
type = StringField()
|
type = StringField()
|
||||||
|
|
||||||
class EmbeddedUser(EmbeddedDocument):
|
class EmbeddedUser(EmbeddedDocument):
|
||||||
name = StringField()
|
name = StringField()
|
||||||
roles = MapField(field=EmbeddedDocumentField(EmbeddedRole))
|
roles = MapField(field=EmbeddedDocumentField(EmbeddedRole))
|
||||||
|
rolist = ListField(field=EmbeddedDocumentField(EmbeddedRole))
|
||||||
|
info = ReferenceField(UInfoDocument)
|
||||||
|
|
||||||
class Doc(Document):
|
class Doc(Document):
|
||||||
users = MapField(field=EmbeddedDocumentField(EmbeddedUser))
|
users = MapField(field=EmbeddedDocumentField(EmbeddedUser))
|
||||||
@ -845,11 +850,21 @@ class DeltaTest(unittest.TestCase):
|
|||||||
doc.users["007"] = EmbeddedUser(name="Agent007")
|
doc.users["007"] = EmbeddedUser(name="Agent007")
|
||||||
doc.save()
|
doc.save()
|
||||||
|
|
||||||
|
uinfo = UInfoDocument(phone="79089269066")
|
||||||
|
uinfo.save()
|
||||||
|
|
||||||
d = Doc.objects(num=1).first()
|
d = Doc.objects(num=1).first()
|
||||||
d.users["007"]["roles"]["666"] = EmbeddedRole(type="superadmin")
|
d.users["007"]["roles"]["666"] = EmbeddedRole(type="superadmin")
|
||||||
|
d.users["007"]["rolist"].append(EmbeddedRole(type="oops"))
|
||||||
|
d.users["007"]["info"] = uinfo
|
||||||
delta = d._delta()
|
delta = d._delta()
|
||||||
|
print delta
|
||||||
self.assertEqual(True, "users.007.roles.666" in delta[0])
|
self.assertEqual(True, "users.007.roles.666" in delta[0])
|
||||||
|
self.assertEqual(True, "users.007.rolist" in delta[0])
|
||||||
|
self.assertEqual(True, "users.007.info" in delta[0])
|
||||||
self.assertEqual('superadmin', delta[0]["users.007.roles.666"]["type"])
|
self.assertEqual('superadmin', delta[0]["users.007.roles.666"]["type"])
|
||||||
|
self.assertEqual('oops', delta[0]["users.007.rolist"][0]["type"])
|
||||||
|
self.assertEqual(uinfo.id, delta[0]["users.007.info"])
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user