aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site
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
parentAdding migrations to alter nominations API (diff)
Reworking nomination viewset and model
Diffstat (limited to 'pydis_site')
-rw-r--r--pydis_site/apps/api/models/bot/nomination.py4
-rw-r--r--pydis_site/apps/api/viewsets/bot/nomination.py47
2 files changed, 47 insertions, 4 deletions
diff --git a/pydis_site/apps/api/models/bot/nomination.py b/pydis_site/apps/api/models/bot/nomination.py
index 9a9f31ff..227a40ec 100644
--- a/pydis_site/apps/api/models/bot/nomination.py
+++ b/pydis_site/apps/api/models/bot/nomination.py
@@ -11,7 +11,7 @@ class Nomination(ModelReprMixin, models.Model):
default=True,
help_text="Whether this nomination is still relevant."
)
- author = models.ForeignKey(
+ actor = models.ForeignKey(
User,
on_delete=models.CASCADE,
help_text="The staff member that nominated this user.",
@@ -20,7 +20,7 @@ class Nomination(ModelReprMixin, models.Model):
reason = models.TextField(
help_text="Why this user was nominated."
)
- user = models.OneToOneField(
+ user = models.ForeignKey(
User,
on_delete=models.CASCADE,
help_text="The nominated user.",
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)