diff --git a/program/filters.py b/program/filters.py index d32554aaee756fa1afb3d4cf8189a36ecc5cdfa9..f4abfc6ee87ee8c43c0ca345e1cfbab08b5f8ee7 100644 --- a/program/filters.py +++ b/program/filters.py @@ -184,29 +184,30 @@ class TimeSlotFilterSet(filters.FilterSet): "If specified without a datetime value the current date and time is assumed." ), ) - # The start/end filters will always be applied even if no query parameter has been set. - # This is because we enforce a value in the clean_start and clean_end methods - # of the filterset form. - start = filters.DateFilter( - method="filter_start", - help_text=( - "Only returns timeslots after that start on or after the specified date. " - "By default, this is set to the current date." - ), + starts_before = filters.DateTimeFilter( + field_name="start", + lookup_expr="lt", + help_text="Only returns timeslots that start before the specified datetime.", ) - end = filters.DateFilter( - method="filter_end", - help_text=( - "Only returns timeslots that end on or before the specified date. " - "By default, this is set to value of the start filter + 60 days." - ), + starts_after = filters.DateTimeFilter( + field_name="start", + lookup_expr="gte", + help_text="Only returns timeslots that start at or after the specified datetime.", + ) + ends_before = filters.DateTimeFilter( + field_name="end", + lookup_expr="lt", + help_text="Only returns timeslots that end before the specified datetime.", + ) + ends_after = filters.DateTimeFilter( + field_name="end", + lookup_expr="gte", + help_text="Only returns timeslots that end at or after the specified datetime.", ) - schedule_ids = IntegerInFilter( field_name="schedule", help_text="Return only timeslots that belong to the specified schedule(s).", ) - show_ids = IntegerInFilter( field_name="schedule__show", help_text="Return only timeslots that belong to the specified show(s).", @@ -226,14 +227,6 @@ class TimeSlotFilterSet(filters.FilterSet): relevant_timeslot_ids = list(nearest_timeslots_in_future) + list(nearest_timeslots_in_past) return queryset.filter(id__in=relevant_timeslot_ids) - def filter_start(self, queryset: QuerySet, name: str, value: datetime.date): - start = timezone.make_aware(datetime.datetime.combine(value, datetime.time.min)) - return queryset.filter(start__gte=start) - - def filter_end(self, queryset: QuerySet, name: str, value: datetime.date): - end = timezone.make_aware(datetime.datetime.combine(value, datetime.time.max)) - return queryset.filter(end__lte=end) - def filter_queryset(self, queryset): queryset = super().filter_queryset(queryset) # This is for backwards compatibility as the surrounding-filter was formerly implemented @@ -242,26 +235,6 @@ class TimeSlotFilterSet(filters.FilterSet): queryset = self.filter_surrounding(queryset, "surrounding", timezone.now()) return queryset - def get_form_class(self): - form_cls = super().get_form_class() - - class TimeSlotFilterSetFormWithDefaults(form_cls): - def clean_start(self): - start = self.cleaned_data.get("start", None) - return start or timezone.now().date() - - def clean_end(self): - end = self.cleaned_data.get("end", None) - return end or self.cleaned_data["start"] + datetime.timedelta(days=60) - - # We only want defaults to apply in the context of the list action. - # When accessing individual timeslots we don’t want the queryset to be restricted - # to the default range of 60 days as get_object would yield a 404 otherwise. - if self.request.parser_context["view"].action == "list": - return TimeSlotFilterSetFormWithDefaults - else: - return form_cls - class Meta: model = models.TimeSlot fields = [