summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorHonza Král <honza.kral@gmail.com>2010-11-21 19:29:15 +0000
committerHonza Král <honza.kral@gmail.com>2010-11-21 19:29:15 +0000
commitdc334a2ba8dbf5134d65c97fea2785c3b2294ef5 (patch)
treeea647738399bee77ef2578231906d95a67fe3c96 /tests
parent274aba3b9b8c48012a2d842790cb3df04dc9ae80 (diff)
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
Diffstat (limited to 'tests')
-rw-r--r--tests/regressiontests/admin_views/customadmin.py1
-rw-r--r--tests/regressiontests/admin_views/fixtures/admin-views-books.xml45
-rw-r--r--tests/regressiontests/admin_views/models.py12
-rw-r--r--tests/regressiontests/admin_views/tests.py51
-rw-r--r--tests/regressiontests/modeladmin/tests.py2
5 files changed, 105 insertions, 6 deletions
diff --git a/tests/regressiontests/admin_views/customadmin.py b/tests/regressiontests/admin_views/customadmin.py
index 34e39ef0ca..8cd262b860 100644
--- a/tests/regressiontests/admin_views/customadmin.py
+++ b/tests/regressiontests/admin_views/customadmin.py
@@ -32,3 +32,4 @@ site.register(models.Article, models.ArticleAdmin)
site.register(models.Section, inlines=[models.ArticleInline])
site.register(models.Thing, models.ThingAdmin)
site.register(models.Fabric, models.FabricAdmin)
+site.register(models.ChapterXtra1, models.ChapterXtra1Admin)
diff --git a/tests/regressiontests/admin_views/fixtures/admin-views-books.xml b/tests/regressiontests/admin_views/fixtures/admin-views-books.xml
new file mode 100644
index 0000000000..37ded89900
--- /dev/null
+++ b/tests/regressiontests/admin_views/fixtures/admin-views-books.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<django-objects version="1.0">
+ <object pk="1" model="admin_views.book">
+ <field type="CharField" name="name">Book 1</field>
+ </object>
+ <object pk="2" model="admin_views.book">
+ <field type="CharField" name="name">Book 2</field>
+ </object>
+ <object pk="1" model="admin_views.promo">
+ <field type="CharField" name="name">Promo 1</field>
+ <field type="ForiegnKey" name="book">1</field>
+ </object>
+ <object pk="2" model="admin_views.promo">
+ <field type="CharField" name="name">Promo 2</field>
+ <field type="ForiegnKey" name="book">2</field>
+ </object>
+ <object pk="1" model="admin_views.chapter">
+ <field type="CharField" name="title">Chapter 1</field>
+ <field type="TextField" name="content">[ insert contents here ]</field>
+ <field type="ForiegnKey" name="book">1</field>
+ </object>
+ <object pk="2" model="admin_views.chapter">
+ <field type="CharField" name="title">Chapter 2</field>
+ <field type="TextField" name="content">[ insert contents here ]</field>
+ <field type="ForiegnKey" name="book">1</field>
+ </object>
+ <object pk="3" model="admin_views.chapter">
+ <field type="CharField" name="title">Chapter 1</field>
+ <field type="TextField" name="content">[ insert contents here ]</field>
+ <field type="ForiegnKey" name="book">2</field>
+ </object>
+ <object pk="4" model="admin_views.chapter">
+ <field type="CharField" name="title">Chapter 2</field>
+ <field type="TextField" name="content">[ insert contents here ]</field>
+ <field type="ForiegnKey" name="book">2</field>
+ </object>
+ <object pk="1" model="admin_views.chapterxtra1">
+ <field type="CharField" name="xtra">ChapterXtra1 1</field>
+ <field type="ForiegnKey" name="chap">1</field>
+ </object>
+ <object pk="2" model="admin_views.chapterxtra1">
+ <field type="CharField" name="xtra">ChapterXtra1 2</field>
+ <field type="ForiegnKey" name="chap">3</field>
+ </object>
+</django-objects>
diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py
index ee0f5d51a1..61ca33904c 100644
--- a/tests/regressiontests/admin_views/models.py
+++ b/tests/regressiontests/admin_views/models.py
@@ -90,6 +90,14 @@ class ArticleInline(admin.TabularInline):
class ChapterInline(admin.TabularInline):
model = Chapter
+class ChapterXtra1Admin(admin.ModelAdmin):
+ list_filter = ('chap',
+ 'chap__title',
+ 'chap__book',
+ 'chap__book__name',
+ 'chap__book__promo',
+ 'chap__book__promo__name',)
+
class ArticleAdmin(admin.ModelAdmin):
list_display = ('content', 'date', callable_year, 'model_year', 'modeladmin_year')
list_filter = ('date',)
@@ -168,7 +176,7 @@ class Thing(models.Model):
return self.title
class ThingAdmin(admin.ModelAdmin):
- list_filter = ('color',)
+ list_filter = ('color', 'color__warm', 'color__value')
class Fabric(models.Model):
NG_CHOICES = (
@@ -646,7 +654,7 @@ admin.site.register(CyclicTwo)
# contrib.admin.util's get_deleted_objects function.
admin.site.register(Book, inlines=[ChapterInline])
admin.site.register(Promo)
-admin.site.register(ChapterXtra1)
+admin.site.register(ChapterXtra1, ChapterXtra1Admin)
admin.site.register(Pizza, PizzaAdmin)
admin.site.register(Topping)
admin.site.register(Album)
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index a3fe34f0bf..79a29d8ab0 100644
--- a/tests/regressiontests/admin_views/tests.py
+++ b/tests/regressiontests/admin_views/tests.py
@@ -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'})
diff --git a/tests/regressiontests/modeladmin/tests.py b/tests/regressiontests/modeladmin/tests.py
index 762517a3ae..042c1b75ea 100644
--- a/tests/regressiontests/modeladmin/tests.py
+++ b/tests/regressiontests/modeladmin/tests.py
@@ -835,7 +835,7 @@ class ValidationTests(unittest.TestCase):
self.assertRaisesRegexp(
ImproperlyConfigured,
- "'ValidationTestModelAdmin.list_filter\[0\]' refers to field 'non_existent_field' that is missing from model 'ValidationTestModel'.",
+ "'ValidationTestModelAdmin.list_filter\[0\]' refers to 'non_existent_field' which does not refer to a Field.",
validate,
ValidationTestModelAdmin,
ValidationTestModel,