diff options
author | Juan Pedro Fisanotti <fisadev@gmail.com> | 2013-02-23 15:02:01 -0300 |
---|---|---|
committer | Ramiro Morales <cramm0@gmail.com> | 2013-03-04 18:08:53 -0300 |
commit | d9330d5be2ee60b208dcab2616eb164ea2e6bf36 (patch) | |
tree | 576f70d784d3ac01e72f7f5aad48704ffb59d249 /tests/admin_ordering | |
parent | 3ea0c7d35ac461cb469170486683d10732eb534b (diff) | |
download | django-d9330d5be2ee60b208dcab2616eb164ea2e6bf36.tar.gz |
Fixed #6585 -- Admin relationship widgets: Respect ordering defined by target model's ModelAdmin.
Thanks Gary Wilson for the report and Juan Pedro Fisanotti, Carlos
MatÃas de la Torre for the fix.
Diffstat (limited to 'tests/admin_ordering')
-rw-r--r-- | tests/admin_ordering/models.py | 1 | ||||
-rw-r--r-- | tests/admin_ordering/tests.py | 48 |
2 files changed, 49 insertions, 0 deletions
diff --git a/tests/admin_ordering/models.py b/tests/admin_ordering/models.py index 195b3c3694..3da52b1b00 100644 --- a/tests/admin_ordering/models.py +++ b/tests/admin_ordering/models.py @@ -15,6 +15,7 @@ class Song(models.Model): band = models.ForeignKey(Band) name = models.CharField(max_length=100) duration = models.IntegerField() + other_interpreters = models.ManyToManyField(Band, related_name='covers') class Meta: ordering = ('name',) diff --git a/tests/admin_ordering/tests.py b/tests/admin_ordering/tests.py index faae834f93..10faa9533f 100644 --- a/tests/admin_ordering/tests.py +++ b/tests/admin_ordering/tests.py @@ -1,6 +1,7 @@ from __future__ import absolute_import, unicode_literals from django.test import TestCase, RequestFactory +from django.contrib import admin from django.contrib.admin.options import ModelAdmin from django.contrib.auth.models import User @@ -104,3 +105,50 @@ class TestInlineModelAdminOrdering(TestCase): inline = SongInlineNewOrdering(self.b, None) names = [s.name for s in inline.queryset(request)] self.assertEqual(['Jaded', 'Pink', 'Dude (Looks Like a Lady)'], names) + + +class TestRelatedFieldsAdminOrdering(TestCase): + def setUp(self): + self.b1 = Band(name='Pink Floyd', bio='', rank=1) + self.b1.save() + self.b2 = Band(name='Foo Fighters', bio='', rank=5) + self.b2.save() + + # we need to register a custom ModelAdmin (instead of just using + # ModelAdmin) because the field creator tries to find the ModelAdmin + # for the related model + class SongAdmin(admin.ModelAdmin): + pass + admin.site.register(Song, SongAdmin) + + def check_ordering_of_field_choices(self, correct_ordering): + fk_field = admin.site._registry[Song].formfield_for_foreignkey(Song.band.field) + m2m_field = admin.site._registry[Song].formfield_for_manytomany(Song.other_interpreters.field) + + self.assertEqual(list(fk_field.queryset), correct_ordering) + self.assertEqual(list(m2m_field.queryset), correct_ordering) + + def test_no_admin_fallback_to_model_ordering(self): + # should be ordered by name (as defined by the model) + self.check_ordering_of_field_choices([self.b2, self.b1]) + + def test_admin_with_no_ordering_fallback_to_model_ordering(self): + class NoOrderingBandAdmin(admin.ModelAdmin): + pass + admin.site.register(Band, NoOrderingBandAdmin) + + # should be ordered by name (as defined by the model) + self.check_ordering_of_field_choices([self.b2, self.b1]) + + def test_admin_ordering_beats_model_ordering(self): + class StaticOrderingBandAdmin(admin.ModelAdmin): + ordering = ('rank', ) + admin.site.register(Band, StaticOrderingBandAdmin) + + # should be ordered by rank (defined by the ModelAdmin) + self.check_ordering_of_field_choices([self.b1, self.b2]) + + def tearDown(self): + admin.site.unregister(Song) + if Band in admin.site._registry: + admin.site.unregister(Band) |