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