]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: Explicit validation of custom field name unique constraint (#5647)
authorshamoon <4887959+shamoon@users.noreply.github.com>
Sat, 3 Feb 2024 20:51:26 +0000 (12:51 -0800)
committerGitHub <noreply@github.com>
Sat, 3 Feb 2024 20:51:26 +0000 (20:51 +0000)
src/documents/serialisers.py
src/documents/tests/test_api_custom_fields.py

index 0839a14b525ea7cec0805965d452d623fe2e830b..2a2fc46a7c41b1787d670905672f99606bd40084 100644 (file)
@@ -81,7 +81,7 @@ class MatchingModelSerializer(serializers.ModelSerializer):
     slug = SerializerMethodField()
 
     def validate(self, data):
-        # see https://github.com/encode/django-rest-framework/issues/7173
+        # TODO: remove pending https://github.com/encode/django-rest-framework/issues/7173
         name = data["name"] if "name" in data else self.instance.name
         owner = (
             data["owner"]
@@ -441,6 +441,17 @@ class CustomFieldSerializer(serializers.ModelSerializer):
             "data_type",
         ]
 
+    def validate(self, attrs):
+        # TODO: remove pending https://github.com/encode/django-rest-framework/issues/7173
+        name = attrs["name"] if "name" in attrs else self.instance.name
+        if ("name" in attrs) and self.Meta.model.objects.filter(
+            name=name,
+        ).exists():
+            raise serializers.ValidationError(
+                {"error": "Object violates name unique constraint"},
+            )
+        return super().validate(attrs)
+
 
 class ReadWriteSerializerMethodField(serializers.SerializerMethodField):
     """
index cf33e2800c818dd0f6e4a463a4e9bdabc649ccce..33124a48c825a83cf40e8f70aeaeecd0c4962076 100644 (file)
@@ -53,6 +53,29 @@ class TestCustomField(DirectoriesMixin, APITestCase):
             self.assertEqual(data["name"], name)
             self.assertEqual(data["data_type"], field_type)
 
+    def test_create_custom_field_nonunique_name(self):
+        """
+        GIVEN:
+            - Custom field exists
+        WHEN:
+            - API request to create custom field with the same name
+        THEN:
+            - HTTP 400 is returned
+        """
+        CustomField.objects.create(
+            name="Test Custom Field",
+            data_type=CustomField.FieldDataType.STRING,
+        )
+
+        resp = self.client.post(
+            self.ENDPOINT,
+            data={
+                "data_type": "string",
+                "name": "Test Custom Field",
+            },
+        )
+        self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
+
     def test_create_custom_field_instance(self):
         """
         GIVEN: