Coverage for website/events/api/v2/filters.py: 80.56%

28 statements  

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

1from rest_framework import filters 

2 

3from utils.snippets import extract_date_range 

4 

5 

6class EventDateFilter(filters.BaseFilterBackend): 

7 """Allows you to filter by event start/end dates.""" 

8 

9 def filter_queryset(self, request, queryset, view): 

10 start, end = extract_date_range(request, allow_empty=True) 

11 

12 if start is not None: 

13 queryset = queryset.filter(end__gte=start) 

14 if end is not None: 

15 queryset = queryset.filter(start__lte=end) 

16 

17 return queryset 

18 

19 def get_schema_operation_parameters(self, view): 

20 return [ 

21 { 

22 "name": "start", 

23 "required": False, 

24 "in": "query", 

25 "description": "Filter events by ISO date, starting with this parameter (i.e. 2021-03-30T04:20:00) where `event.end >= value`", 

26 "schema": { 

27 "type": "string", 

28 }, 

29 }, 

30 { 

31 "name": "end", 

32 "required": False, 

33 "in": "query", 

34 "description": "Filter events by ISO date, ending with this parameter (i.e. 2021-05-16T13:37:00) where `event.start <= value`", 

35 "schema": { 

36 "type": "string", 

37 }, 

38 }, 

39 ] 

40 

41 

42class CategoryFilter(filters.BaseFilterBackend): 

43 """Allows you to filter by category.""" 

44 

45 def filter_queryset(self, request, queryset, view): 

46 category = request.query_params.get("category", None) 

47 

48 if category: 48 ↛ 49line 48 didn't jump to line 49 because the condition on line 48 was never true

49 queryset = queryset.filter(category__in=category.split(",")) 

50 

51 return queryset 

52 

53 def get_schema_operation_parameters(self, view): 

54 return [ 

55 { 

56 "name": "category", 

57 "required": False, 

58 "in": "query", 

59 "description": "Filter by category, accepts a comma separated list", 

60 "schema": { 

61 "type": "string", 

62 }, 

63 } 

64 ] 

65 

66 

67class OrganiserFilter(filters.BaseFilterBackend): 

68 """Allows you to filter by organiser id.""" 

69 

70 def filter_queryset(self, request, queryset, view): 

71 organiser = request.query_params.get("organiser", None) 

72 

73 if organiser: 73 ↛ 74line 73 didn't jump to line 74 because the condition on line 73 was never true

74 queryset = queryset.filter(organisers__in=[organiser]) 

75 

76 return queryset 

77 

78 def get_schema_operation_parameters(self, view): 

79 return [ 

80 { 

81 "name": "organiser", 

82 "required": False, 

83 "in": "query", 

84 "description": "Filter by organiser id", 

85 "schema": { 

86 "type": "number", 

87 }, 

88 } 

89 ]