From 0808190e81a7a66277a0e5b69caf32a71b981399 Mon Sep 17 00:00:00 2001 From: wayangalihpratama Date: Tue, 5 Sep 2023 19:46:27 +0800 Subject: [PATCH] [#12] Update add form, question_group, question serializer --- backend/akvo/core_forms/serializers/form.py | 30 +++++++++++++++---- .../akvo/core_forms/serializers/question.py | 25 ++++++++++++++-- .../core_forms/serializers/question_group.py | 20 +++++++++++-- 3 files changed, 64 insertions(+), 11 deletions(-) diff --git a/backend/akvo/core_forms/serializers/form.py b/backend/akvo/core_forms/serializers/form.py index 931789b..9dfcc1e 100644 --- a/backend/akvo/core_forms/serializers/form.py +++ b/backend/akvo/core_forms/serializers/form.py @@ -12,6 +12,7 @@ CustomCharField, CustomListField ) +from akvo.utils.custom_serializer_fields import validate_serializers_message class ListFormSerializer(serializers.ModelSerializer): @@ -68,17 +69,35 @@ class AddFormSerializer(serializers.ModelSerializer): name = CustomCharField() description = CustomCharField(required=False, allow_null=True) default_language = CustomCharField( - required=False, allow_null=True, - default="en", source="defaultLanguage") + required=False, allow_null=True, default="en") languages = CustomListField( required=False, allow_null=True, default=["en"]) version = CustomIntegerField( required=False, allow_null=True, default=1) translations = CustomListField(required=False, allow_null=True) - question_group = AddQuestionGroupSerializer(many=True) - def __init__(self, **kwargs): - super().__init__(**kwargs) + def __init__(self, *args, **kwargs): + # Get the value + default_language = kwargs.pop('defaultLanguage', None) + super(AddFormSerializer, self).__init__(*args, **kwargs) + # Set the value + if default_language: + self.fields['default_language'].initial = default_language + + def create(self, validated_data): + question_groups_data = validated_data.pop("question_group", []) + form = Forms.objects.create(**validated_data) + for qg in question_groups_data: + qg["form"] = form + serializer = AddQuestionGroupSerializer(data=qg) + if not serializer.is_valid(): + raise serializers.ValidationError({ + "message": validate_serializers_message(serializer.errors), + "details": serializer.errors, + }) + serializer.save() + return object + return form class Meta: model = Forms @@ -90,5 +109,4 @@ class Meta: "languages", "version", "translations", - "question_group" ] diff --git a/backend/akvo/core_forms/serializers/question.py b/backend/akvo/core_forms/serializers/question.py index 2b9990d..742f2dc 100644 --- a/backend/akvo/core_forms/serializers/question.py +++ b/backend/akvo/core_forms/serializers/question.py @@ -6,7 +6,10 @@ from akvo.core_forms.constants import QuestionTypes from akvo.core_forms.models import Questions -from akvo.core_forms.serializers.option import ListOptionSerializer +from akvo.core_forms.serializers.option import ( + ListOptionSerializer, + AddOptionSerializer, +) from akvo.utils.custom_serializer_fields import ( CustomIntegerField, CustomCharField, @@ -14,6 +17,7 @@ CustomListField, CustomBooleanField, ) +from akvo.utils.custom_serializer_fields import validate_serializers_message class ListQuestionSerializer(serializers.ModelSerializer): @@ -123,6 +127,8 @@ class Meta: class AddQuestionSerializer(serializers.ModelSerializer): + form = CustomIntegerField(read_only=True) + question_group = CustomIntegerField(read_only=True) id = CustomIntegerField() name = CustomCharField() order = CustomIntegerField() @@ -141,7 +147,6 @@ class AddQuestionSerializer(serializers.ModelSerializer): autofield = CustomJSONField(required=False, allow_null=True) data_api_url = CustomCharField(required=False, allow_null=True) translations = CustomListField(required=False, allow_null=True) - option = CustomListField(required=False, allow_null=True) def __init__(self, *args, **kwargs): # Get the value @@ -160,6 +165,21 @@ def validate_type(self, value): raise serializers.ValidationError("Invalid question type") return qtype + def create(self, validated_data): + options_data = validated_data.pop("option", []) + q = Questions.objects.create(**validated_data) + for opt in options_data: + opt["question"] = q + serializer = AddOptionSerializer(data=opt) + if not serializer.is_valid(): + raise serializers.ValidationError({ + "message": validate_serializers_message(serializer.errors), + "details": serializer.errors, + }) + serializer.save() + return object + return q + class Meta: model = Questions fields = [ @@ -177,5 +197,4 @@ class Meta: "translations", "data_api_url", "autofield", - "option", ] diff --git a/backend/akvo/core_forms/serializers/question_group.py b/backend/akvo/core_forms/serializers/question_group.py index 4834660..6aa6e21 100644 --- a/backend/akvo/core_forms/serializers/question_group.py +++ b/backend/akvo/core_forms/serializers/question_group.py @@ -12,6 +12,7 @@ CustomCharField, CustomBooleanField ) +from akvo.utils.custom_serializer_fields import validate_serializers_message class ListQuestionGroupSerializer(serializers.ModelSerializer): @@ -38,6 +39,7 @@ class Meta: class AddQuestionGroupSerializer(serializers.ModelSerializer): + form = CustomIntegerField(read_only=True) id = CustomIntegerField() name = CustomCharField() description = CustomCharField(required=False, allow_null=True) @@ -45,11 +47,26 @@ class AddQuestionGroupSerializer(serializers.ModelSerializer): repeatable = CustomBooleanField( required=False, allow_null=True, default=False) translations = CustomListField(required=False, allow_null=True) - question = AddQuestionSerializer(many=True) def __init__(self, **kwargs): super().__init__(**kwargs) + def create(self, validated_data): + questions_data = validated_data.pop("question", []) + qg = QuestionGroups.objects.create(**validated_data) + for q in questions_data: + q["form"] = validated_data.get("form") + q["question_group"] = qg + serializer = AddQuestionSerializer(data=q) + if not serializer.is_valid(): + raise serializers.ValidationError({ + "message": validate_serializers_message(serializer.errors), + "details": serializer.errors, + }) + serializer.save() + return object + return qg + class Meta: model = QuestionGroups fields = [ @@ -59,5 +76,4 @@ class Meta: "order", "repeatable", "translations", - "question" ]