Fixhancement: trim whitespace for some text searches (#11357)

This commit is contained in:
shamoon
2025-11-14 08:09:09 -08:00
committed by GitHub
parent 005ef4fce6
commit 0219df5b67
4 changed files with 23 additions and 3 deletions

View File

@@ -747,7 +747,7 @@ export class FilterEditorComponent
) { ) {
filterRules.push({ filterRules.push({
rule_type: FILTER_TITLE_CONTENT, rule_type: FILTER_TITLE_CONTENT,
value: this._textFilter, value: this._textFilter.trim(),
}) })
} }
if (this._textFilter && this.textFilterTarget == TEXT_FILTER_TARGET_TITLE) { if (this._textFilter && this.textFilterTarget == TEXT_FILTER_TARGET_TITLE) {
@@ -805,7 +805,7 @@ export class FilterEditorComponent
) { ) {
filterRules.push({ filterRules.push({
rule_type: FILTER_FULLTEXT_QUERY, rule_type: FILTER_FULLTEXT_QUERY,
value: this._textFilter, value: this._textFilter.trim(),
}) })
} }
if ( if (

View File

@@ -160,6 +160,7 @@ class InboxFilter(Filter):
@extend_schema_field(serializers.CharField) @extend_schema_field(serializers.CharField)
class TitleContentFilter(Filter): class TitleContentFilter(Filter):
def filter(self, qs, value): def filter(self, qs, value):
value = value.strip() if isinstance(value, str) else value
if value: if value:
return qs.filter(Q(title__icontains=value) | Q(content__icontains=value)) return qs.filter(Q(title__icontains=value) | Q(content__icontains=value))
else: else:
@@ -214,6 +215,7 @@ class CustomFieldFilterSet(FilterSet):
@extend_schema_field(serializers.CharField) @extend_schema_field(serializers.CharField)
class CustomFieldsFilter(Filter): class CustomFieldsFilter(Filter):
def filter(self, qs, value): def filter(self, qs, value):
value = value.strip() if isinstance(value, str) else value
if value: if value:
fields_with_matching_selects = CustomField.objects.filter( fields_with_matching_selects = CustomField.objects.filter(
extra_data__icontains=value, extra_data__icontains=value,
@@ -244,6 +246,7 @@ class CustomFieldsFilter(Filter):
class MimeTypeFilter(Filter): class MimeTypeFilter(Filter):
def filter(self, qs, value): def filter(self, qs, value):
value = value.strip() if isinstance(value, str) else value
if value: if value:
return qs.filter(mime_type__icontains=value) return qs.filter(mime_type__icontains=value)
else: else:

View File

@@ -941,6 +941,23 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
results = response.data["results"] results = response.data["results"]
self.assertEqual(len(results), 0) self.assertEqual(len(results), 0)
def test_documents_title_content_filter_strips_boundary_whitespace(self):
doc = Document.objects.create(
title="Testwort",
content="",
checksum="A",
mime_type="application/pdf",
)
response = self.client.get(
"/api/documents/",
{"title_content": " Testwort "},
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
results = response.data["results"]
self.assertEqual(len(results), 1)
self.assertEqual(results[0]["id"], doc.id)
def test_document_permissions_filters(self): def test_document_permissions_filters(self):
""" """
GIVEN: GIVEN:

View File

@@ -1863,7 +1863,7 @@ class SearchAutoCompleteView(GenericAPIView):
user = self.request.user if hasattr(self.request, "user") else None user = self.request.user if hasattr(self.request, "user") else None
if "term" in request.query_params: if "term" in request.query_params:
term = request.query_params["term"] term = request.query_params["term"].strip()
else: else:
return HttpResponseBadRequest("Term required") return HttpResponseBadRequest("Term required")