summaryrefslogtreecommitdiff
path: root/tests/admin_changelist
diff options
context:
space:
mode:
authorFran Hrzenjak <fran.hrzenjak@gmail.com>2020-05-19 09:03:04 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-05-20 21:08:47 +0200
commit4484bc1b2f84da6442c9c2bfd95d3f1f7d8f96f7 (patch)
tree56d1abde6d02f60cdf6a148071325415636e68e5 /tests/admin_changelist
parent3460ea49e839fd6bb924c48eaa1cd3d6dc888035 (diff)
downloaddjango-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.py27
-rw-r--r--tests/admin_changelist/test_date_hierarchy.py2
-rw-r--r--tests/admin_changelist/tests.py66
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="?">&#10006; 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, '&#10006; Clear all filters')
+ link = '<a href="%s">&#10006; 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, '&#10006; Clear all filters')
+ link = '<a href="%s">&#10006; 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 = '>&#10006; 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')