""" 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 fields = ("id", "name", "url", "criteria_ratings") class QuestionListSerializer(serializers.ModelSerializer): """ Serializes all Questions. """ class Meta: model = Question fields = ("id", "text", "criterion") class CriterionListSerializer(serializers.ModelSerializer): """ Serializes Criterions """ class Meta: model = Criterion 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 """ data = {"valid_request": True} 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