summaryrefslogtreecommitdiff
path: root/tests/admin_filters
diff options
context:
space:
mode:
authormanav014 <dpsman13016@gmail.com>2020-09-13 18:13:21 -0700
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-09-15 09:12:14 +0200
commit580a4341cb0b4cbfc215a70afc004875a7e815f4 (patch)
treeaa00c53929e03a3e1fdc7854cccf6a2763e64f1e /tests/admin_filters
parentfed257ddff449e1bf1ce06d9a7fddb148290a6ac (diff)
downloaddjango-580a4341cb0b4cbfc215a70afc004875a7e815f4.tar.gz
Fixed #31636 -- Made BooleanFieldListFilter respect Field.choices.
Diffstat (limited to 'tests/admin_filters')
-rw-r--r--tests/admin_filters/models.py5
-rw-r--r--tests/admin_filters/tests.py70
2 files changed, 69 insertions, 6 deletions
diff --git a/tests/admin_filters/models.py b/tests/admin_filters/models.py
index cee3af5b90..f286e641de 100644
--- a/tests/admin_filters/models.py
+++ b/tests/admin_filters/models.py
@@ -31,6 +31,11 @@ class Book(models.Model):
is_best_seller = models.BooleanField(default=0, null=True)
is_best_seller2 = models.NullBooleanField(default=0)
date_registered = models.DateField(null=True)
+ availability = models.BooleanField(choices=(
+ (False, 'Paid'),
+ (True, 'Free'),
+ (None, 'Obscure'),
+ ), 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 16a7ce495c..6986afb64a 100644
--- a/tests/admin_filters/tests.py
+++ b/tests/admin_filters/tests.py
@@ -140,7 +140,7 @@ class CustomUserAdmin(UserAdmin):
class BookAdmin(ModelAdmin):
- list_filter = ('year', 'author', 'contributors', 'is_best_seller', 'date_registered', 'no')
+ list_filter = ('year', 'author', 'contributors', 'is_best_seller', 'date_registered', 'no', 'availability')
ordering = ('-id',)
@@ -156,6 +156,7 @@ class BookAdminWithTupleBooleanFilter(BookAdmin):
('is_best_seller', BooleanFieldListFilter),
'date_registered',
'no',
+ ('availability', BooleanFieldListFilter),
)
@@ -288,22 +289,22 @@ class ListFiltersTests(TestCase):
cls.djangonaut_book = Book.objects.create(
title='Djangonaut: an art of living', year=2009,
author=cls.alfred, is_best_seller=True, date_registered=cls.today,
- is_best_seller2=True,
+ is_best_seller2=True, availability=True,
)
cls.bio_book = Book.objects.create(
title='Django: a biography', year=1999, author=cls.alfred,
is_best_seller=False, no=207,
- is_best_seller2=False,
+ is_best_seller2=False, availability=False,
)
cls.django_book = Book.objects.create(
title='The Django Book', year=None, author=cls.bob,
is_best_seller=None, date_registered=cls.today, no=103,
- is_best_seller2=None,
+ is_best_seller2=None, availability=True,
)
cls.guitar_book = Book.objects.create(
title='Guitar for dummies', year=2002, is_best_seller=True,
date_registered=cls.one_week_ago,
- is_best_seller2=True,
+ is_best_seller2=True, availability=None,
)
cls.guitar_book.contributors.set([cls.bob, cls.lisa])
@@ -956,6 +957,63 @@ class ListFiltersTests(TestCase):
self.assertIs(choice['selected'], True)
self.assertEqual(choice['query_string'], '?is_best_seller__isnull=True')
+ def test_booleanfieldlistfilter_choices(self):
+ modeladmin = BookAdmin(Book, site)
+ self.verify_booleanfieldlistfilter_choices(modeladmin)
+
+ def test_booleanfieldlistfilter_tuple_choices(self):
+ modeladmin = BookAdminWithTupleBooleanFilter(Book, site)
+ self.verify_booleanfieldlistfilter_choices(modeladmin)
+
+ def verify_booleanfieldlistfilter_choices(self, modeladmin):
+ # False.
+ request = self.request_factory.get('/', {'availability__exact': 0})
+ request.user = self.alfred
+ changelist = modeladmin.get_changelist_instance(request)
+ queryset = changelist.get_queryset(request)
+ self.assertEqual(list(queryset), [self.bio_book])
+ filterspec = changelist.get_filters(request)[0][6]
+ self.assertEqual(filterspec.title, 'availability')
+ choice = select_by(filterspec.choices(changelist), 'display', 'Paid')
+ self.assertIs(choice['selected'], True)
+ self.assertEqual(choice['query_string'], '?availability__exact=0')
+ # True.
+ request = self.request_factory.get('/', {'availability__exact': 1})
+ request.user = self.alfred
+ changelist = modeladmin.get_changelist_instance(request)
+ queryset = changelist.get_queryset(request)
+ self.assertEqual(list(queryset), [self.django_book, self.djangonaut_book])
+ filterspec = changelist.get_filters(request)[0][6]
+ self.assertEqual(filterspec.title, 'availability')
+ choice = select_by(filterspec.choices(changelist), 'display', 'Free')
+ self.assertIs(choice['selected'], True)
+ self.assertEqual(choice['query_string'], '?availability__exact=1')
+ # None.
+ request = self.request_factory.get('/', {'availability__isnull': 'True'})
+ request.user = self.alfred
+ changelist = modeladmin.get_changelist_instance(request)
+ queryset = changelist.get_queryset(request)
+ self.assertEqual(list(queryset), [self.guitar_book])
+ filterspec = changelist.get_filters(request)[0][6]
+ self.assertEqual(filterspec.title, 'availability')
+ choice = select_by(filterspec.choices(changelist), 'display', 'Obscure')
+ self.assertIs(choice['selected'], True)
+ self.assertEqual(choice['query_string'], '?availability__isnull=True')
+ # All.
+ request = self.request_factory.get('/')
+ request.user = self.alfred
+ changelist = modeladmin.get_changelist_instance(request)
+ queryset = changelist.get_queryset(request)
+ self.assertEqual(
+ list(queryset),
+ [self.guitar_book, self.django_book, self.bio_book, self.djangonaut_book],
+ )
+ filterspec = changelist.get_filters(request)[0][6]
+ self.assertEqual(filterspec.title, 'availability')
+ choice = select_by(filterspec.choices(changelist), 'display', 'All')
+ self.assertIs(choice['selected'], True)
+ self.assertEqual(choice['query_string'], '?')
+
def test_booleanfieldlistfilter_nullbooleanfield(self):
modeladmin = BookAdmin2(Book, site)
@@ -1212,7 +1270,7 @@ class ListFiltersTests(TestCase):
queryset = changelist.get_queryset(request)
self.assertEqual(list(queryset), [self.bio_book])
- filterspec = changelist.get_filters(request)[0][-1]
+ filterspec = changelist.get_filters(request)[0][5]
self.assertEqual(filterspec.title, 'number')
choices = list(filterspec.choices(changelist))
self.assertIs(choices[2]['selected'], True)