From 0b40e5b44d8776bb5629ef9d2820c8bf005eb6e4 Mon Sep 17 00:00:00 2001 From: Oscar Linderoth Date: Sun, 20 Oct 2019 21:18:32 +0200 Subject: [PATCH 1/2] Prevent Object/Nested mutating doc_class' mapping --- elasticsearch_dsl/field.py | 3 ++- test_elasticsearch_dsl/test_document.py | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/elasticsearch_dsl/field.py b/elasticsearch_dsl/field.py index 428ad3022..ecdc19f7b 100644 --- a/elasticsearch_dsl/field.py +++ b/elasticsearch_dsl/field.py @@ -1,4 +1,5 @@ import base64 +import copy import ipaddress try: @@ -151,7 +152,7 @@ def __init__(self, doc_class=None, dynamic=None, properties=None, **kwargs): if dynamic is not None: self._doc_class._doc_type.mapping.meta('dynamic', dynamic) - self._mapping = self._doc_class._doc_type.mapping + self._mapping = copy.deepcopy(self._doc_class._doc_type.mapping) super(Object, self).__init__(**kwargs) def __getitem__(self, name): diff --git a/test_elasticsearch_dsl/test_document.py b/test_elasticsearch_dsl/test_document.py index 4b5073a9a..3b92f2d3c 100644 --- a/test_elasticsearch_dsl/test_document.py +++ b/test_elasticsearch_dsl/test_document.py @@ -582,3 +582,11 @@ class Index: assert c.meta.fields._tags == ['search'] assert c.meta.fields._routing == 'es' assert c._tagline == 'You know, for search' + +def test_nested_and_object_inner_doc(): + class MySubDocWithNested(MyDoc): + nested_inner = field.Nested(MyInner) + + props = MySubDocWithNested._doc_type.mapping.to_dict()['properties'] + assert props['nested_inner']['type'] == 'nested' + assert props['inner']['type'] == 'object' From 6b408d91a7d27fe0d497d1c38eb4ecdd55ee4cfa Mon Sep 17 00:00:00 2001 From: Seth Michael Larson Date: Thu, 16 Jul 2020 08:24:00 -0500 Subject: [PATCH 2/2] Assert against all mapping properties --- test_elasticsearch_dsl/test_document.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test_elasticsearch_dsl/test_document.py b/test_elasticsearch_dsl/test_document.py index 3b92f2d3c..c9f834c9b 100644 --- a/test_elasticsearch_dsl/test_document.py +++ b/test_elasticsearch_dsl/test_document.py @@ -588,5 +588,14 @@ class MySubDocWithNested(MyDoc): nested_inner = field.Nested(MyInner) props = MySubDocWithNested._doc_type.mapping.to_dict()['properties'] - assert props['nested_inner']['type'] == 'nested' - assert props['inner']['type'] == 'object' + assert props == { + "created_at": {"type": "date"}, + "inner": {"properties": {"old_field": {"type": "text"}}, "type": "object"}, + "name": {"type": "text"}, + "nested_inner": { + "properties": {"old_field": {"type": "text"}}, + "type": "nested", + }, + "title": {"type": "keyword"}, + } +