diff --git a/program/services.py b/program/services.py index 23497ed65fdfa6b9834ef7cb91c291c0820af385..86b9f0cd0434010c75b9281df0290856963b261c 100644 --- a/program/services.py +++ b/program/services.py @@ -720,13 +720,23 @@ def generate_program_entries( ) def create_timeslot_entry(timeslot: TimeSlot): - return create_entry(timeslot.start, timeslot.end, timeslot.schedule.show, timeslot) + return create_entry( + # Ensure the program entry never starts before the requested start + # and never ends after the requested end. + max(timeslot.start, start), + min(timeslot.end, end), + timeslot.schedule.show, + timeslot, + ) if start is None: start = timezone.now() if end is None: end = start + timedelta(days=1) - queryset = queryset.filter(start__gte=start, start__lt=end) + # Find all timeslots that + # * have started before the specified start value but end after it + # * or end after the specified end value but start before it + queryset = queryset.filter(end__gt=start, start__lt=end).order_by("start") if not include_virtual: yield from (create_timeslot_entry(timeslot) for timeslot in queryset) @@ -744,5 +754,5 @@ def generate_program_entries( yield create_entry(entry_start, timeslot.start, fallback_show) yield create_timeslot_entry(timeslot) entry_start = timeslot.end - if entry_start != end: + if entry_start < end: yield create_entry(entry_start, end, fallback_show)