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
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from datetime import date
3from django.contrib import admin
4from django.db.models import Max, Min
5from django.utils.translation import gettext_lazy as _
7from utils.snippets import datetime_to_lectureyear
10class LectureYearFilter(admin.SimpleListFilter):
11 """Filter the events on those started or ended in a lecture year."""
13 title = _("lecture year")
14 parameter_name = "lecture_year"
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"))
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"])
24 return [
25 (year, f"{year}-{year + 1}")
26 for year in range(year_end, year_start - 1, -1)
27 ]
28 return []
30 def queryset(self, request, queryset):
31 if not self.value():
32 return queryset
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)
38 return queryset.filter(start__gte=year_start, end__lte=year_end)