Skip to content

Commit

Permalink
[#12] Fix missing param when post/put form
Browse files Browse the repository at this point in the history
  • Loading branch information
wayangalihpratama committed Sep 21, 2023
1 parent f3ea7e0 commit 4accceb
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 34 deletions.
16 changes: 6 additions & 10 deletions backend/akvo/core_forms/serializers/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ class AddFormSerializer(serializers.Serializer):
id = CustomIntegerField()
name = CustomCharField()
description = CustomCharField(required=False, allow_null=True)
default_language = CustomCharField(
defaultLanguage = CustomCharField(
required=False, allow_null=True, default="en")
languages = CustomListField(
required=False, allow_null=True, default=["en"])
Expand All @@ -82,18 +82,12 @@ class AddFormSerializer(serializers.Serializer):
translations = CustomListField(required=False, allow_null=True)
question_group = AddQuestionGroupSerializer(many=True, required=False)

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 __init__(self, **kwargs):
super().__init__(**kwargs)

def validate_question_group(self, value):
serializer = AddQuestionGroupSerializer(data=value, many=True)
if not serializer.is_valid():
print('QG ERROR', serializer.errors)
raise serializers.ValidationError({
"message": validate_serializers_message(serializer.errors),
"details": serializer.errors,
Expand All @@ -102,6 +96,8 @@ def validate_question_group(self, value):

def create(self, validated_data):
question_groups_data = validated_data.pop("question_group", [])
validated_data["default_language"] = validated_data.pop(
"defaultLanguage", None)
form = Forms.objects.create(**validated_data)
for qg in question_groups_data:
serializer = AddQuestionGroupSerializer(data=qg)
Expand All @@ -124,7 +120,7 @@ def update(self, instance, validated_data):
instance.languages = validated_data.get(
'languages', instance.languages)
instance.default_language = validated_data.get(
'default_language', instance.default_language)
'defaultLanguage', instance.default_language)
instance.translations = validated_data.get(
'translations', instance.translations)

Expand Down
23 changes: 8 additions & 15 deletions backend/akvo/core_forms/serializers/question.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,21 +180,13 @@ class AddQuestionSerializer(serializers.Serializer):
dependency = CustomListField(required=False, allow_null=True)
api = CustomJSONField(required=False, allow_null=True)
extra = CustomListField(required=False, allow_null=True)
autofield = CustomJSONField(required=False, allow_null=True)
data_api_url = CustomCharField(required=False, allow_null=True)
fn = CustomJSONField(required=False, allow_null=True)
dataApiUrl = CustomCharField(required=False, allow_null=True)
translations = CustomListField(required=False, allow_null=True)
option = AddOptionSerializer(many=True, required=False, allow_null=True)

def __init__(self, *args, **kwargs):
# Get the value
data_api_url = kwargs.pop('dataApiUrl', None)
autofield = kwargs.pop('fn', None)
super(AddQuestionSerializer, self).__init__(*args, **kwargs)
# Set the value
if data_api_url:
self.fields['data_api_url'].initial = data_api_url
if autofield:
self.fields['autofield'].initial = autofield
def __init__(self, **kwargs):
super().__init__(**kwargs)

def validate_type(self, value):
qtype = getattr(QuestionTypes, value)
Expand All @@ -207,7 +199,6 @@ def validate_option(self, value):
return None
serializer = AddOptionSerializer(data=value, many=True)
if not serializer.is_valid():
print('OPT ERROR', serializer.errors)
raise serializers.ValidationError({
"message": validate_serializers_message(serializer.errors),
"details": serializer.errors,
Expand All @@ -218,6 +209,8 @@ def create(self, validated_data):
options_data = validated_data.pop("option", [])
qtype = validated_data.pop("type", None)
validated_data["type"] = getattr(QuestionTypes, qtype)
validated_data["data_api_url"] = validated_data.pop("dataApiUrl", None)
validated_data["autofield"] = validated_data.pop("fn", None)
q = Questions.objects.create(**validated_data)
for opt in options_data:
serializer = AddOptionSerializer(data=opt)
Expand Down Expand Up @@ -262,9 +255,9 @@ def update(self, instance, validated_data):
instance.extra = validated_data.get(
'extra', instance.extra)
instance.autofield = validated_data.get(
'autofield', instance.autofield)
'fn', instance.autofield)
instance.data_api_url = validated_data.get(
'data_api_url', instance.data_api_url)
'dataApiUrl', instance.data_api_url)
instance.translations = validated_data.get(
'translations', instance.translations)

Expand Down
9 changes: 2 additions & 7 deletions backend/akvo/core_forms/serializers/question_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,8 @@ class AddQuestionGroupSerializer(serializers.Serializer):
translations = CustomListField(required=False, allow_null=True)
question = AddQuestionSerializer(many=True)

def __init__(self, *args, **kwargs):
# Get the value
form = kwargs.pop('form', None)
super(AddQuestionGroupSerializer, self).__init__(*args, **kwargs)
# Set the value
if form:
self.fields['form'].initial = form
def __init__(self, **kwargs):
super().__init__(**kwargs)

def validate_question(self, value):
serializer = AddQuestionSerializer(data=value, many=True)
Expand Down
81 changes: 81 additions & 0 deletions backend/akvo/core_forms/tests/test_form_update_endpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,89 @@
from django.test.utils import override_settings

from akvo.core_forms.models import Options
import json


@override_settings(USE_TZ=False)
class TestFormUpdateEndpoint(TestCase):
def test_post_data(self):
payload = {
"id": 1695287858303,
"name": "New Form",
"description": "New Form Description",
"languages": ["en", "af"],
"defaultLanguage": "af",
"question_group": [{
"id": 1695287858304,
"name": "Eu augue consectetur",
"order": 1,
"repeatable": False,
"question": [{
"id": 1695287858305,
"order": 1,
"questionGroupId": 1695287858304,
"name": "Amet lorem porta at suscipit facilisis",
"type": "autofield",
"required": False,
"meta": False,
"dataApiUrl": "test.com",
"fn": {
"multiline": False,
"fnString": "() => console.log('test')",
"fnColor": {}
}
}]
}]
}
# POST
data = self.client.post(
"/api/form",
data=payload,
content_type="application/json"
)
self.assertEqual(data.status_code, 200)
result = data.json()
self.assertEqual(result, {"message": "ok"})
# GET
data = self.client.get(
"/api/form/1695287858303",
follow=True
)
self.assertEqual(data.status_code, 200)
result = data.json()
print(json.dumps(result, indent=2))
self.assertEqual(result, {
"id": 1695287858303,
"name": "New Form",
"description": "New Form Description",
"defaultLanguage": "af",
"languages": ["en", "af"],
"version": 1,
"translations": None,
"question_group": [{
"id": 1695287858304,
"name": "Eu augue consectetur",
"description": None,
"order": 1,
"repeatable": False,
"translations": None,
"question": [{
"id": 1695287858305,
"name": "Amet lorem porta at suscipit facilisis",
"order": 1,
"type": "autofield",
"required": False,
"meta": False,
"fn": {
"fnColor": {},
"fnString": "() => console.log('test')",
"multiline": False
},
"dataApiUrl": "test.com"
}]
}]
})

def test_update_form_with_updated_options(self):
payload = {
"id": 1693992073895,
Expand Down Expand Up @@ -69,6 +148,7 @@ def test_update_form_with_updated_options(self):
"required": False,
"meta": False,
"allowOther": False,
"dataApiUrl": "https://jsonplaceholder.typicode.com/todos/1",
"option": [{
"code": "NO1",
"name": "New Option 1",
Expand Down Expand Up @@ -122,6 +202,7 @@ def test_update_form_with_updated_options(self):
"type": "option",
"required": False,
"meta": False,
"dataApiUrl": "https://jsonplaceholder.typicode.com/todos/1",
"option": [{
"id": 1693992338940,
"code": "NO1",
Expand Down
2 changes: 0 additions & 2 deletions backend/akvo/core_forms/views/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ class FormManagementView(APIView):
def post(self, request):
serializer = AddFormSerializer(data=request.data)
if not serializer.is_valid():
print('FORM ERROR', serializer.errors)
return Response(
{
"message": validate_serializers_message(serializer.errors),
Expand All @@ -86,7 +85,6 @@ def put(self, request):
instance = get_object_or_404(Forms, pk=form_id)
serializer = AddFormSerializer(data=request.data)
if not serializer.is_valid():
print('FORM ERROR', serializer.errors)
return Response(
{
"message": validate_serializers_message(serializer.errors),
Expand Down

0 comments on commit 4accceb

Please sign in to comment.