tests.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. from __future__ import absolute_import, unicode_literals
  2. from django.test import TestCase, RequestFactory
  3. from django.contrib import admin
  4. from django.contrib.admin.options import ModelAdmin
  5. from django.contrib.auth.models import User
  6. from .models import (Band, Song, SongInlineDefaultOrdering,
  7. SongInlineNewOrdering, DynOrderingBandAdmin)
  8. class MockRequest(object):
  9. pass
  10. class MockSuperUser(object):
  11. def has_perm(self, perm):
  12. return True
  13. request = MockRequest()
  14. request.user = MockSuperUser()
  15. class TestAdminOrdering(TestCase):
  16. """
  17. Let's make sure that ModelAdmin.get_queryset uses the ordering we define
  18. in ModelAdmin rather that ordering defined in the model's inner Meta
  19. class.
  20. """
  21. def setUp(self):
  22. self.request_factory = RequestFactory()
  23. b1 = Band(name='Aerosmith', bio='', rank=3)
  24. b1.save()
  25. b2 = Band(name='Radiohead', bio='', rank=1)
  26. b2.save()
  27. b3 = Band(name='Van Halen', bio='', rank=2)
  28. b3.save()
  29. def test_default_ordering(self):
  30. """
  31. The default ordering should be by name, as specified in the inner Meta
  32. class.
  33. """
  34. ma = ModelAdmin(Band, None)
  35. names = [b.name for b in ma.get_queryset(request)]
  36. self.assertEqual(['Aerosmith', 'Radiohead', 'Van Halen'], names)
  37. def test_specified_ordering(self):
  38. """
  39. Let's use a custom ModelAdmin that changes the ordering, and make sure
  40. it actually changes.
  41. """
  42. class BandAdmin(ModelAdmin):
  43. ordering = ('rank',) # default ordering is ('name',)
  44. ma = BandAdmin(Band, None)
  45. names = [b.name for b in ma.get_queryset(request)]
  46. self.assertEqual(['Radiohead', 'Van Halen', 'Aerosmith'], names)
  47. def test_dynamic_ordering(self):
  48. """
  49. Let's use a custom ModelAdmin that changes the ordering dinamically.
  50. """
  51. super_user = User.objects.create(username='admin', is_superuser=True)
  52. other_user = User.objects.create(username='other')
  53. request = self.request_factory.get('/')
  54. request.user = super_user
  55. ma = DynOrderingBandAdmin(Band, None)
  56. names = [b.name for b in ma.get_queryset(request)]
  57. self.assertEqual(['Radiohead', 'Van Halen', 'Aerosmith'], names)
  58. request.user = other_user
  59. names = [b.name for b in ma.get_queryset(request)]
  60. self.assertEqual(['Aerosmith', 'Radiohead', 'Van Halen'], names)
  61. class TestInlineModelAdminOrdering(TestCase):
  62. """
  63. Let's make sure that InlineModelAdmin.get_queryset uses the ordering we
  64. define in InlineModelAdmin.
  65. """
  66. def setUp(self):
  67. b = Band(name='Aerosmith', bio='', rank=3)
  68. b.save()
  69. self.b = b
  70. s1 = Song(band=b, name='Pink', duration=235)
  71. s1.save()
  72. s2 = Song(band=b, name='Dude (Looks Like a Lady)', duration=264)
  73. s2.save()
  74. s3 = Song(band=b, name='Jaded', duration=214)
  75. s3.save()
  76. def test_default_ordering(self):
  77. """
  78. The default ordering should be by name, as specified in the inner Meta
  79. class.
  80. """
  81. inline = SongInlineDefaultOrdering(self.b, None)
  82. names = [s.name for s in inline.get_queryset(request)]
  83. self.assertEqual(['Dude (Looks Like a Lady)', 'Jaded', 'Pink'], names)
  84. def test_specified_ordering(self):
  85. """
  86. Let's check with ordering set to something different than the default.
  87. """
  88. inline = SongInlineNewOrdering(self.b, None)
  89. names = [s.name for s in inline.get_queryset(request)]
  90. self.assertEqual(['Jaded', 'Pink', 'Dude (Looks Like a Lady)'], names)
  91. class TestRelatedFieldsAdminOrdering(TestCase):
  92. def setUp(self):
  93. self.b1 = Band(name='Pink Floyd', bio='', rank=1)
  94. self.b1.save()
  95. self.b2 = Band(name='Foo Fighters', bio='', rank=5)
  96. self.b2.save()
  97. # we need to register a custom ModelAdmin (instead of just using
  98. # ModelAdmin) because the field creator tries to find the ModelAdmin
  99. # for the related model
  100. class SongAdmin(admin.ModelAdmin):
  101. pass
  102. admin.site.register(Song, SongAdmin)
  103. def check_ordering_of_field_choices(self, correct_ordering):
  104. fk_field = admin.site._registry[Song].formfield_for_foreignkey(Song.band.field)
  105. m2m_field = admin.site._registry[Song].formfield_for_manytomany(Song.other_interpreters.field)
  106. self.assertEqual(list(fk_field.queryset), correct_ordering)
  107. self.assertEqual(list(m2m_field.queryset), correct_ordering)
  108. def test_no_admin_fallback_to_model_ordering(self):
  109. # should be ordered by name (as defined by the model)
  110. self.check_ordering_of_field_choices([self.b2, self.b1])
  111. def test_admin_with_no_ordering_fallback_to_model_ordering(self):
  112. class NoOrderingBandAdmin(admin.ModelAdmin):
  113. pass
  114. admin.site.register(Band, NoOrderingBandAdmin)
  115. # should be ordered by name (as defined by the model)
  116. self.check_ordering_of_field_choices([self.b2, self.b1])
  117. def test_admin_ordering_beats_model_ordering(self):
  118. class StaticOrderingBandAdmin(admin.ModelAdmin):
  119. ordering = ('rank', )
  120. admin.site.register(Band, StaticOrderingBandAdmin)
  121. # should be ordered by rank (defined by the ModelAdmin)
  122. self.check_ordering_of_field_choices([self.b1, self.b2])
  123. def tearDown(self):
  124. admin.site.unregister(Song)
  125. if Band in admin.site._registry:
  126. admin.site.unregister(Band)