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:
		| @@ -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() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user