diff options
author | Fran Hrzenjak <fran.hrzenjak@gmail.com> | 2020-05-19 09:03:04 +0200 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-05-20 21:08:47 +0200 |
commit | 4484bc1b2f84da6442c9c2bfd95d3f1f7d8f96f7 (patch) | |
tree | 56d1abde6d02f60cdf6a148071325415636e68e5 /tests/admin_changelist | |
parent | 3460ea49e839fd6bb924c48eaa1cd3d6dc888035 (diff) | |
download | django-4484bc1b2f84da6442c9c2bfd95d3f1f7d8f96f7.tar.gz |
Fixed #31597, #31603 -- Corrected admin clear all filters link behavior.
- Show "Clear all filters" only when any filter is selected.
- Preserve query string not related with filters.
Co-Authored-By: Hasan Ramezani <hasan.r67@gmail.com>
Diffstat (limited to 'tests/admin_changelist')
-rw-r--r-- | tests/admin_changelist/admin.py | 27 | ||||
-rw-r--r-- | tests/admin_changelist/test_date_hierarchy.py | 2 | ||||
-rw-r--r-- | tests/admin_changelist/tests.py | 66 |
3 files changed, 86 insertions, 9 deletions
diff --git a/tests/admin_changelist/admin.py b/tests/admin_changelist/admin.py index 1194f26dd4..890919557e 100644 --- a/tests/admin_changelist/admin.py +++ b/tests/admin_changelist/admin.py @@ -3,7 +3,7 @@ from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User from django.core.paginator import Paginator -from .models import Child, Event, Parent, Swallow +from .models import Band, Child, Event, Parent, Swallow site = admin.AdminSite(name="admin") @@ -59,6 +59,31 @@ class BandAdmin(admin.ModelAdmin): list_filter = ['genres'] +class NrOfMembersFilter(admin.SimpleListFilter): + title = 'number of members' + parameter_name = 'nr_of_members_partition' + + def lookups(self, request, model_admin): + return [ + ('5', '0 - 5'), + ('more', 'more than 5'), + ] + + def queryset(self, request, queryset): + value = self.value() + if value == '5': + return queryset.filter(nr_of_members__lte=5) + if value == 'more': + return queryset.filter(nr_of_members__gt=5) + + +class BandCallableFilterAdmin(admin.ModelAdmin): + list_filter = [NrOfMembersFilter] + + +site.register(Band, BandCallableFilterAdmin) + + class GroupAdmin(admin.ModelAdmin): list_filter = ['members'] diff --git a/tests/admin_changelist/test_date_hierarchy.py b/tests/admin_changelist/test_date_hierarchy.py index 65f42ecd05..a321650b32 100644 --- a/tests/admin_changelist/test_date_hierarchy.py +++ b/tests/admin_changelist/test_date_hierarchy.py @@ -21,7 +21,7 @@ class DateHierarchyTests(TestCase): request = self.factory.get('/', query) request.user = self.superuser changelist = EventAdmin(Event, custom_site).get_changelist_instance(request) - _, _, lookup_params, _ = changelist.get_filters(request) + _, _, lookup_params, *_ = changelist.get_filters(request) self.assertEqual(lookup_params['date__gte'], expected_from_date) self.assertEqual(lookup_params['date__lt'], expected_to_date) diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py index 53871e1a5b..38143bf592 100644 --- a/tests/admin_changelist/tests.py +++ b/tests/admin_changelist/tests.py @@ -5,7 +5,9 @@ from django.contrib.admin.models import LogEntry from django.contrib.admin.options import IncorrectLookupParameters from django.contrib.admin.templatetags.admin_list import pagination from django.contrib.admin.tests import AdminSeleniumTestCase -from django.contrib.admin.views.main import ALL_VAR, SEARCH_VAR +from django.contrib.admin.views.main import ( + ALL_VAR, IS_POPUP_VAR, ORDER_VAR, PAGE_VAR, SEARCH_VAR, TO_FIELD_VAR, +) from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.contrib.messages.storage.cookie import CookieStorage @@ -708,15 +710,65 @@ class ChangeListTests(TestCase): def test_clear_all_filters_link(self): self.client.force_login(self.superuser) - link = '<a href="?">✖ Clear all filters</a>' - response = self.client.get(reverse('admin:auth_user_changelist')) - self.assertNotContains(response, link) + url = reverse('admin:auth_user_changelist') + response = self.client.get(url) + self.assertNotContains(response, '✖ Clear all filters') + link = '<a href="%s">✖ Clear all filters</a>' + for data, href in ( + ({'is_staff__exact': '0'}, '?'), + ( + {'is_staff__exact': '0', 'username__startswith': 'test'}, + '?username__startswith=test', + ), + ( + {'is_staff__exact': '0', SEARCH_VAR: 'test'}, + '?%s=test' % SEARCH_VAR, + ), + ( + {'is_staff__exact': '0', IS_POPUP_VAR: 'id'}, + '?%s=id' % IS_POPUP_VAR, + ), + ): + with self.subTest(data=data): + response = self.client.get(url, data=data) + self.assertContains(response, link % href) + + def test_clear_all_filters_link_callable_filter(self): + self.client.force_login(self.superuser) + url = reverse('admin:admin_changelist_band_changelist') + response = self.client.get(url) + self.assertNotContains(response, '✖ Clear all filters') + link = '<a href="%s">✖ Clear all filters</a>' + for data, href in ( + ({'nr_of_members_partition': '5'}, '?'), + ( + {'nr_of_members_partition': 'more', 'name__startswith': 'test'}, + '?name__startswith=test', + ), + ( + {'nr_of_members_partition': '5', IS_POPUP_VAR: 'id'}, + '?%s=id' % IS_POPUP_VAR, + ), + ): + with self.subTest(data=data): + response = self.client.get(url, data=data) + self.assertContains(response, link % href) + + def test_no_clear_all_filters_link(self): + self.client.force_login(self.superuser) + url = reverse('admin:auth_user_changelist') + link = '>✖ Clear all filters</a>' for data in ( {SEARCH_VAR: 'test'}, - {'is_staff__exact': '0'}, + {ORDER_VAR: '-1'}, + {TO_FIELD_VAR: 'id'}, + {PAGE_VAR: '1'}, + {IS_POPUP_VAR: '1'}, + {'username__startswith': 'test'}, ): - response = self.client.get(reverse('admin:auth_user_changelist'), data=data) - self.assertContains(response, link) + with self.subTest(data=data): + response = self.client.get(url, data=data) + self.assertNotContains(response, link) def test_tuple_list_display(self): swallow = Swallow.objects.create(origin='Africa', load='12.34', speed='22.2') |