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

1from rest_framework import serializers 

2from rest_framework.reverse import reverse 

3 

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 

19 

20 

21class EventSerializer(CleanedModelSerializer): 

22 """Serializer for events.""" 

23 

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 ) 

58 

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) 

71 

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 

89 

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) 

99 

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}" 

105 

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 

110 

111 def _user_permissions(self, instance): 

112 member = self.context["request"].member 

113 return services.event_permissions(member, instance, registration_prefetch=True) 

114 

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 ) 

127 

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 ) 

132 

133 

134class EventListSerializer(EventSerializer): 

135 organisers = MemberGroupShortSerializer(many=True)