Coverage for website/events/api/calendarjs/views.py: 93.75%

44 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1from django.db.models import Count, Prefetch, Q 

2 

3from rest_framework.generics import ListAPIView 

4from rest_framework.permissions import IsAdminUser, IsAuthenticatedOrReadOnly 

5 

6from events.api.calendarjs.permissions import UnpublishedEventPermissions 

7from events.api.calendarjs.serializers import ( 

8 EventsCalenderJSSerializer, 

9 ExternalEventCalendarJSSerializer, 

10 UnpublishedEventsCalenderJSSerializer, 

11) 

12from events.api.v2 import filters 

13from events.models import Event, EventRegistration 

14from events.models.external_event import ExternalEvent 

15from utils.snippets import extract_date_range 

16 

17 

18class CalendarJSEventListView(ListAPIView): 

19 """Define a custom route that outputs the correctly formatted events information for CalendarJS, published events only.""" 

20 

21 serializer_class = EventsCalenderJSSerializer 

22 permission_classes = [IsAuthenticatedOrReadOnly] 

23 pagination_class = None 

24 filter_backends = ( 

25 filters.EventDateFilter, 

26 filters.CategoryFilter, 

27 filters.OrganiserFilter, 

28 ) 

29 

30 def get_serializer_context(self): 

31 context = super().get_serializer_context() 

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

33 return context 

34 

35 def get_queryset(self): 

36 start, end = extract_date_range(self.request) 

37 events = Event.objects.filter( 

38 end__gte=start, start__lte=end, published=True 

39 ).annotate( 

40 number_regs=Count( 

41 "eventregistration", filter=Q(eventregistration__date_cancelled=None) 

42 ) 

43 ) 

44 if self.request.member: 44 ↛ 54line 44 didn't jump to line 54 because the condition on line 44 was always true

45 events = events.prefetch_related( 

46 Prefetch( 

47 "eventregistration_set", 

48 to_attr="member_registration", 

49 queryset=EventRegistration.objects.filter( 

50 member=self.request.member 

51 ).select_properties("queue_position"), 

52 ) 

53 ).select_properties("participant_count") 

54 return events 

55 

56 

57class CalendarJSUnpublishedEventListView(ListAPIView): 

58 """Define a custom route that outputs the correctly formatted external events information for CalendarJS, unpublished events only.""" 

59 

60 serializer_class = UnpublishedEventsCalenderJSSerializer 

61 permission_classes = [IsAdminUser, UnpublishedEventPermissions] 

62 pagination_class = None 

63 filter_backends = ( 

64 filters.EventDateFilter, 

65 filters.CategoryFilter, 

66 filters.OrganiserFilter, 

67 ) 

68 

69 def get_queryset(self): 

70 queryset = Event.objects.filter(published=False) 

71 if not ( 71 ↛ 75line 71 didn't jump to line 75 because the condition on line 71 was never true

72 self.request.user.has_perm("events.override_organiser") 

73 or self.request.user.has_perm("events.view_unpublished") 

74 ): 

75 queryset = queryset.filter( 

76 organisers__in=list( 

77 self.request.member.get_member_groups().values_list("id", flat=True) 

78 ) 

79 ) 

80 return queryset 

81 

82 def get_serializer_context(self): 

83 context = super().get_serializer_context() 

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

85 return context 

86 

87 

88class CalendarJSExternalEventListView(ListAPIView): 

89 """Define a custom route that outputs the correctly formatted events information for CalendarJS, published events only.""" 

90 

91 queryset = ExternalEvent.objects.filter(published=True) 

92 serializer_class = ExternalEventCalendarJSSerializer 

93 permission_classes = [IsAuthenticatedOrReadOnly] 

94 pagination_class = None 

95 filter_backends = ( 

96 filters.EventDateFilter, 

97 filters.CategoryFilter, 

98 filters.OrganiserFilter, 

99 )