Added Reverse option to SortedLists

Thanks Stephen Young for the patch
closes #364
This commit is contained in:
Ross Lawley 2011-11-30 02:15:47 -08:00
parent fbe8b28b2e
commit 6cef571bfb
4 changed files with 33 additions and 2 deletions

View File

@ -77,3 +77,4 @@ that much better:
* jpfarias * jpfarias
* jonrscott * jonrscott
* Alice Zoë Bevan-McGregor * Alice Zoë Bevan-McGregor
* Stephen Young

View File

@ -5,6 +5,7 @@ Changelog
Changes in dev Changes in dev
============== ==============
- Added reverse option to SortedListFields
- Fixed dereferencing - multi directional list dereferencing - Fixed dereferencing - multi directional list dereferencing
- Fixed issue creating indexes with recursive embedded documents - Fixed issue creating indexes with recursive embedded documents
- Fixed recursive lookup in _unique_with_indexes - Fixed recursive lookup in _unique_with_indexes

View File

@ -511,20 +511,24 @@ class SortedListField(ListField):
retrieved. retrieved.
.. versionadded:: 0.4 .. versionadded:: 0.4
.. versionchanged:: 0.6 - added reverse keyword
""" """
_ordering = None _ordering = None
_order_reverse = False
def __init__(self, field, **kwargs): def __init__(self, field, **kwargs):
if 'ordering' in kwargs.keys(): if 'ordering' in kwargs.keys():
self._ordering = kwargs.pop('ordering') self._ordering = kwargs.pop('ordering')
if 'reverse' in kwargs.keys():
self._order_reverse = kwargs.pop('reverse')
super(SortedListField, self).__init__(field, **kwargs) super(SortedListField, self).__init__(field, **kwargs)
def to_mongo(self, value): def to_mongo(self, value):
value = super(SortedListField, self).to_mongo(value) value = super(SortedListField, self).to_mongo(value)
if self._ordering is not None: if self._ordering is not None:
return sorted(value, key=itemgetter(self._ordering)) return sorted(value, key=itemgetter(self._ordering), reverse=self._order_reverse)
return sorted(value) return sorted(value, reverse=self._order_reverse)
class DictField(ComplexBaseField): class DictField(ComplexBaseField):

View File

@ -481,6 +481,31 @@ class FieldTest(unittest.TestCase):
BlogPost.drop_collection() 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): def test_list_field(self):
"""Ensure that list types work as expected. """Ensure that list types work as expected.
""" """