]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: prevent self-linking when bulk edit doc link (#9629)
authorshamoon <4887959+shamoon@users.noreply.github.com>
Mon, 14 Apr 2025 14:12:50 +0000 (07:12 -0700)
committerGitHub <noreply@github.com>
Mon, 14 Apr 2025 14:12:50 +0000 (07:12 -0700)
src/documents/bulk_edit.py
src/documents/tests/test_bulk_edit.py

index b8e76f7c800910770587aee215a04a186d71c878..13773fe87d4c2e423fdec642ee77603e310bc5e0 100644 (file)
@@ -179,6 +179,12 @@ def modify_custom_fields(
                     custom_field.data_type
                 ]
                 defaults[value_field] = value
+                if (
+                    custom_field.data_type == CustomField.FieldDataType.DOCUMENTLINK
+                    and doc_id in value
+                ):
+                    # Prevent self-linking
+                    continue
             CustomFieldInstance.objects.update_or_create(
                 document_id=doc_id,
                 field_id=field_id,
index dd59a6217d4c41b4a0e051621eb3a6274e737424..fb84c9070841100410e080e1cabc8bf81ca174c9 100644 (file)
@@ -336,6 +336,35 @@ class TestBulkEdit(DirectoriesMixin, TestCase):
             self.doc2.custom_fields.filter(field=cf3).first().value,
         )
 
+    def test_modify_custom_fields_doclink_self_link(self):
+        """
+        GIVEN:
+            - 2 existing documents
+            - Existing doc link custom field
+        WHEN:
+            - Doc link field is modified to include self link
+        THEN:
+            - Self link should not be created
+        """
+        cf = CustomField.objects.create(
+            name="cf",
+            data_type=CustomField.FieldDataType.DOCUMENTLINK,
+        )
+        bulk_edit.modify_custom_fields(
+            [self.doc1.id, self.doc2.id],
+            add_custom_fields={cf.id: [self.doc1.id]},
+            remove_custom_fields=[],
+        )
+
+        self.assertEqual(
+            self.doc1.custom_fields.first().value,
+            [self.doc2.id],
+        )
+        self.assertEqual(
+            self.doc2.custom_fields.first().value,
+            [self.doc1.id],
+        )
+
     def test_delete(self):
         self.assertEqual(Document.objects.count(), 5)
         bulk_edit.delete([self.doc1.id, self.doc2.id])