Skip to content
Snippets Groups Projects
views.py 4.82 KiB
Newer Older
"""
Defines the views for the API
"""

dominip89's avatar
dominip89 committed
# from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import (
    SmallSportListSerializer,
    SportListSerializer,
    CriterionListSerializer,
    QuestionListSerializer,
)
from .models import Sport, Criterion, Question
dominip89's avatar
dominip89 committed

# Create your views here.
dominip89's avatar
dominip89 committed
class SportListView(viewsets.ModelViewSet):  # pylint: disable=too-many-ancestors
    """
    A View returning every Sport Object
    """

    serializer_class = SportListSerializer
    queryset = Sport.objects.all()


dominip89's avatar
dominip89 committed
class CriterionListView(viewsets.ModelViewSet):  # pylint: disable=too-many-ancestors
    """
    A View returning every Criterion Object
    """

    serializer_class = CriterionListSerializer
    queryset = Criterion.objects.all()


class QuestionListView(viewsets.ModelViewSet):  # pylint: disable=too-many-ancestors
    """
    A View returning every Question Object
    """

    serializer_class = QuestionListSerializer
    queryset = Question.objects.all()


# Dev Notes:
# - If we want to include a View in the Router in urls.py, the View needs to be a Viewset
# - Those are mostly meant for Lists of Objects, so instead of get() and post(), list() and create() are used respectively
# https://stackoverflow.com/questions/30389248/how-can-i-register-a-single-view-not-a-viewset-on-my-router


class SmallSportListView(viewsets.ViewSet):
    """
    View for the List of Sports on the Sport Homepage
    TODO: More Documentation
    """

    # GET for api/admin/sport/
    def list(self, request):

        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:
# - This is a singular APIView which isn't meant to expose complete lists
# - It cannot be written into the Router, as it isn't a Viewset, so it is written directly into the urls.py's urlspatterns like this:
# path(r"api/admin/single-small-sport-list", views.SmallSportListAPIView.as_view())
# - The API isn't in the list in /api/admin because of that, but needs to be called manually here:
# http://localhost:8000/api/admin/single-small-sport-list


class SmallSportListAPIView(APIView):
    """
    View for the List of Sports on the Sport Homepage
    TODO: More Documentation
    """

    def get(self, request):

        sports = Sport.objects.all()
        criteria = Criterion.objects.all()
        is_filled_tuples = []

        for sport in sports.iterator():

            filled_criteria_pks = []

            # 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))

        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)