From a13eddda0807d784eedf7c1b14002ca6d30600f6 Mon Sep 17 00:00:00 2001
From: borzechof99 <borzechof99@mi.fu-berlin.de>
Date: Mon, 21 Jun 2021 13:15:38 +0200
Subject: [PATCH] sportlist and single sport in different views, to be changed

---
 unisportomat/quiz/serializers.py  | 37 ++++++++++++++-
 unisportomat/quiz/views.py        | 75 ++++++++++++++++++++++++++++++-
 unisportomat/unisportomat/urls.py |  4 +-
 3 files changed, 113 insertions(+), 3 deletions(-)

diff --git a/unisportomat/quiz/serializers.py b/unisportomat/quiz/serializers.py
index f17f486..0400657 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
+from .models import Sport, Criterion, Question, CriterionRating
 
 
 class SportListSerializer(serializers.ModelSerializer):
@@ -52,3 +52,38 @@ class SmallSportListSerializer(serializers.BaseSerializer):
             )
 
         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
+
+            # The iterator iterates over the Criterions connected, and not the criterion connection itself, so we need to get that one again
+            criterion_data["value"] = CriterionRating.objects.get(
+                criterion=criterion.pk, sport=sport.pk
+            ).rating
+
+            criteria.append(criterion_data)
+
+        serialized_data["criteria"] = criteria
+
+        return serialized_data
+
+    def to_internal_value(self, request):
+
+        # Probably do some Testing and Data Verification here?
+
+        return request.data
diff --git a/unisportomat/quiz/views.py b/unisportomat/quiz/views.py
index 5c528aa..8aca5df 100644
--- a/unisportomat/quiz/views.py
+++ b/unisportomat/quiz/views.py
@@ -11,6 +11,7 @@ from .serializers import (
     SportListSerializer,
     CriterionListSerializer,
     QuestionListSerializer,
+    SingleSportSerializer,
 )
 from .models import Sport, Criterion, Question
 
@@ -56,9 +57,30 @@ class SmallSportListView(viewsets.ViewSet):
     TODO: More Documentation
     """
 
+    # GET for api/admin/sport/
     def list(self, request):
 
-        return Response({"test": 0})
+        return Response({"test": "Showing all Entries"})
+
+    # POST for api/admin/sport/
+    def create(self, request):
+
+        return Response({"test": "Creating a new Entry"})
+
+    # GET for api/admin/sport/<id>/
+    def retrieve(self, request, pk=None):
+
+        return Response({"test": "Getting a Single Entry"})
+
+    # PUT for api/admin/sport/<id>/
+    def update(self, request, pk=None):
+
+        return Response({"test": "Updating a Single Entry"})
+
+    # DELETE for api/admin/sport/<id>/
+    def destroy(self, request, pk=None):
+
+        return Response({"test": "Removing a Single Entry"})
 
 
 # Dev Notes:
@@ -75,6 +97,8 @@ class SmallSportListAPIView(APIView):
     TODO: More Documentation
     """
 
+    authentication_classes = []
+
     def get(self, request):
 
         sports = Sport.objects.all()
@@ -103,3 +127,52 @@ class SmallSportListAPIView(APIView):
         serializer = SmallSportListSerializer(is_filled_tuples)
 
         return Response(serializer.data)
+
+
+class SingleSportAPIView(APIView):
+
+    authentication_classes = []
+
+    def get(self, request, pk):
+
+        return Response(SingleSportSerializer(Sport.objects.get(pk=pk)).data)
+
+    def put(self, request, pk):
+
+        data_dict = SingleSportSerializer().to_internal_value(request)
+
+        sport = Sport.objects.get(pk=pk)
+
+        print(data_dict)
+
+        return Response([])
+
+
+class CreateSportAPIView(APIView):
+
+    authentication_classes = []
+
+    def post(self, request):
+
+        data_dict = SingleSportSerializer().to_internal_value(request)
+
+        print(data_dict)
+
+        new_sport = Sport()
+
+        new_sport.name = data_dict["name"]
+        new_sport.url = data_dict["url"]
+
+        # 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["pk"]), criterion["value"]
+            )
+
+        new_sport.save()
+
+        response = SingleSportSerializer(new_sport)
+
+        return Response(response.data)
diff --git a/unisportomat/unisportomat/urls.py b/unisportomat/unisportomat/urls.py
index 480adf1..de0f819 100644
--- a/unisportomat/unisportomat/urls.py
+++ b/unisportomat/unisportomat/urls.py
@@ -27,5 +27,7 @@ router.register(r"small-sport-list", views.SmallSportListView, "small-sport-list
 urlpatterns = [
     path("admin/", admin.site.urls),
     path("api/admin/", include(router.urls)),
-    path(r"api/admin/single-small-sport-list", views.SmallSportListAPIView.as_view()),
+    path("api/admin/single-small-sport-list", views.SmallSportListAPIView.as_view()),
+    path("api/admin/single-sport/<int:pk>", views.SingleSportAPIView.as_view()),
+    path("api/admin/single-sport", views.CreateSportAPIView.as_view()),
 ]
-- 
GitLab