Merge pull request #105 from linovia/develop

Filtering against 0 returns the full queryset
This commit is contained in:
Florian Apolloner 2013-07-04 05:42:55 -07:00
commit 7ddc3fc7d6
3 changed files with 40 additions and 4 deletions

View File

@ -63,8 +63,6 @@ class Filter(object):
return self._field
def filter(self, qs, value):
if not value:
return qs
if isinstance(value, (list, tuple)):
lookup = six.text_type(value[1])
if not lookup:
@ -72,8 +70,9 @@ class Filter(object):
value = value[0]
else:
lookup = self.lookup_type
if value:
qs = qs.filter(**{'%s__%s' % (self.name, lookup): value})
if value in ([], (), {}, None, ''):
return qs
qs = qs.filter(**{'%s__%s' % (self.name, lookup): value})
if self.distinct:
qs = qs.distinct()
return qs

View File

@ -31,6 +31,7 @@ from .models import Article
from .models import Company
from .models import Location
from .models import Account
from .models import BankAccount
from .models import Profile
from .models import Node
from .models import DirectedNode
@ -60,6 +61,32 @@ class CharFilterTests(TestCase):
self.assertQuerysetEqual(f.qs, [b3.pk], lambda o: o.pk)
class IntegerFilterTest(TestCase):
def test_filtering(self):
default_values = {
'in_good_standing': True,
'friendly': False,
}
b1 = BankAccount.objects.create(amount_saved=0, **default_values)
b2 = BankAccount.objects.create(amount_saved=3, **default_values)
b3 = BankAccount.objects.create(amount_saved=10, **default_values)
class F(FilterSet):
class Meta:
model = BankAccount
fields = ['amount_saved']
qs = BankAccount.objects.all()
f = F(queryset=qs)
self.assertQuerysetEqual(f.qs, [b1.pk, b2.pk, b3.pk],
lambda o: o.pk, ordered=False)
f = F({'amount_saved': '10'}, queryset=qs)
self.assertQuerysetEqual(f.qs, [b3.pk], lambda o: o.pk)
f = F({'amount_saved': '0'}, queryset=qs)
self.assertQuerysetEqual(f.qs, [b1.pk], lambda o: o.pk)
class BooleanFilterTests(TestCase):
def test_filtering(self):

View File

@ -309,6 +309,16 @@ class NumberFilterTests(TestCase):
field = f.field
self.assertIsInstance(field, forms.DecimalField)
def test_filtering(self):
qs = mock.Mock(spec=['filter'])
f = NumberFilter()
f.filter(qs, 1)
qs.filter.assert_called_once_with(None__exact=1)
# Also test 0 as it once had a bug
qs.reset_mock()
f.filter(qs, 0)
qs.filter.assert_called_once_with(None__exact=0)
class RangeFilterTests(TestCase):