diff --git a/AUTHORS b/AUTHORS index 274fe1e9..d36d3f2f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -77,3 +77,4 @@ that much better: * jpfarias * jonrscott * Alice Zoƫ Bevan-McGregor + * Stephen Young diff --git a/docs/changelog.rst b/docs/changelog.rst index 4acc8c17..c040f0bb 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,7 @@ Changelog Changes in dev ============== +- Added reverse option to SortedListFields - Fixed dereferencing - multi directional list dereferencing - Fixed issue creating indexes with recursive embedded documents - Fixed recursive lookup in _unique_with_indexes diff --git a/mongoengine/fields.py b/mongoengine/fields.py index a0dcdb20..cf72e78b 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -511,20 +511,24 @@ class SortedListField(ListField): retrieved. .. versionadded:: 0.4 + .. versionchanged:: 0.6 - added reverse keyword """ _ordering = None + _order_reverse = False def __init__(self, field, **kwargs): if 'ordering' in kwargs.keys(): self._ordering = kwargs.pop('ordering') + if 'reverse' in kwargs.keys(): + self._order_reverse = kwargs.pop('reverse') super(SortedListField, self).__init__(field, **kwargs) def to_mongo(self, value): value = super(SortedListField, self).to_mongo(value) if self._ordering is not None: - return sorted(value, key=itemgetter(self._ordering)) - return sorted(value) + return sorted(value, key=itemgetter(self._ordering), reverse=self._order_reverse) + return sorted(value, reverse=self._order_reverse) class DictField(ComplexBaseField): diff --git a/tests/fields.py b/tests/fields.py index 3a2e7a32..0bc15a3c 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -481,6 +481,31 @@ class FieldTest(unittest.TestCase): BlogPost.drop_collection() + def test_reverse_list_sorting(self): + '''Ensure that a reverse sorted list field properly sorts values''' + + class Category(EmbeddedDocument): + count = IntField() + name = StringField() + + class CategoryList(Document): + categories = SortedListField(EmbeddedDocumentField(Category), ordering='count', reverse=True) + name = StringField() + + catlist = CategoryList(name="Top categories") + cat1 = Category(name='posts', count=10) + cat2 = Category(name='food', count=100) + cat3 = Category(name='drink', count=40) + catlist.categories = [cat1, cat2, cat3] + catlist.save() + catlist.reload() + + self.assertEqual(catlist.categories[0].name, cat2.name) + self.assertEqual(catlist.categories[1].name, cat3.name) + self.assertEqual(catlist.categories[2].name, cat1.name) + + CategoryList.drop_collection() + def test_list_field(self): """Ensure that list types work as expected. """