ReadWriteSerializerMethodField

This commit is contained in:
shamoon 2023-11-02 11:58:26 -07:00
parent e418e0db88
commit ba518f63d5
2 changed files with 22 additions and 48 deletions

View File

@ -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): class CustomFieldInstanceSerializer(serializers.ModelSerializer):
field = serializers.PrimaryKeyRelatedField(queryset=CustomField.objects.all()) field = serializers.PrimaryKeyRelatedField(queryset=CustomField.objects.all())
value = serializers.SerializerMethodField(read_only=True) value = ReadWriteSerializerMethodField()
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
def create(self, validated_data): def create(self, validated_data):
type_to_key_map = { type_to_key_map = {
@ -476,7 +455,7 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer):
instance, _ = CustomFieldInstance.objects.update_or_create( instance, _ = CustomFieldInstance.objects.update_or_create(
document=document, document=document,
field=custom_field, field=custom_field,
defaults={expected_key: validated_data[expected_key]}, defaults={expected_key: validated_data["value"]},
) )
return instance return instance
@ -487,11 +466,6 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer):
model = CustomFieldInstance model = CustomFieldInstance
fields = [ fields = [
"value", "value",
"value_text",
"value_bool",
"value_url",
"value_date",
"value_int",
"field", "field",
] ]

View File

@ -87,23 +87,23 @@ class TestCustomField(DirectoriesMixin, APITestCase):
"custom_fields": [ "custom_fields": [
{ {
"field": custom_field_string.id, "field": custom_field_string.id,
"value_text": "test value", "value": "test value",
}, },
{ {
"field": custom_field_date.id, "field": custom_field_date.id,
"value_date": date_value.isoformat(), "value": date_value.isoformat(),
}, },
{ {
"field": custom_field_int.id, "field": custom_field_int.id,
"value_int": 3, "value": 3,
}, },
{ {
"field": custom_field_boolean.id, "field": custom_field_boolean.id,
"value_bool": True, "value": True,
}, },
{ {
"field": custom_field_url.id, "field": custom_field_url.id,
"value_url": "https://example.com", "value": "https://example.com",
}, },
], ],
}, },
@ -150,7 +150,7 @@ class TestCustomField(DirectoriesMixin, APITestCase):
"custom_fields": [ "custom_fields": [
{ {
"field": custom_field_string.id, "field": custom_field_string.id,
"value_text": "test value", "value": "test value",
}, },
], ],
}, },
@ -170,7 +170,7 @@ class TestCustomField(DirectoriesMixin, APITestCase):
"custom_fields": [ "custom_fields": [
{ {
"field": custom_field_string.id, "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": [ "custom_fields": [
{ {
"field": custom_field_string.id, "field": custom_field_string.id,
"value_text": "a new test value", "value": "a new test value",
}, },
{ {
"field": custom_field_date.id, "field": custom_field_date.id,
"value_date": date_value.isoformat(), "value": date_value.isoformat(),
}, },
], ],
}, },
@ -227,7 +227,7 @@ class TestCustomField(DirectoriesMixin, APITestCase):
"custom_fields": [ "custom_fields": [
{ {
"field": custom_field_date.id, "field": custom_field_date.id,
"value_date": date_value.isoformat(), "value": date_value.isoformat(),
}, },
], ],
}, },