Skip to content
Snippets Groups Projects
Commit 0215e3e1 authored by borzechof99's avatar borzechof99 :whale2:
Browse files

Implement Sport PUT,PATCH,DELETE, IncompleteSport GET, Criteria GET

parent 2216861a
No related branches found
No related tags found
No related merge requests found
...@@ -125,6 +125,18 @@ class Criterion(models.Model): ...@@ -125,6 +125,18 @@ class Criterion(models.Model):
def __str__(self): def __str__(self):
return self.name return self.name
def get_active_sum(self):
num_active = 0
sum = 0
for rating_obj in CriterionRating.objects.filter(criterion=self):
if rating_obj.rating != -1:
num_active += 1
sum += rating_obj.rating
return num_active, sum
class CallToMove(models.Model): class CallToMove(models.Model):
"""Defines text and image that are used to show a call to move between questions""" """Defines text and image that are used to show a call to move between questions"""
......
...@@ -81,22 +81,26 @@ class SingleSportSerializer(serializers.BaseSerializer): ...@@ -81,22 +81,26 @@ class SingleSportSerializer(serializers.BaseSerializer):
def to_internal_value(self, request): def to_internal_value(self, request):
""" """
The Data in the Request is taken and written to another Dictionary. The Data in the Request is taken and written to another Dictionary.
During this process, the Data is Validated on: During this process, the Data is Validated on whether the Rating Value and Criterion ID are valid.
- whether Name and URL for Sport exist If the Request is PATCHing or PUTting an existing Sport, not every field must be existant.
- whether the Rating Value and Criterion ID are valid So, the existance is explicitly checked.
""" """
data = {"valid_request": True} sport_dictionary = {}
for field_value in ["name", "url"]: # If The Sport is Being Patched, Name or URL may not be changed.
try: # That means that those Fields might not be sent in the Request,
data[field_value] = request.data[field_value] # leading to needing to check whether they exist.
except: if "name" in request.data.keys():
data["valid_request"] = False sport_dictionary["name"] = request.data["name"]
return data
if "url" in request.data.keys():
sport_dictionary["url"] = request.data["url"]
data["criteria"] = [] # A Number of Criteria may be sent with the Sport
sport_dictionary["criteria"] = []
# For every Sent Criterion, the ID of the Criterion and the Rating Value is being tested for Validity
for criterion in request.data["criteria"]: for criterion in request.data["criteria"]:
value = criterion["value"] value = criterion["value"]
...@@ -104,9 +108,56 @@ class SingleSportSerializer(serializers.BaseSerializer): ...@@ -104,9 +108,56 @@ class SingleSportSerializer(serializers.BaseSerializer):
validate_rating(value) validate_rating(value)
crit = Criterion.objects.get(pk=criterion["id"]) crit = Criterion.objects.get(pk=criterion["id"])
except: except:
data["valid_request"] = False return None
return data
sport_dictionary["criteria"].append((crit, value))
return sport_dictionary
class IncompleteSportSerializer(serializers.BaseSerializer):
def to_representation(self, incomplete_sports):
incomplete_sport_list = []
for sport in incomplete_sports:
incomplete_sport = {
"id": sport.pk,
"name": sport.name,
"criteria": [],
}
for crit in sport.criteria_ratings.iterator():
if sport.get_rating(crit) != -1:
continue
incomplete_sport["criteria"].append(
{
"id": crit.pk,
"name": crit.name,
}
)
incomplete_sport_list.append(incomplete_sport)
return incomplete_sport_list
class CriteriaSerializer(serializers.BaseSerializer):
def to_representation(self, data):
criteria_list = []
for crit, active_sports, sum_of_weights in data:
criterion_dict = {}
criterion_dict["id"] = crit.pk
criterion_dict["name"] = crit.name
criterion_dict["number_of_sports_active"] = active_sports
criterion_dict["sum_of_weights"] = sum_of_weights
data["criteria"].append((crit, value)) criteria_list.append(criterion_dict)
return data return criteria_list
...@@ -16,6 +16,8 @@ from .serializers import ( ...@@ -16,6 +16,8 @@ from .serializers import (
CriterionListSerializer, CriterionListSerializer,
QuestionListSerializer, QuestionListSerializer,
SingleSportSerializer, SingleSportSerializer,
CriteriaSerializer,
IncompleteSportSerializer,
) )
from .models import Sport, Criterion, Question from .models import Sport, Criterion, Question
...@@ -86,7 +88,6 @@ class SmallSportListView(viewsets.ViewSet): ...@@ -86,7 +88,6 @@ class SmallSportListView(viewsets.ViewSet):
sports = Sport.objects.all() sports = Sport.objects.all()
sports = paginator.paginate_queryset(sports, request) sports = paginator.paginate_queryset(sports, request)
criteria = Criterion.objects.all()
is_filled_tuples = [] is_filled_tuples = []
for sport in sports: for sport in sports:
...@@ -103,7 +104,7 @@ class SmallSportListView(viewsets.ViewSet): ...@@ -103,7 +104,7 @@ class SmallSportListView(viewsets.ViewSet):
data_dict = SingleSportSerializer().to_internal_value(request) data_dict = SingleSportSerializer().to_internal_value(request)
# A Try at Error Catching # A Try at Error Catching
if not data_dict["valid_request"]: if data_dict == None:
return HttpResponse(status=400) return HttpResponse(status=400)
new_sport = Sport.objects.create_sport() new_sport = Sport.objects.create_sport()
...@@ -128,7 +129,9 @@ class SmallSportListView(viewsets.ViewSet): ...@@ -128,7 +129,9 @@ class SmallSportListView(viewsets.ViewSet):
sport = get_object_or_404(Sport, pk=pk) sport = get_object_or_404(Sport, pk=pk)
return Response(SingleSportSerializer(sport).data) response = SingleSportSerializer(sport)
return Response(response.data)
# PUT for api/admin/sport/<id>/ # PUT for api/admin/sport/<id>/
def update(self, request, pk=None): def update(self, request, pk=None):
...@@ -136,23 +139,107 @@ class SmallSportListView(viewsets.ViewSet): ...@@ -136,23 +139,107 @@ class SmallSportListView(viewsets.ViewSet):
TODO TODO
""" """
data_dict = SingleSportSerializer().to_internal_value(request) # Get Data from Serializer
request_data = SingleSportSerializer().to_internal_value(request)
if request_data == None:
# Something is Broke, so Refuse Changing Data
return HttpResponse(status=400)
# Get Sport from Data
sport = Sport.objects.get(pk=pk) sport = Sport.objects.get(pk=pk)
print(data_dict) # Apply New Data to Sport
sport.name = request_data["name"]
sport.url = request_data["url"]
# Overwrite Criterion Ratings
for criterion, value in request_data["criteria"]:
sport.rate(criterion, value)
return Response({"test": "Updating a Single Entry"}) # Re-Serialize changed Sport and Send it back
response = SingleSportSerializer(sport)
return Response(response.data)
# PATCH for api/admin/sport/<id>/
def partial_update(self, request, pk=None):
# Get Data from Serializer
request_data = SingleSportSerializer().to_internal_value(request)
if request_data == None:
# Something is Broke, so Refuse Changing Data
return HttpResponse(status=400)
# Get Sport from Data
sport = Sport.objects.get(pk=pk)
# Apply New Data to Sport, if it exists
if "name" in request_data.keys():
sport.name = request_data["name"]
if "url" in request_data.keys():
sport.url = request_data["url"]
# Overwrite Criterion Ratings
for criterion, value in request_data["criteria"]:
sport.rate(criterion, value)
# Re-Serialize changed Sport and Send it back
response = SingleSportSerializer(sport)
return Response(response.data)
# DELETE for api/admin/sport/<id>/ # DELETE for api/admin/sport/<id>/
def destroy(self, request, pk=None): def destroy(self, request, pk=None):
return Response({"test": "Removing a Single Entry"}) sport = get_object_or_404(Sport, pk=pk)
sport.delete()
# Dev Notes: return HttpResponse(status=404)
# - 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()) class IncompleteSportView(APIView):
# - 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 authentication_classes = []
# GET for api/admin/sport/incomplete
def get(self, request):
incomplete_sport_list = []
for sport in Sport.objects.iterator():
if not sport.is_filled():
incomplete_sport_list.append(sport)
response = IncompleteSportSerializer(incomplete_sport_list)
return Response(response.data)
class CriteriaView(APIView):
"""
View for the List of Criteria and their Metadata
TODO: More Documentation
"""
authentication_classes = []
# GET for api/admin/criteria
def get(self, request):
data = []
for crit in Criterion.objects.iterator():
active_sports, sum_of_weights = crit.get_active_sum()
data.append((crit, active_sports, sum_of_weights))
response = CriteriaSerializer(data)
return Response(response.data)
...@@ -27,4 +27,6 @@ router.register(r"small-sport-list", views.SmallSportListView, "small-sport-list ...@@ -27,4 +27,6 @@ router.register(r"small-sport-list", views.SmallSportListView, "small-sport-list
urlpatterns = [ urlpatterns = [
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path("api/admin/", include(router.urls)), path("api/admin/", include(router.urls)),
path("api/admin/sport/incomplete/", views.IncompleteSportView.as_view()),
path("api/admin/criteria/", views.CriteriaView.as_view()),
] ]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment