Coverage for website/activemembers/api/v2/filters.py: 27.78%

26 statements  

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

1from django.db.models import Q 

2 

3from rest_framework import filters 

4 

5from activemembers.models import Board, Committee, Society 

6from utils.snippets import extract_date_range 

7 

8 

9class MemberGroupTypeFilter(filters.BaseFilterBackend): 

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

11 

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

13 type = request.query_params.get("type", None) 

14 

15 if type == "board": 

16 queryset = queryset.filter(pk__in=Board.active_objects.values("pk")) 

17 elif type == "committee": 

18 queryset = queryset.filter(pk__in=Committee.active_objects.values("pk")) 

19 elif type == "society": 

20 queryset = queryset.filter(pk__in=Society.active_objects.values("pk")) 

21 

22 return queryset 

23 

24 def get_schema_operation_parameters(self, view): 

25 return [ 

26 { 

27 "name": "type", 

28 "required": False, 

29 "in": "query", 

30 "description": "Filter by member group type", 

31 "schema": {"type": "string", "enum": ["board", "committee", "society"]}, 

32 } 

33 ] 

34 

35 

36class MemberGroupDateFilter(filters.BaseFilterBackend): 

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

38 

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

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

41 

42 if start is not None: 

43 queryset = queryset.filter(Q(until__isnull=True) | Q(until__gte=start)) 

44 if end is not None: 

45 queryset = queryset.filter(Q(since__isnull=True) | Q(since__lte=end)) 

46 

47 return queryset 

48 

49 def get_schema_operation_parameters(self, view): 

50 return [ 

51 { 

52 "name": "start", 

53 "required": False, 

54 "in": "query", 

55 "description": "Filter member groups by ISO date, starting with this parameter (e.g. 2021-03-30T04:20:00) where `group.until >= value`", 

56 "schema": {"type": "string", "format": "date-time"}, 

57 }, 

58 { 

59 "name": "end", 

60 "required": False, 

61 "in": "query", 

62 "description": "Filter member groups by ISO date, ending with this parameter (e.g. 2021-05-16T13:37:00) where `group.since <= value`", 

63 "schema": {"type": "string", "format": "date-time"}, 

64 }, 

65 ]