[fix] SortedListField: update whole list if order is changed

This commit is contained in:
rma4ok 2015-04-29 01:14:48 -04:00 committed by Matthew Ellison
parent 01f4dd8f97
commit 0949df014b
2 changed files with 14 additions and 0 deletions

View File

@ -547,6 +547,7 @@ class BaseDocument(object):
EmbeddedDocument = _import_class("EmbeddedDocument") EmbeddedDocument = _import_class("EmbeddedDocument")
DynamicEmbeddedDocument = _import_class("DynamicEmbeddedDocument") DynamicEmbeddedDocument = _import_class("DynamicEmbeddedDocument")
ReferenceField = _import_class("ReferenceField") ReferenceField = _import_class("ReferenceField")
SortedListField = _import_class("SortedListField")
changed_fields = [] changed_fields = []
changed_fields += getattr(self, '_changed_fields', []) changed_fields += getattr(self, '_changed_fields', [])
@ -577,6 +578,12 @@ class BaseDocument(object):
if (hasattr(field, 'field') and if (hasattr(field, 'field') and
isinstance(field.field, ReferenceField)): isinstance(field.field, ReferenceField)):
continue continue
elif (isinstance(field, SortedListField) and field._ordering):
# if ordering is affected whole list is changed
if any(map(lambda d: field._ordering in d._changed_fields, data)):
changed_fields.append(db_field_name)
continue
self._nestable_types_changed_fields( self._nestable_types_changed_fields(
changed_fields, key, data, inspected) changed_fields, key, data, inspected)
return changed_fields return changed_fields

View File

@ -916,6 +916,13 @@ class FieldTest(unittest.TestCase):
self.assertEqual(post.comments[0].content, comment2.content) self.assertEqual(post.comments[0].content, comment2.content)
self.assertEqual(post.comments[1].content, comment1.content) self.assertEqual(post.comments[1].content, comment1.content)
post.comments[0].order = 2
post.save()
post.reload()
self.assertEqual(post.comments[0].content, comment1.content)
self.assertEqual(post.comments[1].content, comment2.content)
BlogPost.drop_collection() BlogPost.drop_collection()
def test_reverse_list_sorting(self): def test_reverse_list_sorting(self):