mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
Fixed #3400 -- Support for lookup separator with list_filter admin option. Thanks to DrMeers and vitek_pliska for the patch!
git-svn-id: http://code.djangoproject.com/svn/django/trunk@14674 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
@@ -19,6 +19,7 @@ from django.utils import formats
|
||||
from django.utils.cache import get_max_age
|
||||
from django.utils.encoding import iri_to_uri
|
||||
from django.utils.html import escape
|
||||
from django.utils.http import urlencode
|
||||
from django.utils.translation import activate, deactivate
|
||||
from django.utils import unittest
|
||||
|
||||
@@ -27,11 +28,12 @@ from models import Article, BarAccount, CustomArticle, EmptyModel, \
|
||||
FooAccount, Gallery, ModelWithStringPrimaryKey, \
|
||||
Person, Persona, Picture, Podcast, Section, Subscriber, Vodcast, \
|
||||
Language, Collector, Widget, Grommet, DooHickey, FancyDoodad, Whatsit, \
|
||||
Category, Post, Plot, FunkyTag
|
||||
Category, Post, Plot, FunkyTag, Chapter, Book, Promo
|
||||
|
||||
|
||||
class AdminViewBasicTest(TestCase):
|
||||
fixtures = ['admin-views-users.xml', 'admin-views-colors.xml', 'admin-views-fabrics.xml']
|
||||
fixtures = ['admin-views-users.xml', 'admin-views-colors.xml',
|
||||
'admin-views-fabrics.xml', 'admin-views-books.xml']
|
||||
|
||||
# Store the bit of the URL where the admin is registered as a class
|
||||
# variable. That way we can test a second AdminSite just by subclassing
|
||||
@@ -204,7 +206,9 @@ class AdminViewBasicTest(TestCase):
|
||||
)
|
||||
|
||||
def testLimitedFilter(self):
|
||||
"""Ensure admin changelist filters do not contain objects excluded via limit_choices_to."""
|
||||
"""Ensure admin changelist filters do not contain objects excluded via limit_choices_to.
|
||||
This also tests relation-spanning filters (e.g. 'color__value').
|
||||
"""
|
||||
response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit)
|
||||
self.failUnlessEqual(response.status_code, 200)
|
||||
self.failUnless(
|
||||
@@ -216,6 +220,47 @@ class AdminViewBasicTest(TestCase):
|
||||
"Changelist filter not correctly limited by limit_choices_to."
|
||||
)
|
||||
|
||||
def testRelationSpanningFilters(self):
|
||||
response = self.client.get('/test_admin/%s/admin_views/chapterxtra1/' %
|
||||
self.urlbit)
|
||||
self.failUnlessEqual(response.status_code, 200)
|
||||
self.assertContains(response, '<div id="changelist-filter">')
|
||||
filters = {
|
||||
'chap__id__exact': dict(
|
||||
values=[c.id for c in Chapter.objects.all()],
|
||||
test=lambda obj, value: obj.chap.id == value),
|
||||
'chap__title': dict(
|
||||
values=[c.title for c in Chapter.objects.all()],
|
||||
test=lambda obj, value: obj.chap.title == value),
|
||||
'chap__book__id__exact': dict(
|
||||
values=[b.id for b in Book.objects.all()],
|
||||
test=lambda obj, value: obj.chap.book.id == value),
|
||||
'chap__book__name': dict(
|
||||
values=[b.name for b in Book.objects.all()],
|
||||
test=lambda obj, value: obj.chap.book.name == value),
|
||||
'chap__book__promo__id__exact': dict(
|
||||
values=[p.id for p in Promo.objects.all()],
|
||||
test=lambda obj, value:
|
||||
obj.chap.book.promo_set.filter(id=value).exists()),
|
||||
'chap__book__promo__name': dict(
|
||||
values=[p.name for p in Promo.objects.all()],
|
||||
test=lambda obj, value:
|
||||
obj.chap.book.promo_set.filter(name=value).exists()),
|
||||
}
|
||||
for filter_path, params in filters.items():
|
||||
for value in params['values']:
|
||||
query_string = urlencode({filter_path: value})
|
||||
# ensure filter link exists
|
||||
self.assertContains(response, '<a href="?%s">' % query_string)
|
||||
# ensure link works
|
||||
filtered_response = self.client.get(
|
||||
'/test_admin/%s/admin_views/chapterxtra1/?%s' % (
|
||||
self.urlbit, query_string))
|
||||
self.failUnlessEqual(filtered_response.status_code, 200)
|
||||
# ensure changelist contains only valid objects
|
||||
for obj in filtered_response.context['cl'].query_set.all():
|
||||
self.assertTrue(params['test'](obj, value))
|
||||
|
||||
def testIncorrectLookupParameters(self):
|
||||
"""Ensure incorrect lookup parameters are handled gracefully."""
|
||||
response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'notarealfield': '5'})
|
||||
|
||||
Reference in New Issue
Block a user