From 5cc71ec2adad4e4601da50264c2d59ed5e32eb16 Mon Sep 17 00:00:00 2001 From: Serge Chmelev Date: Tue, 6 May 2014 13:25:31 +0400 Subject: [PATCH 1/3] Fix for post_init signal to receive correct state of _created flag. --- mongoengine/base/document.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index 307fcafd..3258b2c3 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -60,6 +60,8 @@ class BaseDocument(object): else: self._data = SemiStrictDict.create(allowed_keys=self._fields_ordered)() + self._created = values.pop("_created", True) + self._data = {} self._dynamic_fields = SON() # Assign default values to instance @@ -619,9 +621,8 @@ class BaseDocument(object): if cls.STRICT: data = dict((k, v) for k,v in data.iteritems() if k in cls._fields) - obj = cls(__auto_convert=False, **data) + obj = cls(__auto_convert=False, _created=False, **data) obj._changed_fields = changed_fields - obj._created = False if not _auto_dereference: obj._fields = fields return obj From c63f43854bef31f66c6ae6fb808a60042980c294 Mon Sep 17 00:00:00 2001 From: Serge Chmelev Date: Tue, 6 May 2014 15:40:01 +0400 Subject: [PATCH 2/3] Fix setting of _created flag in base.Document constructor --- mongoengine/base/document.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index 3258b2c3..0c2f3d7c 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -60,7 +60,7 @@ class BaseDocument(object): else: self._data = SemiStrictDict.create(allowed_keys=self._fields_ordered)() - self._created = values.pop("_created", True) + _created = values.pop("_created", True) self._data = {} self._dynamic_fields = SON() @@ -104,6 +104,7 @@ class BaseDocument(object): # Flag initialised self._initialised = True + self._created = _created signals.post_init.send(self.__class__, document=self) def __delattr__(self, *args, **kwargs): From 017602056d6ac88e70d3d31987f3690d010f3ba1 Mon Sep 17 00:00:00 2001 From: Serge Chmelev Date: Wed, 2 Jul 2014 21:06:41 +0400 Subject: [PATCH 3/3] Add testcase --- tests/test_signals.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/tests/test_signals.py b/tests/test_signals.py index 3d0cbb3e..6ab061d1 100644 --- a/tests/test_signals.py +++ b/tests/test_signals.py @@ -37,7 +37,8 @@ class SignalTests(unittest.TestCase): @classmethod def post_init(cls, sender, document, **kwargs): - signal_output.append('post_init signal, %s' % document) + signal_output.append('post_init signal, %s, document._created = %s' % (document, document._created)) + @classmethod def pre_save(cls, sender, document, **kwargs): @@ -193,10 +194,16 @@ class SignalTests(unittest.TestCase): a1 = self.Author(name='Bill Shakespeare') self.Author.objects.insert([a1], load_bulk=False) + def load_existing_author(): + a = self.Author(name='Bill Shakespeare') + a.save() + self.get_signal_output(lambda: None) # eliminate signal output + a1 = self.Author.objects(name='Bill Shakespeare')[0] + self.assertEqual(self.get_signal_output(create_author), [ "pre_init signal, Author", "{'name': 'Bill Shakespeare'}", - "post_init signal, Bill Shakespeare", + "post_init signal, Bill Shakespeare, document._created = True", ]) a1 = self.Author(name='Bill Shakespeare') @@ -225,12 +232,22 @@ class SignalTests(unittest.TestCase): 'post_delete signal, William Shakespeare', ]) + signal_output = self.get_signal_output(load_existing_author) + # test signal_output lines separately, because of random ObjectID after object load + self.assertEqual(signal_output[0], + "pre_init signal, Author", + ) + self.assertEqual(signal_output[2], + "post_init signal, Bill Shakespeare, document._created = False", + ) + + signal_output = self.get_signal_output(bulk_create_author_with_load) # The output of this signal is not entirely deterministic. The reloaded # object will have an object ID. Hence, we only check part of the output - self.assertEqual(signal_output[3], - "pre_bulk_insert signal, []") + self.assertEqual(signal_output[3], "pre_bulk_insert signal, []" + ) self.assertEqual(signal_output[-2:], ["post_bulk_insert signal, []", "Is loaded",]) @@ -238,7 +255,7 @@ class SignalTests(unittest.TestCase): self.assertEqual(self.get_signal_output(bulk_create_author_without_load), [ "pre_init signal, Author", "{'name': 'Bill Shakespeare'}", - "post_init signal, Bill Shakespeare", + "post_init signal, Bill Shakespeare, document._created = True", "pre_bulk_insert signal, []", "post_bulk_insert signal, []", "Not loaded",