Skip to content

Commit 23cc9f6

Browse files
author
erdenezul
authored
Merge pull request #1951 from bagerard/fix_cls_in_constructor
Regression bug fix - _cls not set in constructor
2 parents b92c484 + e50799e commit 23cc9f6

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Changelog
55
Development
66
===========
77
- (Fill this out as you fix issues and develop your features).
8+
- Fix `_cls` that is not set properly in Document constructor (regression) #1950
89
- Fix bug in _delta method - Update of a ListField depends on an unrelated dynamic field update #1733
910
- Remove deprecated `save()` method and used `insert_one()` #1899
1011

mongoengine/base/document.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ def __init__(self, *args, **values):
9191
value = getattr(self, key, None)
9292
setattr(self, key, value)
9393

94+
if '_cls' not in values:
95+
self._cls = self._class_name
96+
9497
# Set passed values after initialisation
9598
if self._dynamic:
9699
dynamic_data = {}

tests/document/inheritance.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
import unittest
33
import warnings
44

5-
from tests.fixtures import Base
6-
7-
from mongoengine import Document, EmbeddedDocument, connect, ReferenceField,\
8-
BooleanField, GenericReferenceField, IntField, StringField
5+
from mongoengine import (BooleanField, Document, EmbeddedDocument,
6+
EmbeddedDocumentField, GenericReferenceField,
7+
IntField, ReferenceField, StringField, connect)
98
from mongoengine.connection import get_db
9+
from tests.fixtures import Base
1010

1111
__all__ = ('InheritanceTest', )
1212

@@ -23,6 +23,27 @@ def tearDown(self):
2323
continue
2424
self.db.drop_collection(collection)
2525

26+
def test_constructor_cls(self):
27+
# Ensures _cls is properly set during construction
28+
# and when object gets reloaded (prevent regression of #1950)
29+
class EmbedData(EmbeddedDocument):
30+
data = StringField()
31+
meta = {'allow_inheritance': True}
32+
33+
class DataDoc(Document):
34+
name = StringField()
35+
embed = EmbeddedDocumentField(EmbedData)
36+
meta = {'allow_inheritance': True}
37+
38+
test_doc = DataDoc(name='test', embed=EmbedData(data='data'))
39+
assert test_doc._cls == 'DataDoc'
40+
assert test_doc.embed._cls == 'EmbedData'
41+
test_doc.save()
42+
saved_doc = DataDoc.objects.with_id(test_doc.id)
43+
assert test_doc._cls == saved_doc._cls
44+
assert test_doc.embed._cls == saved_doc.embed._cls
45+
test_doc.delete()
46+
2647
def test_superclasses(self):
2748
"""Ensure that the correct list of superclasses is assembled.
2849
"""

0 commit comments

Comments
 (0)