Coverage for website/events/api/v2/serializers/event.py: 83.58%
57 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from rest_framework import serializers
2from rest_framework.reverse import reverse
4from activemembers.api.v2.serializers.member_group import (
5 MemberGroupSerializer,
6 MemberGroupShortSerializer,
7)
8from documents.api.v2.serializers.document import DocumentSerializer
9from events import services
10from events.api.v2.serializers.event_registration import EventRegistrationSerializer
11from events.models import Event
12from payments.api.v2.serializers.payment_amount import PaymentAmountSerializer
13from thaliawebsite.api.v2.serializers import CleanedHTMLSerializer
14from thaliawebsite.api.v2.serializers.cleaned_model_serializer import (
15 CleanedModelSerializer,
16)
17from utils.snippets import create_google_maps_url
20class EventSerializer(CleanedModelSerializer):
21 """Serializer for events."""
23 class Meta:
24 model = Event
25 fields = (
26 "pk",
27 "slug",
28 "url",
29 "title",
30 "description",
31 "caption",
32 "start",
33 "end",
34 "category",
35 "registration_start",
36 "registration_end",
37 "update_deadline",
38 "cancel_deadline",
39 "optional_registrations",
40 "location",
41 "price",
42 "fine",
43 "num_participants",
44 "max_participants",
45 "no_registration_message",
46 "registration_status",
47 "cancel_too_late_message",
48 "has_fields",
49 "food_event",
50 "maps_url",
51 "user_permissions",
52 "user_registration",
53 "organisers",
54 "documents",
55 )
57 description = CleanedHTMLSerializer()
58 organisers = MemberGroupSerializer(many=True)
59 user_registration = serializers.SerializerMethodField("_user_registration")
60 num_participants = serializers.SerializerMethodField("_num_participants")
61 maps_url = serializers.SerializerMethodField("_maps_url")
62 registration_status = serializers.SerializerMethodField("_registration_status")
63 price = PaymentAmountSerializer()
64 fine = PaymentAmountSerializer()
65 documents = DocumentSerializer(many=True)
66 user_permissions = serializers.SerializerMethodField("_user_permissions")
67 url = serializers.SerializerMethodField("_url")
69 def _user_registration(self, instance: Event):
70 if self.context["request"].member and len(instance.member_registration) > 0: 70 ↛ 71line 70 didn't jump to line 71 because the condition on line 70 was never true
71 registration = instance.member_registration[-1]
72 return EventRegistrationSerializer(
73 registration,
74 context=self.context,
75 fields=(
76 "pk",
77 "present",
78 "queue_position",
79 "is_cancelled",
80 "is_late_cancellation",
81 "date",
82 "payment",
83 ),
84 ).data
85 return None
87 def _registration_status(self, instance: Event):
88 if self.context["request"].member and len(instance.member_registration) > 0: 88 ↛ 89line 88 didn't jump to line 89 because the condition on line 88 was never true
89 registration = instance.member_registration[-1]
90 else:
91 registration = None
92 status = services.registration_status(
93 instance, registration, self.context["request"].member
94 )
95 cancel_status = services.cancel_status(instance, registration)
97 status_str = services.registration_status_string(status, instance, registration)
98 cancel_str = services.cancel_info_string(instance, cancel_status, status)
99 if services.show_cancel_status(status) and cancel_str != "": 99 ↛ 100line 99 didn't jump to line 100 because the condition on line 99 was never true
100 return f"{status_str} {cancel_str}"
101 return f"{status_str}"
103 def _num_participants(self, instance: Event):
104 if instance.max_participants: 104 ↛ 105line 104 didn't jump to line 105 because the condition on line 104 was never true
105 return min(instance.participant_count, instance.max_participants)
106 return instance.participant_count
108 def _user_permissions(self, instance):
109 member = self.context["request"].member
110 return services.event_permissions(member, instance, registration_prefetch=True)
112 def _url(self, instance: Event):
113 if instance.slug is None: 113 ↛ 119line 113 didn't jump to line 119 because the condition on line 113 was always true
114 return reverse(
115 "events:event",
116 kwargs={"pk": instance.pk},
117 request=self.context["request"],
118 )
119 return reverse(
120 "events:event",
121 kwargs={"slug": instance.slug},
122 request=self.context["request"],
123 )
125 def _maps_url(self, instance):
126 return self.context["request"].build_absolute_uri(
127 create_google_maps_url(instance.map_location, zoom=13, size="450x250")
128 )
131class EventListSerializer(EventSerializer):
132 organisers = MemberGroupShortSerializer(many=True)