From 130fb9916d21c8fb14ae2a31be7898f529aa549c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Fri, 22 Jul 2011 10:19:41 -0300 Subject: [PATCH] fixes for SequenceField --- mongoengine/base.py | 1 + mongoengine/fields.py | 12 ++++++++++++ tests/fields.py | 26 ++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/mongoengine/base.py b/mongoengine/base.py index 565bf6ba..79851da9 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -577,6 +577,7 @@ class BaseDocument(object): signals.pre_init.send(self.__class__, document=self, values=values) self._data = {} + self._initialised = False # Assign default values to instance for attr_name, field in self._fields.items(): value = getattr(self, attr_name, None) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 3234160d..b2f1e2a2 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -911,14 +911,26 @@ class SequenceField(IntField): if instance is None: return self + if not instance._data: return + value = instance._data.get(self.name) + if not value and instance._initialised: value = self.generate_new_value() instance._data[self.name] = value + instance._mark_as_changed(self.name) + return value + def __set__(self, instance, value): + + if value is None and instance._initialised: + value = self.generate_new_value() + + return super(SequenceField, self).__set__(instance, value) + def to_python(self, value): if value is None: value = self.generate_new_value() diff --git a/tests/fields.py b/tests/fields.py index 1f070ae1..f8aeb86c 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -1425,6 +1425,32 @@ class FieldTest(unittest.TestCase): c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'}) self.assertEqual(c['next'], 10) + def test_sequence_fields_reload(self): + class Animal(Document): + counter = SequenceField() + type = StringField() + + self.db['mongoengine.counters'].drop() + Animal.drop_collection() + + a = Animal(type="Boi") + a.save() + + self.assertEqual(a.counter, 1) + a.reload() + self.assertEqual(a.counter, 1) + + a.counter = None + self.assertEqual(a.counter, 2) + a.save() + + self.assertEqual(a.counter, 2) + + a = Animal.objects.first() + self.assertEqual(a.counter, 2) + a.reload() + self.assertEqual(a.counter, 2) + def test_multiple_sequence_fields_on_docs(self): class Animal(Document):