Skip to content

Commit

Permalink
Added SortedListField
Browse files Browse the repository at this point in the history
  • Loading branch information
Alberto Paro committed Apr 20, 2010
1 parent 1018b3d commit 9eacaad
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 4 deletions.
24 changes: 23 additions & 1 deletion mongodj/db/fields.py
Expand Up @@ -42,4 +42,26 @@ def get_default(self):
return self.default()
return self.default
return []


class SortedListField(ListField):
"""A ListField that sorts the contents of its list before writing to
the database in order to ensure that a sorted list is always
retrieved.
"""

_ordering = None

def __init__(self, *args, **kwargs):
if 'ordering' in kwargs.keys():
self._ordering = kwargs.pop('ordering')
super(SortedListField, self).__init__(*args, **kwargs)

def get_prep_value(self, value):
if value is None:
return None
if not isinstance(value, list):
if hasattr(value, "__iter__"):
value = list(value)
if self._ordering is not None:
return sorted(value, key=itemgetter(self._ordering))
return sorted(value)
6 changes: 4 additions & 2 deletions testproj/myapp/models.py
@@ -1,6 +1,6 @@
from django.db import models
from django.utils.translation import ugettext_lazy as _
from mongodj.db.fields import ListField
from mongodj.db.fields import ListField, SortedListField

class StringAutoField(models.AutoField):

Expand Down Expand Up @@ -82,6 +82,8 @@ class TestFieldModel(models.Model):
title = models.CharField(max_length=200)
mlist = ListField()
mlist_default = ListField(default=["a", "b"])

slist = SortedListField()
slist_default = SortedListField(default=["b", "a"])

def __unicode__(self):
return "Test special field model: %s" % (self.title)
7 changes: 6 additions & 1 deletion testproj/myapp/tests.py
Expand Up @@ -164,12 +164,17 @@ def test_complex_queries(self):

def test_fields(self):
t1 = TestFieldModel(title="p1",
mlist=["ab", "bc"])
mlist=["ab", "bc"],
slist=["bc", "ab"],
)
t1.save()

t = TestFieldModel.objects.get(id=t1.id)
self.assertEqual(t.mlist, ["ab", "bc"])
self.assertEqual(t.mlist_default, ["a", "b"])
self.assertEqual(t.slist, ["ab", "bc"])
self.assertEqual(t.slist_default, ["a", "b"])


# def test_dates_year_month_day(self):
# now = datetime.datetime.now()
Expand Down

0 comments on commit 9eacaad

Please sign in to comment.