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):
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",
]

View File

@ -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(),
},
],
},