Merge pull request #243 from wpjunior/sequencefield_fixes
Sequencefield fixes
This commit is contained in:
		| @@ -381,8 +381,8 @@ class DocumentMetaclass(type): | |||||||
|                     attr_value.db_field = attr_name |                     attr_value.db_field = attr_name | ||||||
|                 doc_fields[attr_name] = attr_value |                 doc_fields[attr_name] = attr_value | ||||||
|         attrs['_fields'] = doc_fields |         attrs['_fields'] = doc_fields | ||||||
|         attrs['_db_field_map'] = dict([(k, v.db_field) for k, v in doc_fields.items()]) |         attrs['_db_field_map'] = dict([(k, v.db_field) for k, v in doc_fields.items() if k!=v.db_field]) | ||||||
|         attrs['_reverse_db_field_map'] = dict([(v.db_field, k) for k, v in doc_fields.items()]) |         attrs['_reverse_db_field_map'] = dict([(v, k) for k, v in attrs['_db_field_map'].items()]) | ||||||
|  |  | ||||||
|         new_class = super_new(cls, name, bases, attrs) |         new_class = super_new(cls, name, bases, attrs) | ||||||
|         for field in new_class._fields.values(): |         for field in new_class._fields.values(): | ||||||
| @@ -577,6 +577,7 @@ class BaseDocument(object): | |||||||
|         signals.pre_init.send(self.__class__, document=self, values=values) |         signals.pre_init.send(self.__class__, document=self, values=values) | ||||||
|  |  | ||||||
|         self._data = {} |         self._data = {} | ||||||
|  |         self._initialised = False | ||||||
|         # Assign default values to instance |         # Assign default values to instance | ||||||
|         for attr_name, field in self._fields.items(): |         for attr_name, field in self._fields.items(): | ||||||
|             value = getattr(self, attr_name, None) |             value = getattr(self, attr_name, None) | ||||||
|   | |||||||
| @@ -911,14 +911,26 @@ class SequenceField(IntField): | |||||||
|  |  | ||||||
|         if instance is None: |         if instance is None: | ||||||
|             return self |             return self | ||||||
|  |  | ||||||
|         if not instance._data: |         if not instance._data: | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         value = instance._data.get(self.name) |         value = instance._data.get(self.name) | ||||||
|  |  | ||||||
|         if not value and instance._initialised: |         if not value and instance._initialised: | ||||||
|             value = self.generate_new_value() |             value = self.generate_new_value() | ||||||
|             instance._data[self.name] = value |             instance._data[self.name] = value | ||||||
|  |             instance._mark_as_changed(self.name) | ||||||
|  |  | ||||||
|         return value |         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): |     def to_python(self, value): | ||||||
|         if value is None: |         if value is None: | ||||||
|             value = self.generate_new_value() |             value = self.generate_new_value() | ||||||
|   | |||||||
| @@ -1425,6 +1425,32 @@ class FieldTest(unittest.TestCase): | |||||||
|         c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'}) |         c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'}) | ||||||
|         self.assertEqual(c['next'], 10) |         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): |     def test_multiple_sequence_fields_on_docs(self): | ||||||
|  |  | ||||||
|         class Animal(Document): |         class Animal(Document): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user