diff --git a/webapp/migrations/0062_auto_20191110_2117.py b/webapp/migrations/0062_auto_20191110_2117.py new file mode 100644 index 0000000..671ed04 --- /dev/null +++ b/webapp/migrations/0062_auto_20191110_2117.py @@ -0,0 +1,19 @@ +# Generated by Django 2.1.5 on 2019-11-10 19:17 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0061_auto_20191110_2024'), + ] + + operations = [ + migrations.AlterField( + model_name='templatequestion', + name='question', + field=django.contrib.postgres.fields.jsonb.JSONField(), + ), + ] diff --git a/webapp/models.py b/webapp/models.py index 7e23446..c84bdd4 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -77,9 +77,8 @@ class Event(BaseFeed): class TemplateQuestion(models.Model): """Stores template questions for signup forms as JSONB""" - # question = JSONField() name = models.CharField(max_length=255) - question = models.CharField(max_length=255) + question = JSONField() def __str__(self): return _('Template questions: {}').format(self.name) diff --git a/webapp/serializers.py b/webapp/serializers.py index f3bb508..25517ae 100644 --- a/webapp/serializers.py +++ b/webapp/serializers.py @@ -1,21 +1,14 @@ from rest_framework import serializers from webapp.models import * -import json -class SignupFormSerializer(serializers.ModelSerializer): +class SignupFormSerializer(serializers.HyperlinkedModelSerializer): + questions = serializers.JSONField(binary=True) + class Meta: model = SignupForm fields = ('id', 'title', 'start_time', 'end_time', 'questions') - def create(self, validated_data): - validated_data["questions"] = json.loads(validated_data["questions"]) - return super().create(validated_data) - - def update(self, instance, validated_data): - validated_data["questions"] = json.loads(validated_data["questions"]) - return super().update(instance, validated_data) - class EventSerializer(serializers.ModelSerializer): signupForm = SignupFormSerializer(many=True, read_only=True, required=False) @@ -63,6 +56,7 @@ class SignupSerializer(serializers.ModelSerializer): source="signupForm", queryset=SignupForm.objects.all() ) + answer = serializers.JSONField(binary=True) class Meta: model = Signup @@ -73,16 +67,10 @@ class SignupSerializer(serializers.ModelSerializer): } } - def create(self, validated_data): - validated_data["answer"] = json.loads(validated_data["answer"]) - return super().create(validated_data) - - def update(self, instance, validated_data): - validated_data["answer"] = json.loads(validated_data["answer"]) - return super().update(instance, validated_data) - class SavedQuestionsSerializer(serializers.ModelSerializer): + question = serializers.JSONField(binary=True) + class Meta: model = TemplateQuestion fields = ('id', 'name', 'question') diff --git a/webapp/tests/signup_fixture.py b/webapp/tests/signup_fixture.py index dc3078c..48cb756 100644 --- a/webapp/tests/signup_fixture.py +++ b/webapp/tests/signup_fixture.py @@ -3,7 +3,7 @@ from django.utils import timezone from webapp.utils import month_from_now ALL_QUESTION_TYPES = [ - + {"id": "j5CeRZDvl", "name": "Asd", "type": "text", "options": []}, {"id": "RHJhSoaLD", "name": "Asd2", "type": "radiobutton", "options": ["Yes", "no", "maybe"]}, {"id": "i10d426d5", "name": "Asd3", "type": "checkbox", "options": ["A", "B", "C"]} ] diff --git a/webapp/views.py b/webapp/views.py index bd07ca0..d6b3922 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -55,9 +55,10 @@ class SignupFormViewSet(viewsets.ModelViewSet): queryset = SignupForm.objects.all() serializer_class = SignupFormSerializer permission_classes = [IsAuthenticatedOrReadOnly] - filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter) - filter_fields = '__all__' - search_fields = '__all__' + # Throws errors with JSONFIeld. Modify __all__ to not use JSONField if filters are enadbled + # filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter) + # filter_fields = '__all__' + # search_fields = '__all__' def get_queryset(self): return SignupForm.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time')