diff --git a/src-ui/src/app/services/document-list-view.service.spec.ts b/src-ui/src/app/services/document-list-view.service.spec.ts index 2ef084b17..d93acc521 100644 --- a/src-ui/src/app/services/document-list-view.service.spec.ts +++ b/src-ui/src/app/services/document-list-view.service.spec.ts @@ -156,7 +156,7 @@ describe('DocumentListViewService', () => { expect(documentListViewService.currentPage).toEqual(1) }) - it('should handle error on filtering request', () => { + it('should handle object error on filtering request', () => { documentListViewService.currentPage = 1 const tags__id__in = 'hello' const filterRulesAny = [ @@ -185,6 +185,50 @@ describe('DocumentListViewService', () => { ) }) + it('should handle object error on filtering request for custom field sorts', () => { + documentListViewService.currentPage = 1 + documentListViewService.sortField = 'custom_field_999' + let req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-custom_field_999&truncate_content=true` + ) + expect(req.request.method).toEqual('GET') + req.flush( + { custom_field_999: ['Custom field not found'] }, + { status: 400, statusText: 'Unexpected error' } + ) + expect(documentListViewService.error).toEqual( + 'custom_field_999: Custom field not found' + ) + // reset the list + documentListViewService.sortField = 'created' + req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + ) + }) + + it('should handle string error on filtering request', () => { + documentListViewService.currentPage = 1 + const tags__id__in = 'hello' + const filterRulesAny = [ + { + rule_type: FILTER_HAS_TAGS_ANY, + value: tags__id__in, + }, + ] + documentListViewService.filterRules = filterRulesAny + let req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__in=${tags__id__in}` + ) + expect(req.request.method).toEqual('GET') + req.flush('Generic error', { status: 404, statusText: 'Unexpected error' }) + expect(documentListViewService.error).toEqual('Generic error') + // reset the list + documentListViewService.filterRules = [] + req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + ) + }) + it('should support setting sort', () => { expect(documentListViewService.sortField).toEqual('created') expect(documentListViewService.sortReverse).toBeTruthy() diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts index e15c11d3a..893bfca91 100644 --- a/src-ui/src/app/services/document-list-view.service.ts +++ b/src-ui/src/app/services/document-list-view.service.ts @@ -307,18 +307,23 @@ export class DocumentListViewService { activeListViewState.currentPage = 1 this.reload() } else { + console.log(error) + this.selectionData = null let errorMessage if ( - typeof error.error !== 'string' && + typeof error.error === 'object' && Object.keys(error.error).length > 0 ) { // e.g. { archive_serial_number: Array } errorMessage = Object.keys(error.error) .map((fieldName) => { + const fieldNameBase = fieldName.split('__')[0] const fieldError: Array = error.error[fieldName] return `${ - this.sortFields.find((f) => f.field == fieldName)?.name + this.sortFields.find( + (f) => f.field?.split('__')[0] == fieldNameBase + )?.name ?? fieldNameBase }: ${fieldError[0]}` }) .join(', ') diff --git a/src/documents/filters.py b/src/documents/filters.py index fd52e43aa..185ba7b6f 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -781,7 +781,9 @@ class DocumentsOrderingFilter(OrderingFilter): try: field = CustomField.objects.get(pk=custom_field_id) except CustomField.DoesNotExist: - raise ValueError("Custom field not found") + raise serializers.ValidationError( + {self.prefix + str(custom_field_id): [_("Custom field not found")]}, + ) annotation = None match field.data_type: diff --git a/src/documents/tests/test_api_documents.py b/src/documents/tests/test_api_documents.py index 048449fd4..ea5227c8a 100644 --- a/src/documents/tests/test_api_documents.py +++ b/src/documents/tests/test_api_documents.py @@ -2920,11 +2920,10 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase): - 400 is returned """ - with self.assertRaises(ValueError): - response = self.client.get( - "/api/documents/?ordering=custom_field_999", - ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + response = self.client.get( + "/api/documents/?ordering=custom_field_999", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) def test_document_custom_fields_sorting_invalid_data_type(self): """ @@ -2933,7 +2932,7 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase): WHEN: - API request for document filtering with a custom field sorting with a new (unhandled) data type THEN: - - 400 is returned + - Error is raised """ custom_field = CustomField.objects.create( @@ -2942,7 +2941,6 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase): ) with self.assertRaises(ValueError): - response = self.client.get( + self.client.get( f"/api/documents/?ordering=custom_field_{custom_field.pk}", ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)