aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/api/viewsets
diff options
context:
space:
mode:
authorGravatar SebastiaanZ <[email protected]>2019-04-25 20:30:01 +0200
committerGravatar SebastiaanZ <[email protected]>2019-04-25 20:30:01 +0200
commit620d529081540a189dccc81e93363b9e2dba130b (patch)
treec79955f16917376fb4d4b69938dc05ecef012b9b /pydis_site/apps/api/viewsets
parentAdding migrations to alter nominations API (diff)
Reworking nomination viewset and model
Diffstat (limited to 'pydis_site/apps/api/viewsets')
-rw-r--r--pydis_site/apps/api/viewsets/bot/nomination.py47
1 files changed, 45 insertions, 2 deletions
diff --git a/pydis_site/apps/api/viewsets/bot/nomination.py b/pydis_site/apps/api/viewsets/bot/nomination.py
index 9d3246c2..fe16bfa8 100644
--- a/pydis_site/apps/api/viewsets/bot/nomination.py
+++ b/pydis_site/apps/api/viewsets/bot/nomination.py
@@ -1,4 +1,9 @@
+from django.utils import timezone
+from django_filters.rest_framework import DjangoFilterBackend
+from rest_framework import status
+from rest_framework.decorators import action
from rest_framework.exceptions import ValidationError
+from rest_framework.filters import OrderingFilter, SearchFilter
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
@@ -9,8 +14,22 @@ from pydis_site.apps.api.serializers import NominationSerializer
class NominationViewSet(ModelViewSet):
# TODO: doc me
serializer_class = NominationSerializer
- queryset = Nomination.objects.prefetch_related('author', 'user')
- frozen_fields = ('id', 'author', 'inserted_at', 'user')
+ queryset = Nomination.objects.prefetch_related('actor', 'user')
+ filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
+ filter_fields = ('user__id', 'actor__id', 'active')
+ frozen_fields = ('id', 'actor', 'inserted_at', 'user', 'unwatched_at', 'active')
+ frozen_on_create = ('unwatched_at', 'unnominate_reason')
+
+ def create(self, request, *args, **kwargs):
+ for field in request.data:
+ if field in self.frozen_on_create:
+ raise ValidationError({field: ['This field cannot be updated.']})
+
+ serializer = self.get_serializer(data=request.data)
+ serializer.is_valid(raise_exception=True)
+ self.perform_create(serializer)
+ headers = self.get_success_headers(serializer.data)
+ return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def update(self, request, *args, **kwargs):
for field in request.data:
@@ -23,3 +42,27 @@ class NominationViewSet(ModelViewSet):
serializer.save()
return Response(serializer.data)
+
+ @action(detail=True, methods=['patch'])
+ def end_nomination(self, request, pk=None):
+ for field in request.data:
+ if field in self.frozen_fields:
+ raise ValidationError({field: ['This field cannot be updated.']})
+
+ if "unnominate_reason" not in request.data:
+ raise ValidationError(
+ {'unnominate_reason': ['This field is required when ending a nomination']}
+ )
+
+ instance = self.get_object()
+ if not instance.active:
+ raise ValidationError({'active': ['A nomination must be active to be ended.']})
+
+ instance.active = False
+ instance.unwatched_at = timezone.now()
+ serializer = self.get_serializer(instance, data=request.data, partial=True)
+ serializer.is_valid(raise_exception=True)
+ serializer.save()
+ instance.save()
+
+ return Response(serializer.data)