Skip to content

Commit

Permalink
[#12] Update add form, question_group, question serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
wayangalihpratama committed Sep 5, 2023
1 parent c3c4f58 commit 0808190
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 11 deletions.
30 changes: 24 additions & 6 deletions backend/akvo/core_forms/serializers/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
CustomCharField,
CustomListField
)
from akvo.utils.custom_serializer_fields import validate_serializers_message


class ListFormSerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -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
Expand All @@ -90,5 +109,4 @@ class Meta:
"languages",
"version",
"translations",
"question_group"
]
25 changes: 22 additions & 3 deletions backend/akvo/core_forms/serializers/question.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,18 @@

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,
CustomJSONField,
CustomListField,
CustomBooleanField,
)
from akvo.utils.custom_serializer_fields import validate_serializers_message


class ListQuestionSerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -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()
Expand All @@ -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
Expand All @@ -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 = [
Expand All @@ -177,5 +197,4 @@ class Meta:
"translations",
"data_api_url",
"autofield",
"option",
]
20 changes: 18 additions & 2 deletions backend/akvo/core_forms/serializers/question_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
CustomCharField,
CustomBooleanField
)
from akvo.utils.custom_serializer_fields import validate_serializers_message


class ListQuestionGroupSerializer(serializers.ModelSerializer):
Expand All @@ -38,18 +39,34 @@ class Meta:


class AddQuestionGroupSerializer(serializers.ModelSerializer):
form = CustomIntegerField(read_only=True)
id = CustomIntegerField()
name = CustomCharField()
description = CustomCharField(required=False, allow_null=True)
order = CustomIntegerField()
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 = [
Expand All @@ -59,5 +76,4 @@ class Meta:
"order",
"repeatable",
"translations",
"question"
]

0 comments on commit 0808190

Please sign in to comment.