from rest_framework import serializers
from .models import EvaluationTest, Question, Choice, GradeEvaluationText, Category
from users.models import User
class StringSerializer(serializers.StringRelatedField):
def to_internal_value(self, value):
return value
class ChoiceSerializer(serializers.ModelSerializer):
class Meta:
model = Choice
fields = '__all__'
class QuestionSerializer(serializers.ModelSerializer):
choices = ChoiceSerializer(many=True)
answer_text = serializers.CharField(
max_length=50, required=True, write_only=True)
class Meta:
model = Question
fields = ('id', 'choices', 'question',
'order', 'answer_text', 'answer')
read_only_fields = ('answer', )
def validate(self, attrs):
attrs = super().validate(attrs)
if not any(map(lambda x: x['title'] == attrs["answer_text"], attrs["choices"])):
raise serializers.ValidationError("Answer must match the choices")
self.answer_text = attrs["answer_text"]
del attrs["answer_text"]
return attrs
def create(self, validated_data):
choices = validated_data.pop("choices")
question = super().create(validated_data)
for choice_data in choices:
choice = Choice.objects.create(title=choice_data["title"])
question.choices.add(choice)
if choice_data["title"] == self.answer_text:
question.answer = choice
question.save()
return question
def update(self, instance, validated_data):
choices = validated_data.pop["choices"]
instance = super().update(instance, validated_data)
choices = ChoiceSerializer(data=choices, many=True)
choices.is_valid(raise_exception=True)
choices = choices.save()
old_ids = list(instance.choices.values_list("id", flat=True))
for choice in choices:
instance.choices.add(choice)
if self.answer_text == choice.title:
instance.answer = choice
Choice.objects.filter(id__in=old_ids).delete()
return instance
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'
class EvaluationTestSerializer(serializers.ModelSerializer):
questions = serializers.SerializerMethodField()
class Meta:
model = EvaluationTest
fields = '__all__'
def get_questions(self, obj):
return QuestionSerializer(obj.questions.all(), many=True).data
# def by_category(category_id):
# tests = EvaluationTest.objects.filter(category_id=category_id)
# items = EvaluationTestSerializer(tests, many=True).data
# return items