svthalia/concrexit

View on GitHub
website/events/api/v1/viewsets/event_registrations.py

Summary

Maintainability
A
0 mins
Test Coverage
from rest_framework.exceptions import NotFound, PermissionDenied
from rest_framework.mixins import RetrieveModelMixin, UpdateModelMixin
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet

from events import services
from events.api.v1.serializers import EventRegistrationSerializer
from events.exceptions import RegistrationError
from events.models import EventRegistration
from payments.exceptions import PaymentError


class EventRegistrationViewSet(RetrieveModelMixin, UpdateModelMixin, GenericViewSet):
    """Defines the viewset for registrations, requires an authenticated user.

    Has custom update and destroy methods that use the services.
    """

    queryset = EventRegistration.objects.all()
    serializer_class = EventRegistrationSerializer
    permission_classes = [IsAuthenticated]

    def get_serializer_context(self):
        context = super().get_serializer_context()
        context["request"] = self.request
        return context

    def get_object(self):
        instance = super().get_object()
        if (
            instance.name or instance.member.pk != self.request.member.pk
        ) and not services.is_organiser(self.request.member, instance.event):
            raise NotFound()

        return instance

    def perform_update(self, serializer):
        try:
            registration = serializer.instance

            member = self.request.member
            if (
                member
                and member.has_perm("events.change_eventregistration")
                and services.is_organiser(member, registration.event)
            ):
                services.update_registration_by_organiser(
                    registration, self.request.member, serializer.validated_data
                )

            services.update_registration(
                registration=registration,
                field_values=serializer.field_values(),
                actor=self.request.member,
            )
            serializer.information_fields = services.registration_fields(
                serializer.context["request"], registration=registration
            )
        except RegistrationError as e:
            raise PermissionDenied(detail=e) from e
        except PaymentError as e:
            raise PermissionDenied(detail=e) from e

    def destroy(self, request, pk=None, **kwargs):
        registration = self.get_object()
        try:
            services.cancel_registration(registration.member, registration.event)
            return Response(status=204)
        except RegistrationError as e:
            raise PermissionDenied(detail=e) from e