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
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from django.db.models import Count, Prefetch, Q
3from rest_framework.generics import ListAPIView
4from rest_framework.permissions import IsAdminUser, IsAuthenticatedOrReadOnly
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
18class CalendarJSEventListView(ListAPIView):
19 """Define a custom route that outputs the correctly formatted events information for CalendarJS, published events only."""
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 )
30 def get_serializer_context(self):
31 context = super().get_serializer_context()
32 context["member"] = self.request.member
33 return context
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
57class CalendarJSUnpublishedEventListView(ListAPIView):
58 """Define a custom route that outputs the correctly formatted external events information for CalendarJS, unpublished events only."""
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 )
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
82 def get_serializer_context(self):
83 context = super().get_serializer_context()
84 context["member"] = self.request.member
85 return context
88class CalendarJSExternalEventListView(ListAPIView):
89 """Define a custom route that outputs the correctly formatted events information for CalendarJS, published events only."""
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 )