From c1c09fa6b4c832b99afeea83d19d290468689fe4 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Tue, 21 Nov 2017 21:56:26 +0800 Subject: [PATCH 01/10] fix validatione error for invalid embedded document instance #1067 --- mongoengine/fields.py | 6 +++++- tests/queryset/queryset.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 6c4a06c9..0aa51b2d 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -688,6 +688,11 @@ class GenericEmbeddedDocumentField(BaseField): return value def validate(self, value, clean=True): + if self.choices and isinstance(value, SON): + for choice in self.choices: + if value['_cls'] == choice._class_name: + return True + if not isinstance(value, EmbeddedDocument): self.error('Invalid embedded document instance provided to an ' 'GenericEmbeddedDocumentField') @@ -705,7 +710,6 @@ class GenericEmbeddedDocumentField(BaseField): def to_mongo(self, document, use_db_field=True, fields=None): if document is None: return None - data = document.to_mongo(use_db_field, fields) if '_cls' not in data: data['_cls'] = document._class_name diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index 28e84af4..43800fff 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -2086,6 +2086,23 @@ class QuerySetTest(unittest.TestCase): Site.objects(id=s.id).update_one( pull_all__collaborators__helpful__user=['Ross']) + def test_pull_in_genericembedded_field(self): + + class Foo(EmbeddedDocument): + name = StringField() + + class Bar(Document): + foos = ListField(GenericEmbeddedDocumentField( + choices=[Foo, ])) + + Bar.drop_collection() + + foo = Foo(name="bar") + bar = Bar(foos=[foo]).save() + Bar.objects(id=bar.id).update(pull__foos=foo) + bar.reload() + self.assertEqual(len(bar.foos), 0) + def test_update_one_pop_generic_reference(self): class BlogTag(Document): @@ -2179,6 +2196,24 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(message.authors[1].name, "Ross") self.assertEqual(message.authors[2].name, "Adam") + def test_set_generic_embedded_documents(self): + + class Bar(EmbeddedDocument): + name = StringField() + + class User(Document): + username = StringField() + bar = GenericEmbeddedDocumentField(choices=[Bar,]) + + User.drop_collection() + + User(username='abc').save() + User.objects(username='abc').update( + set__bar=Bar(name='test'), upsert=True) + + user = User.objects(username='abc').first() + self.assertEqual(user.bar.name, "test") + def test_reload_embedded_docs_instance(self): class SubDoc(EmbeddedDocument): From 60758dd76b4ae1831e4f3f389c71b95b0e77abd2 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Wed, 22 Nov 2017 18:56:12 +0800 Subject: [PATCH 02/10] add changelog --- docs/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 1e9ac7fc..b4852178 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,7 @@ Changelog Changes in 0.15.0 ================= - Add LazyReferenceField and GenericLazyReferenceField to address #1230 +- Fix validation error for invalid embedded document instance #1067 Changes in 0.14.1 ================= From 79486e33936d6302e1cb898c38a9535648563343 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Wed, 22 Nov 2017 19:27:35 +0800 Subject: [PATCH 03/10] change description in changelog --- docs/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index b4852178..249d4659 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,7 +5,7 @@ Changelog Changes in 0.15.0 ================= - Add LazyReferenceField and GenericLazyReferenceField to address #1230 -- Fix validation error for invalid embedded document instance #1067 +- Fix validation error instance in GenericEmbeddedDocumentField #1067 Changes in 0.14.1 ================= From 0ce081323fd66ad00b00eb4bc9edc6b888a5fa2d Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Wed, 22 Nov 2017 22:19:50 +0800 Subject: [PATCH 04/10] move changes to development --- docs/changelog.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 249d4659..f96fc11b 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,10 +2,13 @@ Changelog ========= +Development +=========== +- Fix validation error instance in GenericEmbeddedDocumentField #1067 + Changes in 0.15.0 ================= - Add LazyReferenceField and GenericLazyReferenceField to address #1230 -- Fix validation error instance in GenericEmbeddedDocumentField #1067 Changes in 0.14.1 ================= From b35efb9f7205ab9b07d5b21c5cdb26d4c6d07201 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Tue, 21 Nov 2017 21:56:26 +0800 Subject: [PATCH 05/10] fix validatione error for invalid embedded document instance #1067 --- mongoengine/fields.py | 6 +++++- tests/queryset/queryset.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 8ca2b17f..4e941c4e 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -689,6 +689,11 @@ class GenericEmbeddedDocumentField(BaseField): return value def validate(self, value, clean=True): + if self.choices and isinstance(value, SON): + for choice in self.choices: + if value['_cls'] == choice._class_name: + return True + if not isinstance(value, EmbeddedDocument): self.error('Invalid embedded document instance provided to an ' 'GenericEmbeddedDocumentField') @@ -706,7 +711,6 @@ class GenericEmbeddedDocumentField(BaseField): def to_mongo(self, document, use_db_field=True, fields=None): if document is None: return None - data = document.to_mongo(use_db_field, fields) if '_cls' not in data: data['_cls'] = document._class_name diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index 28e84af4..43800fff 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -2086,6 +2086,23 @@ class QuerySetTest(unittest.TestCase): Site.objects(id=s.id).update_one( pull_all__collaborators__helpful__user=['Ross']) + def test_pull_in_genericembedded_field(self): + + class Foo(EmbeddedDocument): + name = StringField() + + class Bar(Document): + foos = ListField(GenericEmbeddedDocumentField( + choices=[Foo, ])) + + Bar.drop_collection() + + foo = Foo(name="bar") + bar = Bar(foos=[foo]).save() + Bar.objects(id=bar.id).update(pull__foos=foo) + bar.reload() + self.assertEqual(len(bar.foos), 0) + def test_update_one_pop_generic_reference(self): class BlogTag(Document): @@ -2179,6 +2196,24 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(message.authors[1].name, "Ross") self.assertEqual(message.authors[2].name, "Adam") + def test_set_generic_embedded_documents(self): + + class Bar(EmbeddedDocument): + name = StringField() + + class User(Document): + username = StringField() + bar = GenericEmbeddedDocumentField(choices=[Bar,]) + + User.drop_collection() + + User(username='abc').save() + User.objects(username='abc').update( + set__bar=Bar(name='test'), upsert=True) + + user = User.objects(username='abc').first() + self.assertEqual(user.bar.name, "test") + def test_reload_embedded_docs_instance(self): class SubDoc(EmbeddedDocument): From ce9ea7baad2870145203a51e069f6a6f57526518 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Wed, 22 Nov 2017 18:56:12 +0800 Subject: [PATCH 06/10] add changelog --- docs/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 151fdd08..69e57e0b 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -12,6 +12,7 @@ dev Changes in 0.15.0 ================= - Add LazyReferenceField and GenericLazyReferenceField to address #1230 +- Fix validation error for invalid embedded document instance #1067 Changes in 0.14.1 ================= From 08a4deca17b511974125e26a7151e165231b58de Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Wed, 22 Nov 2017 19:27:35 +0800 Subject: [PATCH 07/10] change description in changelog --- docs/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 69e57e0b..c44f8432 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -12,7 +12,7 @@ dev Changes in 0.15.0 ================= - Add LazyReferenceField and GenericLazyReferenceField to address #1230 -- Fix validation error for invalid embedded document instance #1067 +- Fix validation error instance in GenericEmbeddedDocumentField #1067 Changes in 0.14.1 ================= From 2cbebf9c99dd5ebd368ca775b60fc25149ea5634 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Wed, 22 Nov 2017 22:19:50 +0800 Subject: [PATCH 08/10] move changes to development --- docs/changelog.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index c44f8432..efd2e0f6 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,12 +7,11 @@ dev - Subfield resolve error in generic_emdedded_document query #1651 #1652 - use each modifier only with $position #1673 #1675 - Improve LazyReferenceField and GenericLazyReferenceField with nested fields #1704 - +- Fix validation error instance in GenericEmbeddedDocumentField #1067 Changes in 0.15.0 ================= - Add LazyReferenceField and GenericLazyReferenceField to address #1230 -- Fix validation error instance in GenericEmbeddedDocumentField #1067 Changes in 0.14.1 ================= From 9e0ca51c2f47618b539c2724ecfe656e454eb062 Mon Sep 17 00:00:00 2001 From: Erdenezul Date: Fri, 1 Dec 2017 08:40:51 +0800 Subject: [PATCH 09/10] remove merge conflict after rebase #1067 --- docs/changelog.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 1bd932d6..efd2e0f6 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,7 +2,6 @@ Changelog ========= -<<<<<<< HEAD dev === - Subfield resolve error in generic_emdedded_document query #1651 #1652 From 7674dc9b344f99e47a6df3b1c44d72faf57ff137 Mon Sep 17 00:00:00 2001 From: Esmail Date: Tue, 5 Dec 2017 15:14:15 -0500 Subject: [PATCH 10/10] One-character typo fix ("that" -> "than") --- docs/tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.rst b/docs/tutorial.rst index cc5b647d..ea1a04c1 100644 --- a/docs/tutorial.rst +++ b/docs/tutorial.rst @@ -153,7 +153,7 @@ post. This works, but there is no real reason to be storing the comments separately from their associated posts, other than to work around the relational model. Using MongoDB we can store the comments as a list of *embedded documents* directly on a post document. An embedded document should -be treated no differently that a regular document; it just doesn't have its own +be treated no differently than a regular document; it just doesn't have its own collection in the database. Using MongoEngine, we can define the structure of embedded documents, along with utility methods, in exactly the same way we do with regular documents::