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

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

18 

19 

20class EventSerializer(CleanedModelSerializer): 

21 """Serializer for events.""" 

22 

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 ) 

56 

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

68 

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 

86 

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) 

96 

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

102 

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 

107 

108 def _user_permissions(self, instance): 

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

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

111 

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 ) 

124 

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 ) 

129 

130 

131class EventListSerializer(EventSerializer): 

132 organisers = MemberGroupShortSerializer(many=True)