diff --git a/program/models.py b/program/models.py index 01c99d52d0a0528528baba9323a175ecea852c7d..25c5e4c53ff06d4f583e7715642843fab849058e 100644 --- a/program/models.py +++ b/program/models.py @@ -1062,24 +1062,8 @@ class TimeSlotManager(models.Manager): ) @staticmethod - def get_24h_timeslots(start): - end = timezone.make_aware(start + timedelta(hours=24)) - - return TimeSlot.objects.filter( - Q(start__lte=start, end__gte=start) | Q(start__gt=start, start__lt=end) - ).exclude(end=start) - - @staticmethod - def get_7d_timeslots(start): - start = datetime.combine(start, time(0, 0)) - end = timezone.make_aware(start + timedelta(days=7)) - - return TimeSlot.objects.filter( - Q(start__lte=start, end__gte=start) | Q(start__gt=start, start__lt=end) - ).exclude(end=start) - - @staticmethod - def get_timerange_timeslots(start, end): + def get_timerange_timeslots(start: datetime, end: datetime): + """get the timeslots in the timerange between start and end""" return TimeSlot.objects.filter( Q(start__lte=start, end__gte=start) | Q(start__gt=start, start__lt=end) ).exclude(end=start) diff --git a/program/views.py b/program/views.py index d442fb4075514ffd7c5c5e026ba3afac00334fe3..90630e82a95184bed828eff3a55a4f00ea43e0ea 100644 --- a/program/views.py +++ b/program/views.py @@ -20,7 +20,7 @@ import json import logging -from datetime import date, datetime, time +from datetime import date, datetime, time, timedelta from textwrap import dedent from drf_spectacular.utils import OpenApiResponse, extend_schema, extend_schema_view @@ -78,15 +78,21 @@ logger = logging.getLogger(__name__) def json_day_schedule(request, year=None, month=None, day=None): + # datetime.combine returns a timezone naive datetime object if year is None and month is None and day is None: - today = timezone.make_aware(datetime.combine(timezone.now(), time(0, 0))) + start = timezone.make_aware(datetime.combine(timezone.now(), time(0, 0))) else: - today = timezone.make_aware(datetime.combine(date(year, month, day), time(0, 0))) + start = timezone.make_aware(datetime.combine(date(year, month, day), time(0, 0))) + + end = start + timedelta(hours=24) timeslots = ( - TimeSlot.objects.get_24h_timeslots(today).select_related("schedule").select_related("show") + TimeSlot.objects.get_timerange_timeslots(start, end) + .select_related("schedule") + .select_related("show") ) schedule = [] + for ts in timeslots: entry = { "start": ts.start.strftime("%Y-%m-%d_%H:%M:%S"), @@ -115,6 +121,7 @@ def json_playout(request): If end not given, it returns all timeslots of the next 7 days """ + # datetime.combine returns a timezone naive datetime object if request.GET.get("start") is None: start = timezone.make_aware(datetime.combine(timezone.now(), time(0, 0))) else: @@ -123,24 +130,20 @@ def json_playout(request): ) if request.GET.get("end") is None: - # If no end was given, return the next week - timeslots = ( - TimeSlot.objects.get_7d_timeslots(start) - .select_related("schedule") - .select_related("show") - ) + end = start + timedelta(days=7) else: - # Otherwise return the given timerange end = timezone.make_aware( datetime.combine(parse_date(request.GET.get("end")), time(23, 59)) ) - timeslots = ( - TimeSlot.objects.get_timerange_timeslots(start, end) - .select_related("schedule") - .select_related("show") - ) + + timeslots = ( + TimeSlot.objects.get_timerange_timeslots(start, end) + .select_related("schedule") + .select_related("show") + ) schedule = [] + for ts in timeslots: is_repetition = " " + _("REP") if ts.schedule.is_repetition is True else ""