From 0219df5b6766ddc120dfeb40f0d8c3401ea6e6f7 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 14 Nov 2025 08:09:09 -0800 Subject: [PATCH] Fixhancement: trim whitespace for some text searches (#11357) --- .../filter-editor/filter-editor.component.ts | 4 ++-- src/documents/filters.py | 3 +++ src/documents/tests/test_api_documents.py | 17 +++++++++++++++++ src/documents/views.py | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts index 9e83797a6..fecbaa170 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts @@ -747,7 +747,7 @@ export class FilterEditorComponent ) { filterRules.push({ rule_type: FILTER_TITLE_CONTENT, - value: this._textFilter, + value: this._textFilter.trim(), }) } if (this._textFilter && this.textFilterTarget == TEXT_FILTER_TARGET_TITLE) { @@ -805,7 +805,7 @@ export class FilterEditorComponent ) { filterRules.push({ rule_type: FILTER_FULLTEXT_QUERY, - value: this._textFilter, + value: this._textFilter.trim(), }) } if ( diff --git a/src/documents/filters.py b/src/documents/filters.py index 3a8d4d327..54f3c1fa0 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -160,6 +160,7 @@ class InboxFilter(Filter): @extend_schema_field(serializers.CharField) class TitleContentFilter(Filter): def filter(self, qs, value): + value = value.strip() if isinstance(value, str) else value if value: return qs.filter(Q(title__icontains=value) | Q(content__icontains=value)) else: @@ -214,6 +215,7 @@ class CustomFieldFilterSet(FilterSet): @extend_schema_field(serializers.CharField) class CustomFieldsFilter(Filter): def filter(self, qs, value): + value = value.strip() if isinstance(value, str) else value if value: fields_with_matching_selects = CustomField.objects.filter( extra_data__icontains=value, @@ -244,6 +246,7 @@ class CustomFieldsFilter(Filter): class MimeTypeFilter(Filter): def filter(self, qs, value): + value = value.strip() if isinstance(value, str) else value if value: return qs.filter(mime_type__icontains=value) else: diff --git a/src/documents/tests/test_api_documents.py b/src/documents/tests/test_api_documents.py index f7f44c974..87190c23b 100644 --- a/src/documents/tests/test_api_documents.py +++ b/src/documents/tests/test_api_documents.py @@ -941,6 +941,23 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): results = response.data["results"] 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): """ GIVEN: diff --git a/src/documents/views.py b/src/documents/views.py index 822647fdb..8aee24561 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -1863,7 +1863,7 @@ class SearchAutoCompleteView(GenericAPIView): user = self.request.user if hasattr(self.request, "user") else None if "term" in request.query_params: - term = request.query_params["term"] + term = request.query_params["term"].strip() else: return HttpResponseBadRequest("Term required")