Document the attribute of .from_json
This commit is contained in:
		| @@ -404,7 +404,15 @@ class BaseDocument(object): | ||||
|  | ||||
|     @classmethod | ||||
|     def from_json(cls, json_data, created=False): | ||||
|         """Converts json data to an unsaved document instance""" | ||||
|         """Converts json data to a Document instance | ||||
|  | ||||
|         :param json_data: The json data to load into the Document | ||||
|         :param created: If True, the document will be considered as a brand new document | ||||
|                         If False and an id is provided, it will consider that the data being | ||||
|                         loaded corresponds to what's already in the database (This has an impact of subsequent call to .save()) | ||||
|                         If False and no id is provided, it will consider the data as a new document | ||||
|                         (default ``False``) | ||||
|         """ | ||||
|         return cls._from_son(json_util.loads(json_data), created=created) | ||||
|  | ||||
|     def __expand_dynamic_values(self, name, value): | ||||
|   | ||||
| @@ -550,21 +550,14 @@ class InstanceTest(unittest.TestCase): | ||||
|             pass | ||||
|  | ||||
|         f = Foo() | ||||
|         try: | ||||
|         with self.assertRaises(Foo.DoesNotExist): | ||||
|             f.reload() | ||||
|         except Foo.DoesNotExist: | ||||
|             pass | ||||
|         except Exception: | ||||
|             self.assertFalse("Threw wrong exception") | ||||
|  | ||||
|         f.save() | ||||
|         f.delete() | ||||
|         try: | ||||
|  | ||||
|         with self.assertRaises(Foo.DoesNotExist): | ||||
|             f.reload() | ||||
|         except Foo.DoesNotExist: | ||||
|             pass | ||||
|         except Exception: | ||||
|             self.assertFalse("Threw wrong exception") | ||||
|  | ||||
|     def test_reload_of_non_strict_with_special_field_name(self): | ||||
|         """Ensures reloading works for documents with meta strict == False.""" | ||||
| @@ -734,12 +727,12 @@ class InstanceTest(unittest.TestCase): | ||||
|  | ||||
|         t = TestDocument(status="draft", pub_date=datetime.now()) | ||||
|  | ||||
|         try: | ||||
|         with self.assertRaises(ValidationError) as cm: | ||||
|             t.save() | ||||
|         except ValidationError as e: | ||||
|             expect_msg = "Draft entries may not have a publication date." | ||||
|             self.assertTrue(expect_msg in e.message) | ||||
|             self.assertEqual(e.to_dict(), {'__all__': expect_msg}) | ||||
|  | ||||
|         expected_msg = "Draft entries may not have a publication date." | ||||
|         self.assertIn(expected_msg, cm.exception.message) | ||||
|         self.assertEqual(cm.exception.to_dict(), {'__all__': expected_msg}) | ||||
|  | ||||
|         t = TestDocument(status="published") | ||||
|         t.save(clean=False) | ||||
| @@ -773,12 +766,13 @@ class InstanceTest(unittest.TestCase): | ||||
|         TestDocument.drop_collection() | ||||
|  | ||||
|         t = TestDocument(doc=TestEmbeddedDocument(x=10, y=25, z=15)) | ||||
|         try: | ||||
|  | ||||
|         with self.assertRaises(ValidationError) as cm: | ||||
|             t.save() | ||||
|         except ValidationError as e: | ||||
|             expect_msg = "Value of z != x + y" | ||||
|             self.assertTrue(expect_msg in e.message) | ||||
|             self.assertEqual(e.to_dict(), {'doc': {'__all__': expect_msg}}) | ||||
|  | ||||
|         expected_msg = "Value of z != x + y" | ||||
|         self.assertIn(expected_msg, cm.exception.message) | ||||
|         self.assertEqual(cm.exception.to_dict(), {'doc': {'__all__': expected_msg}}) | ||||
|  | ||||
|         t = TestDocument(doc=TestEmbeddedDocument(x=10, y=25)).save() | ||||
|         self.assertEqual(t.doc.z, 35) | ||||
| @@ -3148,6 +3142,64 @@ class InstanceTest(unittest.TestCase): | ||||
|         self.assertEquals(p.id, None) | ||||
|         p.id = "12345"  # in case it is not working: "OperationError: Shard Keys are immutable..." will be raised here | ||||
|  | ||||
|     def test_from_son_created_False_without_id(self): | ||||
|         class MyPerson(Document): | ||||
|             name = StringField() | ||||
|  | ||||
|         MyPerson.objects.delete() | ||||
|  | ||||
|         p = MyPerson.from_json('{"name": "a_fancy_name"}', created=False) | ||||
|         self.assertFalse(p._created) | ||||
|         self.assertIsNone(p.id) | ||||
|         p.save() | ||||
|         self.assertIsNotNone(p.id) | ||||
|         saved_p = MyPerson.objects.get(id=p.id) | ||||
|         self.assertEqual(saved_p.name, 'a_fancy_name') | ||||
|  | ||||
|     def test_from_son_created_False_with_id(self): | ||||
|         # 1854 | ||||
|         class MyPerson(Document): | ||||
|             name = StringField() | ||||
|  | ||||
|         MyPerson.objects.delete() | ||||
|  | ||||
|         p = MyPerson.from_json('{"_id": "5b85a8b04ec5dc2da388296e", "name": "a_fancy_name"}', created=False) | ||||
|         self.assertFalse(p._created) | ||||
|         self.assertEqual(p._changed_fields, []) | ||||
|         self.assertEqual(p.name, 'a_fancy_name') | ||||
|         self.assertEqual(p.id, ObjectId('5b85a8b04ec5dc2da388296e')) | ||||
|         p.save() | ||||
|  | ||||
|         with self.assertRaises(DoesNotExist): | ||||
|             # Since created=False and we gave an id in the json and _changed_fields is empty | ||||
|             # mongoengine assumes that the document exits with that structure already | ||||
|             # and calling .save() didn't save anything | ||||
|             MyPerson.objects.get(id=p.id) | ||||
|  | ||||
|         self.assertFalse(p._created) | ||||
|         p.name = 'a new fancy name' | ||||
|         self.assertEqual(p._changed_fields, ['name']) | ||||
|         p.save() | ||||
|         saved_p = MyPerson.objects.get(id=p.id) | ||||
|         self.assertEqual(saved_p.name, p.name) | ||||
|  | ||||
|     def test_from_son_created_True_with_an_id(self): | ||||
|         class MyPerson(Document): | ||||
|             name = StringField() | ||||
|  | ||||
|         MyPerson.objects.delete() | ||||
|  | ||||
|         p = MyPerson.from_json('{"_id": "5b85a8b04ec5dc2da388296e", "name": "a_fancy_name"}', created=True) | ||||
|         self.assertTrue(p._created) | ||||
|         self.assertEqual(p._changed_fields, []) | ||||
|         self.assertEqual(p.name, 'a_fancy_name') | ||||
|         self.assertEqual(p.id, ObjectId('5b85a8b04ec5dc2da388296e')) | ||||
|         p.save() | ||||
|  | ||||
|         saved_p = MyPerson.objects.get(id=p.id) | ||||
|         self.assertEqual(saved_p, p) | ||||
|         self.assertEqual(p.name, 'a_fancy_name') | ||||
|  | ||||
|     def test_null_field(self): | ||||
|         # 734 | ||||
|         class User(Document): | ||||
|   | ||||
| @@ -4457,7 +4457,6 @@ class QuerySetTest(unittest.TestCase): | ||||
|             self.assertNotEqual(bars._CommandCursor__collection.read_preference, | ||||
|                              ReadPreference.SECONDARY_PREFERRED) | ||||
|  | ||||
|  | ||||
|     def test_json_simple(self): | ||||
|  | ||||
|         class Embedded(EmbeddedDocument): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user