diff options
author | Tim Graham <timograham@gmail.com> | 2017-05-06 10:56:28 -0400 |
---|---|---|
committer | Tim Graham <timograham@gmail.com> | 2018-03-20 12:10:10 -0400 |
commit | 5fa4f40f45fcdbb7e48489ed3039a314b5c961d0 (patch) | |
tree | 272b8798d2c2a054f56d8613a42453bce30f92c0 /tests/admin_filters | |
parent | 73f7d1755ff1da3aac687c7b046e4b5028e505db (diff) | |
download | django-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.py | 3 | ||||
-rw-r--r-- | tests/admin_filters/tests.py | 56 |
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 |