diff --git a/mongoengine_plus/models/helpers.py b/mongoengine_plus/models/helpers.py index 416a1ab..278159b 100644 --- a/mongoengine_plus/models/helpers.py +++ b/mongoengine_plus/models/helpers.py @@ -66,7 +66,10 @@ def mongo_to_dict(obj, exclude_fields: list = None) -> dict: ) return_data[field_name] = list_field_to_dict(data) elif isinstance(obj._fields[field_name], EmbeddedDocumentField): - return_data[field_name] = mongo_to_dict(data, []) + if callable(getattr(data, "to_dict", None)): + return_data[field_name] = data.to_dict() + else: + return_data[field_name] = mongo_to_dict(data) elif isinstance(obj._fields[field_name], DictField): return_data[field_name] = data elif isinstance(obj._fields[field_name], EnumField): diff --git a/mongoengine_plus/version.py b/mongoengine_plus/version.py index 58d478a..3f262a6 100644 --- a/mongoengine_plus/version.py +++ b/mongoengine_plus/version.py @@ -1 +1 @@ -__version__ = '1.2.0' +__version__ = '1.2.1' diff --git a/tests/models/test_base.py b/tests/models/test_base.py index 0e9e634..6b8745e 100644 --- a/tests/models/test_base.py +++ b/tests/models/test_base.py @@ -1,17 +1,61 @@ -from mongoengine import Document, StringField +from mongoengine import ( + Document, + EmbeddedDocument, + EmbeddedDocumentField, + StringField, +) from mongoengine_plus.models import BaseModel +class File(EmbeddedDocument): + url = StringField() + file_type = StringField() + + +class Address(EmbeddedDocument, BaseModel): + # Inheritance from BaseModel, to use _excluded and _hidden + _excluded = ['reference'] + _hidden = ['secret_code'] + street = StringField() + secret_code = StringField() + reference = StringField() + + class TestModel(BaseModel, Document): - id = StringField() + id = StringField(primary_key=True) secret_field = StringField() + address = EmbeddedDocumentField(Address) + document = EmbeddedDocumentField(File) + __test__ = False _hidden = ['secret_field'] def test_hide_field(): - model = TestModel(id='12345', secret_field='secret') + address = Address( + street='123 Main St', + reference='not display this', + secret_code='898612', + ) + doc = File(url='https://example.com', file_type='pdf') + model = TestModel( + id='12345', + secret_field='secret', + document=doc, + address=address, + ) model_dict = model.to_dict() - assert model_dict['secret_field'] == '********' - assert model_dict['id'] == '12345' + expected = { + 'id': '12345', + 'secret_field': '********', + 'address': { + 'street': '123 Main St', + 'secret_code': '********', + }, + 'document': { + 'url': 'https://example.com', + 'file_type': 'pdf', + }, + } + assert model_dict == expected