diff options
| author | Honza Král <honza.kral@gmail.com> | 2010-11-21 19:29:15 +0000 |
|---|---|---|
| committer | Honza Král <honza.kral@gmail.com> | 2010-11-21 19:29:15 +0000 |
| commit | dc334a2ba8dbf5134d65c97fea2785c3b2294ef5 (patch) | |
| tree | ea647738399bee77ef2578231906d95a67fe3c96 /tests | |
| parent | 274aba3b9b8c48012a2d842790cb3df04dc9ae80 (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.py | 1 | ||||
| -rw-r--r-- | tests/regressiontests/admin_views/fixtures/admin-views-books.xml | 45 | ||||
| -rw-r--r-- | tests/regressiontests/admin_views/models.py | 12 | ||||
| -rw-r--r-- | tests/regressiontests/admin_views/tests.py | 51 | ||||
| -rw-r--r-- | tests/regressiontests/modeladmin/tests.py | 2 |
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, |
