From 35907313e8b30521f7795f607e57b5adcb280353 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:39:17 -0700 Subject: [PATCH] Fix: allow removing dead document links from UI, validate via API (#8081) --- src-ui/messages.xlf | 15 ++++++-- .../document-link.component.html | 12 +++++-- .../document-link/document-link.component.ts | 8 ++--- src/documents/serialisers.py | 8 +++++ src/documents/tests/test_api_custom_fields.py | 36 +++++++++++++++++++ 5 files changed, 70 insertions(+), 9 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index dfea48ad7..fe002792b 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -706,7 +706,7 @@ src/app/components/common/input/document-link/document-link.component.html - 51 + 57 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -4857,18 +4857,29 @@ src/app/components/common/input/document-link/document-link.component.html 43 + + src/app/components/common/input/document-link/document-link.component.html + 49 + Open link src/app/components/common/input/document-link/document-link.component.html - 44 + 45 src/app/components/common/input/url/url.component.html 14 + + Not found + + src/app/components/common/input/document-link/document-link.component.html + 50 + + Search for documents diff --git a/src-ui/src/app/components/common/input/document-link/document-link.component.html b/src-ui/src/app/components/common/input/document-link/document-link.component.html index 80feb8bd9..f494a2446 100644 --- a/src-ui/src/app/components/common/input/document-link/document-link.component.html +++ b/src-ui/src/app/components/common/input/document-link/document-link.component.html @@ -41,9 +41,15 @@
- -  {{document.title}} - + @if (document.title) { + +  {{document.title}} + + } @else { + +  Not found + + }
diff --git a/src-ui/src/app/components/common/input/document-link/document-link.component.ts b/src-ui/src/app/components/common/input/document-link/document-link.component.ts index 54784b83d..a75968203 100644 --- a/src-ui/src/app/components/common/input/document-link/document-link.component.ts +++ b/src-ui/src/app/components/common/input/document-link/document-link.component.ts @@ -71,9 +71,9 @@ export class DocumentLinkComponent .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe((documentResults) => { this.loading = false - this.selectedDocuments = documentIDs - .map((id) => documentResults.results.find((d) => d.id === id)) - .filter((d) => d) + this.selectedDocuments = documentIDs.map((id) => + documentResults.results.find((d) => d.id === id) + ) super.writeValue(documentIDs) }) } @@ -114,7 +114,7 @@ export class DocumentLinkComponent unselect(document: Document): void { this.selectedDocuments = this.selectedDocuments.filter( - (d) => d.id !== document.id + (d) => d && d.id !== document.id ) this.onChange(this.selectedDocuments.map((d) => d.id)) } diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index e08daff09..aeb901f81 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -651,6 +651,14 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer): raise serializers.ValidationError( f"Value must be index of an element in {select_options}", ) + elif field.data_type == CustomField.FieldDataType.DOCUMENTLINK: + doc_ids = data["value"] + if Document.objects.filter(id__in=doc_ids).count() != len( + data["value"], + ): + raise serializers.ValidationError( + "Some documents in value don't exist or were specified twice.", + ) return data diff --git a/src/documents/tests/test_api_custom_fields.py b/src/documents/tests/test_api_custom_fields.py index bfe352d56..02e856c27 100644 --- a/src/documents/tests/test_api_custom_fields.py +++ b/src/documents/tests/test_api_custom_fields.py @@ -740,6 +740,42 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): self.assertEqual(CustomFieldInstance.objects.count(), 0) self.assertEqual(len(doc.custom_fields.all()), 0) + def test_custom_field_value_documentlink_validation(self): + """ + GIVEN: + - Document & custom field exist + WHEN: + - API request to set a field value to a document that does not exist + THEN: + - HTTP 400 is returned + - No field instance is created or attached to the document + """ + + doc = Document.objects.create( + title="WOW", + content="the content", + checksum="123", + mime_type="application/pdf", + ) + custom_field_documentlink = CustomField.objects.create( + name="Test Custom Field Doc Link", + data_type=CustomField.FieldDataType.DOCUMENTLINK, + ) + + resp = self.client.patch( + f"/api/documents/{doc.id}/", + data={ + "custom_fields": [ + {"field": custom_field_documentlink.id, "value": [999]}, + ], + }, + format="json", + ) + + self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) + self.assertEqual(CustomFieldInstance.objects.count(), 0) + self.assertEqual(len(doc.custom_fields.all()), 0) + def test_custom_field_not_null(self): """ GIVEN: