diff --git a/unisportomat/quiz/models.py b/unisportomat/quiz/models.py index d64e9056d0203d800eeb85875094ad329c7a566f..23168aab06b48b6b4cd82234a33eec16f6aa780a 100644 --- a/unisportomat/quiz/models.py +++ b/unisportomat/quiz/models.py @@ -10,8 +10,7 @@ def validate_rating(value): TODO: Validations are only run when using Model Forms. """ - print("Validating") - if not (value <= 10 or value >= 1 or value == -1): + if not (value <= 10 and value >= 1 or value == -1): raise ValidationError(u"%s is not a valid rating!" % value) @@ -79,6 +78,17 @@ class Sport(models.Model): criterion_rating = CriterionRating.objects.get(sport=self, criterion=criterion) return criterion_rating.rating + def is_filled(self): + """ + Returns a Boolean whether all Criterions are given a valid rating (unequal to -1) + """ + + for crit in self.criteria_ratings.iterator(): + if self.get_rating(crit) == -1: + return False + + return True + class CriterionManager(models.Manager): """ diff --git a/unisportomat/quiz/serializers.py b/unisportomat/quiz/serializers.py index 01420695d5f4ebe1249af77b7f596c64c2431de6..601fdbb3c422bb4684f72f43c2a2e63892862f89 100644 --- a/unisportomat/quiz/serializers.py +++ b/unisportomat/quiz/serializers.py @@ -2,7 +2,7 @@ Serializers creating JSONs for every Model from .models """ from rest_framework import serializers -from .models import Sport, Criterion, Question, CriterionRating +from .models import Sport, Criterion, Question, CriterionRating, validate_rating class SportListSerializer(serializers.ModelSerializer): @@ -79,7 +79,34 @@ class SingleSportSerializer(serializers.BaseSerializer): 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 + """ - # Probably do some Testing and Data Verification here? + data = {"valid_request": True} - return request.data + 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 diff --git a/unisportomat/quiz/views.py b/unisportomat/quiz/views.py index 00cee7aa99b10690520a8b99d5759b1060bcf7e0..dc024179b293b403bfa57c884896708e5ca1e757 100644 --- a/unisportomat/quiz/views.py +++ b/unisportomat/quiz/views.py @@ -7,7 +7,7 @@ from rest_framework import viewsets from rest_framework.views import APIView from rest_framework.response import Response from django.shortcuts import get_object_or_404 -from django.http import JsonResponse +from django.http import JsonResponse, HttpResponse from .pagination import PageNumberWithPageSizePagination from .serializers import ( @@ -91,24 +91,7 @@ class SmallSportListView(viewsets.ViewSet): for sport in sports: - filled_criteria_pks = [] - - # TODO: Change the way that unfilled Criteria are detected (look for value -1) - # TODO: is_filled as function of sport - # Get pks of Criteria which are connected to the sport - for criterion in sport.criteria_ratings.iterator(): - filled_criteria_pks.append(criterion.pk) - - is_filled = True - - # Check every existing criterion whether it is in the generated list - for criterion in criteria.all(): - if criterion.pk not in filled_criteria_pks: - # A criterion isn't filled out, so stop and set to false - is_filled = False - break - - is_filled_tuples.append((sport, is_filled)) + is_filled_tuples.append((sport, sport.is_filled())) serializer = SmallSportListSerializer(is_filled_tuples) @@ -119,7 +102,9 @@ class SmallSportListView(viewsets.ViewSet): data_dict = SingleSportSerializer().to_internal_value(request) - print(data_dict) + # A Try at Error Catching + if not data_dict["valid_request"]: + return HttpResponse(status=400) new_sport = Sport.objects.create_sport() @@ -129,10 +114,8 @@ class SmallSportListView(viewsets.ViewSet): # Before writing other Database Entries for Rating, the Sport needs to be saved once new_sport.save() - for criterion in data_dict["criteria"]: - new_sport.rate( - Criterion.objects.get(pk=criterion["id"]), criterion["value"] - ) + for criterion, value in data_dict["criteria"]: + new_sport.rate(criterion, value) new_sport.save()