summaryrefslogtreecommitdiff
path: root/tests/regressiontests
diff options
context:
space:
mode:
authorJulien Phalip <jphalip@gmail.com>2011-11-22 12:26:17 +0000
committerJulien Phalip <jphalip@gmail.com>2011-11-22 12:26:17 +0000
commita89b15628429da79dd47c04bd191de566ef7eee6 (patch)
treea967d2255d3df3f7af0d53460e1c6d8eacb9d35f /tests/regressiontests
parente71f33625c5979459e50644c700c04d8a27c4f4d (diff)
Disentangled some parts of the admin ChangeList and ListFilter's internals. With this refactoring, the query string lookups are now processed once instead of twice and some bugs (in particular the SimpleListFilter parameter name being mistaken for a model field in some cases) are avoided.
Refs #17091. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17145 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests/regressiontests')
-rw-r--r--tests/regressiontests/admin_filters/tests.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/regressiontests/admin_filters/tests.py b/tests/regressiontests/admin_filters/tests.py
index 28693aef98..4988e57e61 100644
--- a/tests/regressiontests/admin_filters/tests.py
+++ b/tests/regressiontests/admin_filters/tests.py
@@ -68,6 +68,14 @@ class DecadeListFilterWithQuerysetBasedLookups(DecadeListFilterWithTitleAndParam
if qs.filter(year__gte=2000, year__lte=2009).exists():
yield ('the 00s', "the 2000's")
+class DecadeListFilterParameterEndsWith__In(DecadeListFilter):
+ title = 'publication decade'
+ parameter_name = 'decade__in' # Ends with '__in"
+
+class DecadeListFilterParameterEndsWith__Isnull(DecadeListFilter):
+ title = 'publication decade'
+ parameter_name = 'decade__isnull' # Ends with '__isnull"
+
class CustomUserAdmin(UserAdmin):
list_filter = ('books_authored', 'books_contributed')
@@ -97,6 +105,12 @@ class DecadeFilterBookAdminWithFailingQueryset(ModelAdmin):
class DecadeFilterBookAdminWithQuerysetBasedLookups(ModelAdmin):
list_filter = (DecadeListFilterWithQuerysetBasedLookups,)
+class DecadeFilterBookAdminParameterEndsWith__In(ModelAdmin):
+ list_filter = (DecadeListFilterParameterEndsWith__In,)
+
+class DecadeFilterBookAdminParameterEndsWith__Isnull(ModelAdmin):
+ list_filter = (DecadeListFilterParameterEndsWith__Isnull,)
+
class ListFiltersTests(TestCase):
def setUp(self):
@@ -570,3 +584,44 @@ class ListFiltersTests(TestCase):
choices = list(filterspec.choices(changelist))
self.assertEqual(choices[2]['selected'], True)
self.assertEqual(choices[2]['query_string'], '?no=207')
+
+ def test_parameter_ends_with__in__or__isnull(self):
+ """
+ Ensure that a SimpleListFilter's parameter name is not mistaken for a
+ model field if it ends with '__isnull' or '__in'.
+ Refs #17091.
+ """
+
+ # When it ends with '__in' -----------------------------------------
+ modeladmin = DecadeFilterBookAdminParameterEndsWith__In(Book, site)
+ request = self.request_factory.get('/', {'decade__in': 'the 90s'})
+ changelist = self.get_changelist(request, Book, modeladmin)
+
+ # Make sure the correct queryset is returned
+ queryset = changelist.get_query_set(request)
+ self.assertEqual(list(queryset), [self.bio_book])
+
+ # Make sure the correct choice is selected
+ filterspec = changelist.get_filters(request)[0][0]
+ self.assertEqual(force_unicode(filterspec.title), u'publication decade')
+ choices = list(filterspec.choices(changelist))
+ self.assertEqual(choices[2]['display'], u'the 1990\'s')
+ self.assertEqual(choices[2]['selected'], True)
+ self.assertEqual(choices[2]['query_string'], '?decade__in=the+90s')
+
+ # When it ends with '__isnull' ---------------------------------------
+ modeladmin = DecadeFilterBookAdminParameterEndsWith__Isnull(Book, site)
+ request = self.request_factory.get('/', {'decade__isnull': 'the 90s'})
+ changelist = self.get_changelist(request, Book, modeladmin)
+
+ # Make sure the correct queryset is returned
+ queryset = changelist.get_query_set(request)
+ self.assertEqual(list(queryset), [self.bio_book])
+
+ # Make sure the correct choice is selected
+ filterspec = changelist.get_filters(request)[0][0]
+ self.assertEqual(force_unicode(filterspec.title), u'publication decade')
+ choices = list(filterspec.choices(changelist))
+ self.assertEqual(choices[2]['display'], u'the 1990\'s')
+ self.assertEqual(choices[2]['selected'], True)
+ self.assertEqual(choices[2]['query_string'], '?decade__isnull=the+90s') \ No newline at end of file