From ba518f63d599ced58c845e5ee4350576821728c4 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 2 Nov 2023 11:58:26 -0700 Subject: [PATCH] ReadWriteSerializerMethodField --- src/documents/serialisers.py | 50 +++++-------------- src/documents/tests/test_api_custom_fields.py | 20 ++++---- 2 files changed, 22 insertions(+), 48 deletions(-) diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 581e3f72e..bb16ce826 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -422,40 +422,19 @@ class CustomFieldOnUpdateSerializer(serializers.ModelSerializer): ] +class ReadWriteSerializerMethodField(serializers.SerializerMethodField): + def __init__(self, method_name=None, **kwargs): + self.method_name = method_name + kwargs["source"] = "*" + super(serializers.SerializerMethodField, self).__init__(**kwargs) + + def to_internal_value(self, data): + return {self.field_name: data} + + class CustomFieldInstanceSerializer(serializers.ModelSerializer): field = serializers.PrimaryKeyRelatedField(queryset=CustomField.objects.all()) - value = serializers.SerializerMethodField(read_only=True) - value_text = serializers.CharField(required=False, write_only=True) - value_bool = serializers.BooleanField(required=False, write_only=True) - value_url = serializers.URLField(required=False, write_only=True) - value_date = serializers.DateField(required=False, write_only=True) - value_int = serializers.IntegerField(required=False, write_only=True) - - def validate(self, data): - """ - Check that start is before finish. - """ - # Let the normal validation run first - data = super().validate(data) - # This field must exist, as it is validated - parent_field = data["field"] - type_to_key_map = { - CustomField.FieldDataType.STRING: "value_text", - CustomField.FieldDataType.URL: "value_url", - CustomField.FieldDataType.DATE: "value_date", - CustomField.FieldDataType.BOOL: "value_bool", - CustomField.FieldDataType.INT: "value_int", - } - # For the given data type, a certain key must exist - expected_key = type_to_key_map[parent_field.data_type] - if expected_key not in data: - raise serializers.ValidationError( - ( - f"Field of type {parent_field.data_type} must" - f' contain a "{expected_key}" key' - ), - ) - return data + value = ReadWriteSerializerMethodField() def create(self, validated_data): type_to_key_map = { @@ -476,7 +455,7 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer): instance, _ = CustomFieldInstance.objects.update_or_create( document=document, field=custom_field, - defaults={expected_key: validated_data[expected_key]}, + defaults={expected_key: validated_data["value"]}, ) return instance @@ -487,11 +466,6 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer): model = CustomFieldInstance fields = [ "value", - "value_text", - "value_bool", - "value_url", - "value_date", - "value_int", "field", ] diff --git a/src/documents/tests/test_api_custom_fields.py b/src/documents/tests/test_api_custom_fields.py index 168655380..c80e75cda 100644 --- a/src/documents/tests/test_api_custom_fields.py +++ b/src/documents/tests/test_api_custom_fields.py @@ -87,23 +87,23 @@ class TestCustomField(DirectoriesMixin, APITestCase): "custom_fields": [ { "field": custom_field_string.id, - "value_text": "test value", + "value": "test value", }, { "field": custom_field_date.id, - "value_date": date_value.isoformat(), + "value": date_value.isoformat(), }, { "field": custom_field_int.id, - "value_int": 3, + "value": 3, }, { "field": custom_field_boolean.id, - "value_bool": True, + "value": True, }, { "field": custom_field_url.id, - "value_url": "https://example.com", + "value": "https://example.com", }, ], }, @@ -150,7 +150,7 @@ class TestCustomField(DirectoriesMixin, APITestCase): "custom_fields": [ { "field": custom_field_string.id, - "value_text": "test value", + "value": "test value", }, ], }, @@ -170,7 +170,7 @@ class TestCustomField(DirectoriesMixin, APITestCase): "custom_fields": [ { "field": custom_field_string.id, - "value_text": "a new test value", + "value": "a new test value", }, ], }, @@ -207,11 +207,11 @@ class TestCustomField(DirectoriesMixin, APITestCase): "custom_fields": [ { "field": custom_field_string.id, - "value_text": "a new test value", + "value": "a new test value", }, { "field": custom_field_date.id, - "value_date": date_value.isoformat(), + "value": date_value.isoformat(), }, ], }, @@ -227,7 +227,7 @@ class TestCustomField(DirectoriesMixin, APITestCase): "custom_fields": [ { "field": custom_field_date.id, - "value_date": date_value.isoformat(), + "value": date_value.isoformat(), }, ], },