Skip to content
Snippets Groups Projects
Commit 2fa205c8 authored by Konrad Mohrfeldt's avatar Konrad Mohrfeldt :koala:
Browse files

feat: add cut_at_range_boundaries flag for program endpoints

This flag allows clients to define what they expect as default behaviour
for setting the ProgramEntry start and end attributes.

If the flag is set steering ensures that ProgramEntry.start never starts
before the requested start and that ProgramEntry.end never ends after
the requested end.
parent 372e663e
No related branches found
No related tags found
1 merge request!57Incorporate feedback for virtual timeslots
...@@ -300,6 +300,13 @@ class ActiveFilterSet(StaticFilterHelpTextMixin, filters.FilterSet): ...@@ -300,6 +300,13 @@ class ActiveFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
class VirtualTimeslotFilterSet(filters.FilterSet): class VirtualTimeslotFilterSet(filters.FilterSet):
start = filters.IsoDateTimeFilter(method="filter_noop") start = filters.IsoDateTimeFilter(method="filter_noop")
end = filters.IsoDateTimeFilter(method="filter_noop") end = filters.IsoDateTimeFilter(method="filter_noop")
cut_at_range_boundaries = filters.BooleanFilter(
help_text=(
"If true guarantees that the first and last program entry match the requested range"
"even if these entries earlier or end later."
),
method="filter_noop",
)
include_virtual = filters.BooleanFilter( include_virtual = filters.BooleanFilter(
help_text="Include virtual timeslot entries (default: false).", help_text="Include virtual timeslot entries (default: false).",
method="filter_noop", method="filter_noop",
...@@ -320,6 +327,7 @@ class VirtualTimeslotFilterSet(filters.FilterSet): ...@@ -320,6 +327,7 @@ class VirtualTimeslotFilterSet(filters.FilterSet):
start=filter_data["start"], start=filter_data["start"],
end=filter_data["end"], end=filter_data["end"],
include_virtual=filter_data["include_virtual"], include_virtual=filter_data["include_virtual"],
cut_at_range_boundaries=filter_data["cut_at_range_boundaries"],
) )
) )
......
...@@ -717,26 +717,31 @@ def generate_program_entries( ...@@ -717,26 +717,31 @@ def generate_program_entries(
start: datetime | None, start: datetime | None,
end: datetime | None, end: datetime | None,
include_virtual: bool, include_virtual: bool,
cut_at_range_boundaries: bool,
) -> Iterator[ProgramEntry]: ) -> Iterator[ProgramEntry]:
"""Gets list of timerange entries between the given `timerange_start` and `timerange_end`. """Gets list of timerange entries between the given `timerange_start` and `timerange_end`.
Include virtual timerange entries if requested.""" Include virtual timerange entries if requested."""
def create_entry(start: datetime, end: datetime, show: Show, timeslot: TimeSlot | None = None): def create_entry(
starts_at: datetime, ends_at: datetime, show: Show, timeslot: TimeSlot | None = None
):
entry_id = f"{starts_at.isoformat()}...{ends_at.isoformat()}"
if cut_at_range_boundaries:
starts_at = max(starts_at, start)
ends_at = min(ends_at, end)
return ProgramEntry( return ProgramEntry(
id=f"{start.isoformat()}...{end.isoformat()}", id=entry_id,
start=start, start=starts_at,
end=end, end=ends_at,
timeslot=timeslot, timeslot=timeslot,
show=show, show=show,
) )
def create_timeslot_entry(timeslot: TimeSlot): def create_timeslot_entry(timeslot: TimeSlot):
return create_entry( return create_entry(
# Ensure the program entry never starts before the requested start timeslot.start,
# and never ends after the requested end. timeslot.end,
max(timeslot.start, start),
min(timeslot.end, end),
timeslot.schedule.show, timeslot.schedule.show,
timeslot, timeslot,
) )
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment