From b024dd913d986e1a6c2cc24de68e30fdbddd2639 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Fri, 29 Nov 2013 13:09:11 +0000 Subject: [PATCH] EmbeddedDocument._instance is now set when settng the attribute (#506) --- docs/changelog.rst | 1 + mongoengine/base/fields.py | 11 +++++------ tests/document/instance.py | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index fa01df85..4eb82d21 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Changes in 0.8.5 ================ +- EmbeddedDocument._instance is now set when settng the attribute (#506) - Fixed EmbeddedDocument with ReferenceField equality issue (#502) - Fixed GenericReferenceField serialization order (#499) - Fixed count and none bug (#498) diff --git a/mongoengine/base/fields.py b/mongoengine/base/fields.py index 752dc631..04c559e2 100644 --- a/mongoengine/base/fields.py +++ b/mongoengine/base/fields.py @@ -89,12 +89,7 @@ class BaseField(object): return self # Get value from document instance if available - value = instance._data.get(self.name) - - EmbeddedDocument = _import_class('EmbeddedDocument') - if isinstance(value, EmbeddedDocument) and value._instance is None: - value._instance = weakref.proxy(instance) - return value + return instance._data.get(self.name) def __set__(self, instance, value): """Descriptor for assigning a value to a field in a document. @@ -116,6 +111,10 @@ class BaseField(object): # Values cant be compared eg: naive and tz datetimes # So mark it as changed instance._mark_as_changed(self.name) + + EmbeddedDocument = _import_class('EmbeddedDocument') + if isinstance(value, EmbeddedDocument) and value._instance is None: + value._instance = weakref.proxy(instance) instance._data[self.name] = value def error(self, message="", errors=None, field_name=None): diff --git a/tests/document/instance.py b/tests/document/instance.py index 06b884f5..982b1e6c 100644 --- a/tests/document/instance.py +++ b/tests/document/instance.py @@ -490,6 +490,26 @@ class InstanceTest(unittest.TestCase): doc = Doc.objects.get() self.assertEqual(doc, doc.embedded_field[0]._instance) + def test_instance_is_set_on_setattr(self): + + class Email(EmbeddedDocument): + email = EmailField() + def clean(self): + print "instance:" + print self._instance + + class Account(Document): + email = EmbeddedDocumentField(Email) + + Account.drop_collection() + acc = Account() + acc.email = Email(email='test@example.com') + self.assertTrue(hasattr(acc._data["email"], "_instance")) + acc.save() + + acc1 = Account.objects.first() + self.assertTrue(hasattr(acc1._data["email"], "_instance")) + def test_document_clean(self): class TestDocument(Document): status = StringField()