summaryrefslogtreecommitdiff
path: root/tests/admin_filters
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2017-05-06 10:56:28 -0400
committerTim Graham <timograham@gmail.com>2018-03-20 12:10:10 -0400
commit5fa4f40f45fcdbb7e48489ed3039a314b5c961d0 (patch)
tree272b8798d2c2a054f56d8613a42453bce30f92c0 /tests/admin_filters
parent73f7d1755ff1da3aac687c7b046e4b5028e505db (diff)
downloaddjango-5fa4f40f45fcdbb7e48489ed3039a314b5c961d0.tar.gz
Fixed #29227 -- Allowed BooleanField to be null=True.
Thanks Lynn Cyrin for contributing to the patch, and Nick Pope for review.
Diffstat (limited to 'tests/admin_filters')
-rw-r--r--tests/admin_filters/models.py3
-rw-r--r--tests/admin_filters/tests.py56
2 files changed, 58 insertions, 1 deletions
diff --git a/tests/admin_filters/models.py b/tests/admin_filters/models.py
index d9ce5c7cfd..ae78282d34 100644
--- a/tests/admin_filters/models.py
+++ b/tests/admin_filters/models.py
@@ -28,7 +28,8 @@ class Book(models.Model):
verbose_name='Employee',
blank=True, null=True,
)
- is_best_seller = models.NullBooleanField(default=0)
+ is_best_seller = models.BooleanField(default=0, null=True)
+ is_best_seller2 = models.NullBooleanField(default=0)
date_registered = models.DateField(null=True)
# This field name is intentionally 2 characters long (#16080).
no = models.IntegerField(verbose_name='number', blank=True, null=True)
diff --git a/tests/admin_filters/tests.py b/tests/admin_filters/tests.py
index 200c8c8db1..554b1a4e23 100644
--- a/tests/admin_filters/tests.py
+++ b/tests/admin_filters/tests.py
@@ -142,6 +142,10 @@ class BookAdmin(ModelAdmin):
ordering = ('-id',)
+class BookAdmin2(ModelAdmin):
+ list_filter = ('year', 'author', 'contributors', 'is_best_seller2', 'date_registered', 'no')
+
+
class BookAdminWithTupleBooleanFilter(BookAdmin):
list_filter = (
'year',
@@ -267,18 +271,22 @@ class ListFiltersTests(TestCase):
self.djangonaut_book = Book.objects.create(
title='Djangonaut: an art of living', year=2009,
author=self.alfred, is_best_seller=True, date_registered=self.today,
+ is_best_seller2=True,
)
self.bio_book = Book.objects.create(
title='Django: a biography', year=1999, author=self.alfred,
is_best_seller=False, no=207,
+ is_best_seller2=False,
)
self.django_book = Book.objects.create(
title='The Django Book', year=None, author=self.bob,
is_best_seller=None, date_registered=self.today, no=103,
+ is_best_seller2=None,
)
self.guitar_book = Book.objects.create(
title='Guitar for dummies', year=2002, is_best_seller=True,
date_registered=self.one_week_ago,
+ is_best_seller2=True,
)
self.guitar_book.contributors.set([self.bob, self.lisa])
@@ -738,6 +746,54 @@ class ListFiltersTests(TestCase):
self.assertIs(choice['selected'], True)
self.assertEqual(choice['query_string'], '?is_best_seller__isnull=True')
+ def test_booleanfieldlistfilter_nullbooleanfield(self):
+ modeladmin = BookAdmin2(Book, site)
+
+ request = self.request_factory.get('/')
+ changelist = modeladmin.get_changelist_instance(request)
+
+ request = self.request_factory.get('/', {'is_best_seller2__exact': 0})
+ changelist = modeladmin.get_changelist_instance(request)
+
+ # Make sure the correct queryset is returned
+ queryset = changelist.get_queryset(request)
+ self.assertEqual(list(queryset), [self.bio_book])
+
+ # Make sure the correct choice is selected
+ filterspec = changelist.get_filters(request)[0][3]
+ self.assertEqual(filterspec.title, 'is best seller2')
+ choice = select_by(filterspec.choices(changelist), "display", "No")
+ self.assertIs(choice['selected'], True)
+ self.assertEqual(choice['query_string'], '?is_best_seller2__exact=0')
+
+ request = self.request_factory.get('/', {'is_best_seller2__exact': 1})
+ changelist = modeladmin.get_changelist_instance(request)
+
+ # Make sure the correct queryset is returned
+ queryset = changelist.get_queryset(request)
+ self.assertEqual(list(queryset), [self.guitar_book, self.djangonaut_book])
+
+ # Make sure the correct choice is selected
+ filterspec = changelist.get_filters(request)[0][3]
+ self.assertEqual(filterspec.title, 'is best seller2')
+ choice = select_by(filterspec.choices(changelist), "display", "Yes")
+ self.assertIs(choice['selected'], True)
+ self.assertEqual(choice['query_string'], '?is_best_seller2__exact=1')
+
+ request = self.request_factory.get('/', {'is_best_seller2__isnull': 'True'})
+ changelist = modeladmin.get_changelist_instance(request)
+
+ # Make sure the correct queryset is returned
+ queryset = changelist.get_queryset(request)
+ self.assertEqual(list(queryset), [self.django_book])
+
+ # Make sure the correct choice is selected
+ filterspec = changelist.get_filters(request)[0][3]
+ self.assertEqual(filterspec.title, 'is best seller2')
+ choice = select_by(filterspec.choices(changelist), "display", "Unknown")
+ self.assertIs(choice['selected'], True)
+ self.assertEqual(choice['query_string'], '?is_best_seller2__isnull=True')
+
def test_fieldlistfilter_underscorelookup_tuple(self):
"""
Ensure ('fieldpath', ClassName ) lookups pass lookup_allowed checks