/tests/regressiontests/admin_filterspecs/tests.py

https://code.google.com/p/mango-py/ · Python · 211 lines · 138 code · 48 blank · 25 comment · 2 complexity · 231d0f51d371bf511056a5e86f76404e MD5 · raw file

  1. from django.contrib.auth.admin import UserAdmin
  2. from django.test import TestCase
  3. from django.test.client import RequestFactory
  4. from django.contrib.auth.models import User
  5. from django.contrib import admin
  6. from django.contrib.admin.views.main import ChangeList
  7. from django.utils.encoding import force_unicode
  8. from models import Book, BoolTest
  9. def select_by(dictlist, key, value):
  10. return [x for x in dictlist if x[key] == value][0]
  11. class FilterSpecsTests(TestCase):
  12. def setUp(self):
  13. # Users
  14. self.alfred = User.objects.create_user('alfred', 'alfred@example.com')
  15. self.bob = User.objects.create_user('bob', 'bob@example.com')
  16. lisa = User.objects.create_user('lisa', 'lisa@example.com')
  17. #Books
  18. self.bio_book = Book.objects.create(title='Django: a biography', year=1999, author=self.alfred)
  19. self.django_book = Book.objects.create(title='The Django Book', year=None, author=self.bob)
  20. gipsy_book = Book.objects.create(title='Gipsy guitar for dummies', year=2002)
  21. gipsy_book.contributors = [self.bob, lisa]
  22. gipsy_book.save()
  23. # BoolTests
  24. self.trueTest = BoolTest.objects.create(completed=True)
  25. self.falseTest = BoolTest.objects.create(completed=False)
  26. self.request_factory = RequestFactory()
  27. def get_changelist(self, request, model, modeladmin):
  28. return ChangeList(request, model, modeladmin.list_display, modeladmin.list_display_links,
  29. modeladmin.list_filter, modeladmin.date_hierarchy, modeladmin.search_fields,
  30. modeladmin.list_select_related, modeladmin.list_per_page, modeladmin.list_editable, modeladmin)
  31. def test_AllValuesFilterSpec(self):
  32. modeladmin = BookAdmin(Book, admin.site)
  33. request = self.request_factory.get('/', {'year__isnull': 'True'})
  34. changelist = self.get_changelist(request, Book, modeladmin)
  35. # Make sure changelist.get_query_set() does not raise IncorrectLookupParameters
  36. queryset = changelist.get_query_set()
  37. # Make sure the last choice is None and is selected
  38. filterspec = changelist.get_filters(request)[0][0]
  39. self.assertEqual(force_unicode(filterspec.title()), u'year')
  40. choices = list(filterspec.choices(changelist))
  41. self.assertEqual(choices[-1]['selected'], True)
  42. self.assertEqual(choices[-1]['query_string'], '?year__isnull=True')
  43. request = self.request_factory.get('/', {'year': '2002'})
  44. changelist = self.get_changelist(request, Book, modeladmin)
  45. # Make sure the correct choice is selected
  46. filterspec = changelist.get_filters(request)[0][0]
  47. self.assertEqual(force_unicode(filterspec.title()), u'year')
  48. choices = list(filterspec.choices(changelist))
  49. self.assertEqual(choices[2]['selected'], True)
  50. self.assertEqual(choices[2]['query_string'], '?year=2002')
  51. def test_RelatedFilterSpec_ForeignKey(self):
  52. modeladmin = BookAdmin(Book, admin.site)
  53. request = self.request_factory.get('/', {'author__isnull': 'True'})
  54. changelist = ChangeList(request, Book, modeladmin.list_display, modeladmin.list_display_links,
  55. modeladmin.list_filter, modeladmin.date_hierarchy, modeladmin.search_fields,
  56. modeladmin.list_select_related, modeladmin.list_per_page, modeladmin.list_editable, modeladmin)
  57. # Make sure changelist.get_query_set() does not raise IncorrectLookupParameters
  58. queryset = changelist.get_query_set()
  59. # Make sure the last choice is None and is selected
  60. filterspec = changelist.get_filters(request)[0][1]
  61. self.assertEqual(force_unicode(filterspec.title()), u'author')
  62. choices = list(filterspec.choices(changelist))
  63. self.assertEqual(choices[-1]['selected'], True)
  64. self.assertEqual(choices[-1]['query_string'], '?author__isnull=True')
  65. request = self.request_factory.get('/', {'author__id__exact': self.alfred.pk})
  66. changelist = self.get_changelist(request, Book, modeladmin)
  67. # Make sure the correct choice is selected
  68. filterspec = changelist.get_filters(request)[0][1]
  69. self.assertEqual(force_unicode(filterspec.title()), u'author')
  70. # order of choices depends on User model, which has no order
  71. choice = select_by(filterspec.choices(changelist), "display", "alfred")
  72. self.assertEqual(choice['selected'], True)
  73. self.assertEqual(choice['query_string'], '?author__id__exact=%d' % self.alfred.pk)
  74. def test_RelatedFilterSpec_ManyToMany(self):
  75. modeladmin = BookAdmin(Book, admin.site)
  76. request = self.request_factory.get('/', {'contributors__isnull': 'True'})
  77. changelist = self.get_changelist(request, Book, modeladmin)
  78. # Make sure changelist.get_query_set() does not raise IncorrectLookupParameters
  79. queryset = changelist.get_query_set()
  80. # Make sure the last choice is None and is selected
  81. filterspec = changelist.get_filters(request)[0][2]
  82. self.assertEqual(force_unicode(filterspec.title()), u'user')
  83. choices = list(filterspec.choices(changelist))
  84. self.assertEqual(choices[-1]['selected'], True)
  85. self.assertEqual(choices[-1]['query_string'], '?contributors__isnull=True')
  86. request = self.request_factory.get('/', {'contributors__id__exact': self.bob.pk})
  87. changelist = self.get_changelist(request, Book, modeladmin)
  88. # Make sure the correct choice is selected
  89. filterspec = changelist.get_filters(request)[0][2]
  90. self.assertEqual(force_unicode(filterspec.title()), u'user')
  91. choice = select_by(filterspec.choices(changelist), "display", "bob")
  92. self.assertEqual(choice['selected'], True)
  93. self.assertEqual(choice['query_string'], '?contributors__id__exact=%d' % self.bob.pk)
  94. def test_RelatedFilterSpec_reverse_relationships(self):
  95. modeladmin = CustomUserAdmin(User, admin.site)
  96. # FK relationship -----
  97. request = self.request_factory.get('/', {'books_authored__isnull': 'True'})
  98. changelist = self.get_changelist(request, User, modeladmin)
  99. # Make sure changelist.get_query_set() does not raise IncorrectLookupParameters
  100. queryset = changelist.get_query_set()
  101. # Make sure the last choice is None and is selected
  102. filterspec = changelist.get_filters(request)[0][0]
  103. self.assertEqual(force_unicode(filterspec.title()), u'book')
  104. choices = list(filterspec.choices(changelist))
  105. self.assertEqual(choices[-1]['selected'], True)
  106. self.assertEqual(choices[-1]['query_string'], '?books_authored__isnull=True')
  107. request = self.request_factory.get('/', {'books_authored__id__exact': self.bio_book.pk})
  108. changelist = self.get_changelist(request, User, modeladmin)
  109. # Make sure the correct choice is selected
  110. filterspec = changelist.get_filters(request)[0][0]
  111. self.assertEqual(force_unicode(filterspec.title()), u'book')
  112. choice = select_by(filterspec.choices(changelist), "display", self.bio_book.title)
  113. self.assertEqual(choice['selected'], True)
  114. self.assertEqual(choice['query_string'], '?books_authored__id__exact=%d' % self.bio_book.pk)
  115. # M2M relationship -----
  116. request = self.request_factory.get('/', {'books_contributed__isnull': 'True'})
  117. changelist = self.get_changelist(request, User, modeladmin)
  118. # Make sure changelist.get_query_set() does not raise IncorrectLookupParameters
  119. queryset = changelist.get_query_set()
  120. # Make sure the last choice is None and is selected
  121. filterspec = changelist.get_filters(request)[0][1]
  122. self.assertEqual(force_unicode(filterspec.title()), u'book')
  123. choices = list(filterspec.choices(changelist))
  124. self.assertEqual(choices[-1]['selected'], True)
  125. self.assertEqual(choices[-1]['query_string'], '?books_contributed__isnull=True')
  126. request = self.request_factory.get('/', {'books_contributed__id__exact': self.django_book.pk})
  127. changelist = self.get_changelist(request, User, modeladmin)
  128. # Make sure the correct choice is selected
  129. filterspec = changelist.get_filters(request)[0][1]
  130. self.assertEqual(force_unicode(filterspec.title()), u'book')
  131. choice = select_by(filterspec.choices(changelist), "display", self.django_book.title)
  132. self.assertEqual(choice['selected'], True)
  133. self.assertEqual(choice['query_string'], '?books_contributed__id__exact=%d' % self.django_book.pk)
  134. def test_BooleanFilterSpec(self):
  135. modeladmin = BoolTestAdmin(BoolTest, admin.site)
  136. request = self.request_factory.get('/')
  137. changelist = ChangeList(request, BoolTest, modeladmin.list_display, modeladmin.list_display_links,
  138. modeladmin.list_filter, modeladmin.date_hierarchy, modeladmin.search_fields,
  139. modeladmin.list_select_related, modeladmin.list_per_page, modeladmin.list_editable, modeladmin)
  140. # Make sure changelist.get_query_set() does not raise IncorrectLookupParameters
  141. queryset = changelist.get_query_set()
  142. # Make sure the last choice is None and is selected
  143. filterspec = changelist.get_filters(request)[0][0]
  144. self.assertEqual(force_unicode(filterspec.title()), u'completed')
  145. choices = list(filterspec.choices(changelist))
  146. self.assertEqual(choices[-1]['selected'], False)
  147. self.assertEqual(choices[-1]['query_string'], '?completed__exact=0')
  148. request = self.request_factory.get('/', {'completed__exact': 1})
  149. changelist = self.get_changelist(request, BoolTest, modeladmin)
  150. # Make sure the correct choice is selected
  151. filterspec = changelist.get_filters(request)[0][0]
  152. self.assertEqual(force_unicode(filterspec.title()), u'completed')
  153. # order of choices depends on User model, which has no order
  154. choice = select_by(filterspec.choices(changelist), "display", "Yes")
  155. self.assertEqual(choice['selected'], True)
  156. self.assertEqual(choice['query_string'], '?completed__exact=1')
  157. class CustomUserAdmin(UserAdmin):
  158. list_filter = ('books_authored', 'books_contributed')
  159. class BookAdmin(admin.ModelAdmin):
  160. list_filter = ('year', 'author', 'contributors')
  161. order_by = '-id'
  162. class BoolTestAdmin(admin.ModelAdmin):
  163. list_filter = ('completed',)