Coverage for website/events/admin/filters.py: 37.04%

23 statements  

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

1from datetime import date 

2 

3from django.contrib import admin 

4from django.db.models import Max, Min 

5from django.utils.translation import gettext_lazy as _ 

6 

7from utils.snippets import datetime_to_lectureyear 

8 

9 

10class LectureYearFilter(admin.SimpleListFilter): 

11 """Filter the events on those started or ended in a lecture year.""" 

12 

13 title = _("lecture year") 

14 parameter_name = "lecture_year" 

15 

16 def lookups(self, request, model_admin): 

17 objects_end = model_admin.model.objects.aggregate(Max("end")) 

18 objects_start = model_admin.model.objects.aggregate(Min("start")) 

19 

20 if objects_end["end__max"] and objects_start["start__min"]: 

21 year_end = datetime_to_lectureyear(objects_end["end__max"]) 

22 year_start = datetime_to_lectureyear(objects_start["start__min"]) 

23 

24 return [ 

25 (year, f"{year}-{year + 1}") 

26 for year in range(year_end, year_start - 1, -1) 

27 ] 

28 return [] 

29 

30 def queryset(self, request, queryset): 

31 if not self.value(): 

32 return queryset 

33 

34 year = int(self.value()) 

35 year_start = date(year=year, month=9, day=1) 

36 year_end = date(year=year + 1, month=9, day=1) 

37 

38 return queryset.filter(start__gte=year_start, end__lte=year_end)