summaryrefslogtreecommitdiff
path: root/tests/admin_ordering
diff options
context:
space:
mode:
authorJuan Pedro Fisanotti <fisadev@gmail.com>2013-02-23 15:02:01 -0300
committerRamiro Morales <cramm0@gmail.com>2013-03-04 18:08:53 -0300
commitd9330d5be2ee60b208dcab2616eb164ea2e6bf36 (patch)
tree576f70d784d3ac01e72f7f5aad48704ffb59d249 /tests/admin_ordering
parent3ea0c7d35ac461cb469170486683d10732eb534b (diff)
downloaddjango-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.py1
-rw-r--r--tests/admin_ordering/tests.py48
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)