summaryrefslogtreecommitdiff
path: root/tests/admin_changelist
diff options
context:
space:
mode:
authorKrzysztof Nazarewski <nazarewk@gmail.com>2017-07-05 13:00:10 +0200
committerTim Graham <timograham@gmail.com>2017-11-18 19:33:52 -0500
commit244cc401559e924355cf943b6b8e66ccf2f6da3a (patch)
tree124c16b3fd1e844cb2925fc4fd0c76b7fde0584f /tests/admin_changelist
parent3af305e8b8a89f4b0e5874cd601568ab8dcd7334 (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.py5
-rw-r--r--tests/admin_changelist/tests.py80
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,