diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 0839a14b5..2a2fc46a7 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -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): """ diff --git a/src/documents/tests/test_api_custom_fields.py b/src/documents/tests/test_api_custom_fields.py index cf33e2800..33124a48c 100644 --- a/src/documents/tests/test_api_custom_fields.py +++ b/src/documents/tests/test_api_custom_fields.py @@ -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: