diff options
| author | Krzysztof Nazarewski <nazarewk@gmail.com> | 2017-07-05 13:00:10 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-11-18 19:33:52 -0500 |
| commit | 244cc401559e924355cf943b6b8e66ccf2f6da3a (patch) | |
| tree | 124c16b3fd1e844cb2925fc4fd0c76b7fde0584f /tests/admin_changelist | |
| parent | 3af305e8b8a89f4b0e5874cd601568ab8dcd7334 (diff) | |
Fixed #26184 -- Allowed using any lookups in ModelAdmin.search_fields.
Thanks Krzysztof Nazarewski for the initial patch.
Diffstat (limited to 'tests/admin_changelist')
| -rw-r--r-- | tests/admin_changelist/models.py | 5 | ||||
| -rw-r--r-- | tests/admin_changelist/tests.py | 80 |
2 files changed, 82 insertions, 3 deletions
diff --git a/tests/admin_changelist/models.py b/tests/admin_changelist/models.py index 1cec7b8a82..62268a2b79 100644 --- a/tests/admin_changelist/models.py +++ b/tests/admin_changelist/models.py @@ -28,6 +28,7 @@ class Band(models.Model): class Musician(models.Model): name = models.CharField(max_length=30) + age = models.IntegerField(null=True, blank=True) def __str__(self): return self.name @@ -111,3 +112,7 @@ class OrderedObject(models.Model): class CustomIdUser(models.Model): uuid = models.AutoField(primary_key=True) + + +class CharPK(models.Model): + char_pk = models.CharField(max_length=100, primary_key=True) diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py index b4c08b3e84..537949021f 100644 --- a/tests/admin_changelist/tests.py +++ b/tests/admin_changelist/tests.py @@ -8,6 +8,8 @@ from django.contrib.admin.tests import AdminSeleniumTestCase from django.contrib.admin.views.main import ALL_VAR, SEARCH_VAR from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType +from django.db.models.fields import Field, IntegerField +from django.db.models.lookups import Contains, Exact from django.template import Context, Template from django.test import TestCase, override_settings from django.test.client import RequestFactory @@ -24,9 +26,9 @@ from .admin import ( site as custom_site, ) from .models import ( - Band, Child, ChordsBand, ChordsMusician, Concert, CustomIdUser, Event, - Genre, Group, Invitation, Membership, Musician, OrderedObject, Parent, - Quartet, Swallow, SwallowOneToOne, UnorderedObject, + Band, CharPK, Child, ChordsBand, ChordsMusician, Concert, CustomIdUser, + Event, Genre, Group, Invitation, Membership, Musician, OrderedObject, + Parent, Quartet, Swallow, SwallowOneToOne, UnorderedObject, ) @@ -403,6 +405,78 @@ class ChangeListTests(TestCase): cl = m.get_changelist_instance(request) self.assertEqual(cl.queryset.count(), 0) + def test_builtin_lookup_in_search_fields(self): + band = Group.objects.create(name='The Hype') + concert = Concert.objects.create(name='Woodstock', group=band) + + m = ConcertAdmin(Concert, custom_site) + m.search_fields = ['name__iexact'] + + request = self.factory.get('/', data={SEARCH_VAR: 'woodstock'}) + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [concert]) + + request = self.factory.get('/', data={SEARCH_VAR: 'wood'}) + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, []) + + def test_custom_lookup_in_search_fields(self): + band = Group.objects.create(name='The Hype') + concert = Concert.objects.create(name='Woodstock', group=band) + + m = ConcertAdmin(Concert, custom_site) + m.search_fields = ['group__name__cc'] + Field.register_lookup(Contains, 'cc') + try: + request = self.factory.get('/', data={SEARCH_VAR: 'Hype'}) + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [concert]) + + request = self.factory.get('/', data={SEARCH_VAR: 'Woodstock'}) + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, []) + finally: + Field._unregister_lookup(Contains, 'cc') + + def test_spanning_relations_with_custom_lookup_in_search_fields(self): + hype = Group.objects.create(name='The Hype') + concert = Concert.objects.create(name='Woodstock', group=hype) + vox = Musician.objects.create(name='Vox', age=20) + Membership.objects.create(music=vox, group=hype) + # Register a custom lookup on IntegerField to ensure that field + # traversing logic in ModelAdmin.get_search_results() works. + IntegerField.register_lookup(Exact, 'exactly') + try: + m = ConcertAdmin(Concert, custom_site) + m.search_fields = ['group__members__age__exactly'] + + request = self.factory.get('/', data={SEARCH_VAR: '20'}) + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [concert]) + + request = self.factory.get('/', data={SEARCH_VAR: '21'}) + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, []) + finally: + IntegerField._unregister_lookup(Exact, 'exactly') + + def test_custom_lookup_with_pk_shortcut(self): + self.assertEqual(CharPK._meta.pk.name, 'char_pk') # Not equal to 'pk'. + m = admin.ModelAdmin(CustomIdUser, custom_site) + + abc = CharPK.objects.create(char_pk='abc') + abcd = CharPK.objects.create(char_pk='abcd') + m = admin.ModelAdmin(CharPK, custom_site) + m.search_fields = ['pk__exact'] + + request = self.factory.get('/', data={SEARCH_VAR: 'abc'}) + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [abc]) + + request = self.factory.get('/', data={SEARCH_VAR: 'abcd'}) + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [abcd]) + def test_no_distinct_for_m2m_in_list_filter_without_params(self): """ If a ManyToManyField is in list_filter but isn't in any lookup params, |
