svthalia/concrexit

View on GitHub
website/events/api/v2/serializers/event.py

Summary

Maintainability
A
0 mins
Test Coverage
from rest_framework import serializers
from rest_framework.reverse import reverse

from activemembers.api.v2.serializers.member_group import (
    MemberGroupSerializer,
    MemberGroupShortSerializer,
)
from documents.api.v2.serializers.document import DocumentSerializer
from events import services
from events.api.v2.serializers.event_registration import EventRegistrationSerializer
from events.models import Event
from payments.api.v2.serializers.payment_amount import PaymentAmountSerializer
from thaliawebsite.api.v2.serializers import CleanedHTMLSerializer
from thaliawebsite.api.v2.serializers.cleaned_model_serializer import (
    CleanedModelSerializer,
)
from utils.snippets import create_google_maps_url


class EventSerializer(CleanedModelSerializer):
    """Serializer for events."""

    class Meta:
        model = Event
        fields = (
            "pk",
            "slug",
            "url",
            "title",
            "description",
            "caption",
            "start",
            "end",
            "category",
            "registration_start",
            "registration_end",
            "update_deadline",
            "cancel_deadline",
            "optional_registrations",
            "location",
            "price",
            "fine",
            "num_participants",
            "max_participants",
            "no_registration_message",
            "registration_status",
            "cancel_too_late_message",
            "has_fields",
            "food_event",
            "maps_url",
            "user_permissions",
            "user_registration",
            "organisers",
            "documents",
        )

    description = CleanedHTMLSerializer()
    organisers = MemberGroupSerializer(many=True)
    user_registration = serializers.SerializerMethodField("_user_registration")
    num_participants = serializers.SerializerMethodField("_num_participants")
    maps_url = serializers.SerializerMethodField("_maps_url")
    registration_status = serializers.SerializerMethodField("_registration_status")
    price = PaymentAmountSerializer()
    fine = PaymentAmountSerializer()
    documents = DocumentSerializer(many=True)
    user_permissions = serializers.SerializerMethodField("_user_permissions")
    url = serializers.SerializerMethodField("_url")

    def _user_registration(self, instance: Event):
        if self.context["request"].member and len(instance.member_registration) > 0:
            registration = instance.member_registration[-1]
            return EventRegistrationSerializer(
                registration,
                context=self.context,
                fields=(
                    "pk",
                    "present",
                    "queue_position",
                    "is_cancelled",
                    "is_late_cancellation",
                    "date",
                    "payment",
                ),
            ).data
        return None

    def _registration_status(self, instance: Event):
        if self.context["request"].member and len(instance.member_registration) > 0:
            registration = instance.member_registration[-1]
        else:
            registration = None
        status = services.registration_status(
            instance, registration, self.context["request"].member
        )
        cancel_status = services.cancel_status(instance, registration)

        status_str = services.registration_status_string(status, instance, registration)
        cancel_str = services.cancel_info_string(instance, cancel_status, status)
        if services.show_cancel_status(status) and cancel_str != "":
            return f"{status_str} {cancel_str}"
        return f"{status_str}"

    def _num_participants(self, instance: Event):
        if instance.max_participants:
            return min(instance.participant_count, instance.max_participants)
        return instance.participant_count

    def _user_permissions(self, instance):
        member = self.context["request"].member
        return services.event_permissions(member, instance, registration_prefetch=True)

    def _url(self, instance: Event):
        if instance.slug is None:
            return reverse(
                "events:event",
                kwargs={"pk": instance.pk},
                request=self.context["request"],
            )
        return reverse(
            "events:event",
            kwargs={"slug": instance.slug},
            request=self.context["request"],
        )

    def _maps_url(self, instance):
        return self.context["request"].build_absolute_uri(
            create_google_maps_url(instance.map_location, zoom=13, size="450x250")
        )


class EventListSerializer(EventSerializer):
    organisers = MemberGroupShortSerializer(many=True)