diff options
| -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) | 
