summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2021-04-14 12:23:47 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-04-14 12:24:11 +0200
commit59cce8237c9efb33f16058bac67702d5a11ea1d9 (patch)
treec9d7609b31070b6a336edff1ce31f1024f0e2e71
parent700356f93b9185cc05d9ed349108591a70e597b6 (diff)
downloaddjango-59cce8237c9efb33f16058bac67702d5a11ea1d9.tar.gz
[3.2.x] Fixed #32649 -- Fixed ModelAdmin.search_fields crash when searching against phrases with unbalanced quotes.
Thanks Dlis for the report. Regression in 26a413507abb38f7eee4cf62f2ee9727fdc7bf8d. Backport of 23fa29f6a6659e0f600d216de6bcb79e7f6818c9 from main
-rw-r--r--django/contrib/admin/options.py2
-rw-r--r--docs/releases/3.2.1.txt4
-rw-r--r--tests/admin_views/tests.py6
3 files changed, 10 insertions, 2 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 6b0982eab8..b286466fb5 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -1025,7 +1025,7 @@ class ModelAdmin(BaseModelAdmin):
orm_lookups = [construct_search(str(search_field))
for search_field in search_fields]
for bit in smart_split(search_term):
- if bit.startswith(('"', "'")):
+ if bit.startswith(('"', "'")) and bit[0] == bit[-1]:
bit = unescape_string_literal(bit)
or_queries = [models.Q(**{orm_lookup: bit})
for orm_lookup in orm_lookups]
diff --git a/docs/releases/3.2.1.txt b/docs/releases/3.2.1.txt
index cc716782e5..d5486f4cc9 100644
--- a/docs/releases/3.2.1.txt
+++ b/docs/releases/3.2.1.txt
@@ -26,3 +26,7 @@ Bugfixes
* Fixed a bug in Django 3.2 where a system check would crash on a reverse
one-to-one relationships in ``CheckConstraint.check`` or
``UniqueConstraint.condition`` (:ticket:`32635`).
+
+* Fixed a regression in Django 3.2 that caused a crash of
+ :attr:`.ModelAdmin.search_fields` when searching against phrases with
+ unbalanced quotes (:ticket:`32649`).
diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py
index 8cb3fda966..ad47c504c1 100644
--- a/tests/admin_views/tests.py
+++ b/tests/admin_views/tests.py
@@ -3537,6 +3537,7 @@ class AdminSearchTest(TestCase):
cls.per2 = Person.objects.create(name='Grace Hopper', gender=1, alive=False)
cls.per3 = Person.objects.create(name='Guido van Rossum', gender=1, alive=True)
Person.objects.create(name='John Doe', gender=1)
+ Person.objects.create(name='John O"Hara', gender=1)
Person.objects.create(name="John O'Hara", gender=1)
cls.t1 = Recommender.objects.create()
@@ -3612,7 +3613,7 @@ class AdminSearchTest(TestCase):
response = self.client.get(reverse('admin:admin_views_person_changelist') + '?q=Gui')
self.assertContains(
response,
- """<span class="small quiet">1 result (<a href="?">5 total</a>)</span>""",
+ """<span class="small quiet">1 result (<a href="?">6 total</a>)</span>""",
html=True
)
@@ -3643,7 +3644,10 @@ class AdminSearchTest(TestCase):
("John Doe John", 0),
('"John Do"', 1),
("'John Do'", 1),
+ ("'John O\'Hara'", 0),
("'John O\\'Hara'", 1),
+ ('"John O\"Hara"', 0),
+ ('"John O\\"Hara"', 1),
]
for search, hits in tests:
with self.subTest(search=search):