diff options
author | 2019-04-25 20:30:01 +0200 | |
---|---|---|
committer | 2019-04-25 20:30:01 +0200 | |
commit | 620d529081540a189dccc81e93363b9e2dba130b (patch) | |
tree | c79955f16917376fb4d4b69938dc05ecef012b9b /pydis_site | |
parent | Adding 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.py | 4 | ||||
-rw-r--r-- | pydis_site/apps/api/viewsets/bot/nomination.py | 47 |
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) |