Fix for bug where changes to a a embedded document field are not recorded if the root document was just created+saved.
This commit is contained in:
parent
32fc4152a7
commit
c272b7901f
@ -24,6 +24,10 @@ class EmbeddedDocument(BaseDocument):
|
|||||||
|
|
||||||
__metaclass__ = DocumentMetaclass
|
__metaclass__ = DocumentMetaclass
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(EmbeddedDocument, self).__init__(*args, **kwargs)
|
||||||
|
self._changed_fields = []
|
||||||
|
|
||||||
def __delattr__(self, *args, **kwargs):
|
def __delattr__(self, *args, **kwargs):
|
||||||
"""Handle deletions of fields"""
|
"""Handle deletions of fields"""
|
||||||
field_name = args[0]
|
field_name = args[0]
|
||||||
|
@ -1599,14 +1599,16 @@ class DocumentTest(unittest.TestCase):
|
|||||||
self.assertEquals(doc._get_changed_fields(), ['embedded_field'])
|
self.assertEquals(doc._get_changed_fields(), ['embedded_field'])
|
||||||
|
|
||||||
embedded_delta = {
|
embedded_delta = {
|
||||||
'_types': ['Embedded'],
|
|
||||||
'_cls': 'Embedded',
|
|
||||||
'string_field': 'hello',
|
'string_field': 'hello',
|
||||||
'int_field': 1,
|
'int_field': 1,
|
||||||
'dict_field': {'hello': 'world'},
|
'dict_field': {'hello': 'world'},
|
||||||
'list_field': ['1', 2, {'hello': 'world'}]
|
'list_field': ['1', 2, {'hello': 'world'}]
|
||||||
}
|
}
|
||||||
self.assertEquals(doc.embedded_field._delta(), (embedded_delta, {}))
|
self.assertEquals(doc.embedded_field._delta(), (embedded_delta, {}))
|
||||||
|
embedded_delta.update({
|
||||||
|
'_types': ['Embedded'],
|
||||||
|
'_cls': 'Embedded',
|
||||||
|
})
|
||||||
self.assertEquals(doc._delta(), ({'embedded_field': embedded_delta}, {}))
|
self.assertEquals(doc._delta(), ({'embedded_field': embedded_delta}, {}))
|
||||||
|
|
||||||
doc.save()
|
doc.save()
|
||||||
@ -1832,14 +1834,16 @@ class DocumentTest(unittest.TestCase):
|
|||||||
self.assertEquals(doc._get_changed_fields(), ['db_embedded_field'])
|
self.assertEquals(doc._get_changed_fields(), ['db_embedded_field'])
|
||||||
|
|
||||||
embedded_delta = {
|
embedded_delta = {
|
||||||
'_types': ['Embedded'],
|
|
||||||
'_cls': 'Embedded',
|
|
||||||
'db_string_field': 'hello',
|
'db_string_field': 'hello',
|
||||||
'db_int_field': 1,
|
'db_int_field': 1,
|
||||||
'db_dict_field': {'hello': 'world'},
|
'db_dict_field': {'hello': 'world'},
|
||||||
'db_list_field': ['1', 2, {'hello': 'world'}]
|
'db_list_field': ['1', 2, {'hello': 'world'}]
|
||||||
}
|
}
|
||||||
self.assertEquals(doc.embedded_field._delta(), (embedded_delta, {}))
|
self.assertEquals(doc.embedded_field._delta(), (embedded_delta, {}))
|
||||||
|
embedded_delta.update({
|
||||||
|
'_types': ['Embedded'],
|
||||||
|
'_cls': 'Embedded',
|
||||||
|
})
|
||||||
self.assertEquals(doc._delta(), ({'db_embedded_field': embedded_delta}, {}))
|
self.assertEquals(doc._delta(), ({'db_embedded_field': embedded_delta}, {}))
|
||||||
|
|
||||||
doc.save()
|
doc.save()
|
||||||
@ -2164,6 +2168,30 @@ class DocumentTest(unittest.TestCase):
|
|||||||
# Ensure that the 'details' embedded object saved correctly
|
# Ensure that the 'details' embedded object saved correctly
|
||||||
self.assertEqual(employee_obj['details']['position'], 'Developer')
|
self.assertEqual(employee_obj['details']['position'], 'Developer')
|
||||||
|
|
||||||
|
def test_embedded_update_after_save(self):
|
||||||
|
"""
|
||||||
|
Test update of `EmbeddedDocumentField` attached to a newly saved
|
||||||
|
document.
|
||||||
|
"""
|
||||||
|
class Page(EmbeddedDocument):
|
||||||
|
log_message = StringField(verbose_name="Log message",
|
||||||
|
required=True)
|
||||||
|
|
||||||
|
class Site(Document):
|
||||||
|
page = EmbeddedDocumentField(Page)
|
||||||
|
|
||||||
|
|
||||||
|
Site.drop_collection()
|
||||||
|
site = Site(page=Page(log_message="Warning: Dummy message"))
|
||||||
|
site.save()
|
||||||
|
|
||||||
|
# Update
|
||||||
|
site.page.log_message = "Error: Dummy message"
|
||||||
|
site.save()
|
||||||
|
|
||||||
|
site = Site.objects.first()
|
||||||
|
self.assertEqual(site.page.log_message, "Error: Dummy message")
|
||||||
|
|
||||||
def test_updating_an_embedded_document(self):
|
def test_updating_an_embedded_document(self):
|
||||||
"""Ensure that a document with an embedded document field may be
|
"""Ensure that a document with an embedded document field may be
|
||||||
saved in the database.
|
saved in the database.
|
||||||
|
@ -335,14 +335,16 @@ class DynamicDocTest(unittest.TestCase):
|
|||||||
self.assertEquals(doc._get_changed_fields(), ['embedded_field'])
|
self.assertEquals(doc._get_changed_fields(), ['embedded_field'])
|
||||||
|
|
||||||
embedded_delta = {
|
embedded_delta = {
|
||||||
'_types': ['Embedded'],
|
|
||||||
'_cls': 'Embedded',
|
|
||||||
'string_field': 'hello',
|
'string_field': 'hello',
|
||||||
'int_field': 1,
|
'int_field': 1,
|
||||||
'dict_field': {'hello': 'world'},
|
'dict_field': {'hello': 'world'},
|
||||||
'list_field': ['1', 2, {'hello': 'world'}]
|
'list_field': ['1', 2, {'hello': 'world'}]
|
||||||
}
|
}
|
||||||
self.assertEquals(doc.embedded_field._delta(), (embedded_delta, {}))
|
self.assertEquals(doc.embedded_field._delta(), (embedded_delta, {}))
|
||||||
|
embedded_delta.update({
|
||||||
|
'_types': ['Embedded'],
|
||||||
|
'_cls': 'Embedded',
|
||||||
|
})
|
||||||
self.assertEquals(doc._delta(), ({'embedded_field': embedded_delta}, {}))
|
self.assertEquals(doc._delta(), ({'embedded_field': embedded_delta}, {}))
|
||||||
|
|
||||||
doc.save()
|
doc.save()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user