Skip to content
Snippets Groups Projects
serializers.py 2.8 KiB
Newer Older
"""
Serializers creating JSONs for every Model from .models
"""
from rest_framework import serializers
from .models import Sport, Criterion, Question, CriterionRating, validate_rating


class SportListSerializer(serializers.ModelSerializer):
    """
    Serializes all sports.
    """

    class Meta:
        model = Sport
borzechof99's avatar
borzechof99 committed
        fields = ("id", "name", "url", "criteria_ratings")
class QuestionListSerializer(serializers.ModelSerializer):
    """
    Serializes all Questions.
    """

    class Meta:
        model = Question
borzechof99's avatar
borzechof99 committed
        fields = ("id", "text", "criterion")
class CriterionListSerializer(serializers.ModelSerializer):
    """
    Serializes Criterions
    """

    class Meta:
        model = Criterion
borzechof99's avatar
borzechof99 committed
        fields = ("id", "name")


class SmallSportListSerializer(serializers.BaseSerializer):
    def to_representation(self, sport_instances):

        serialized_data = []

        for sport, boolean in sport_instances:
            serialized_data.append(
                {
                    "pk": sport.pk,
                    "name": sport.name,
                    "url": sport.url,
                    "is_filled": boolean,
                }
            )

        return serialized_data


class SingleSportSerializer(serializers.BaseSerializer):
    def to_representation(self, sport):

        serialized_data = {}

        serialized_data["pk"] = sport.pk
        serialized_data["name"] = sport.name
        serialized_data["url"] = sport.url

        criteria = []

        for criterion in sport.criteria_ratings.iterator():
            criterion_data = {}

            criterion_data["pk"] = criterion.pk
            criterion_data["name"] = criterion.name

            criterion_data["value"] = sport.get_rating(criterion)

            criteria.append(criterion_data)

        serialized_data["criteria"] = criteria

        return serialized_data

    def to_internal_value(self, request):
        """
        The Data in the Request is taken and written to another Dictionary.
        During this process, the Data is Validated on:
        - whether Name and URL for Sport exist
        - whether the Rating Value and Criterion ID are valid
        """
        for field_value in ["name", "url"]:
            try:
                data[field_value] = request.data[field_value]
            except:
                data["valid_request"] = False
                return data

        data["criteria"] = []

        for criterion in request.data["criteria"]:

            value = criterion["value"]
            try:
                validate_rating(value)
                crit = Criterion.objects.get(pk=criterion["id"])
            except:
                data["valid_request"] = False
                return data

            data["criteria"].append((crit, value))

        return data