Skip to content
Snippets Groups Projects

Refactor playout endpoint

Merged Chris Pastl requested to merge refactor-playout-endpoint-210 into main
1 unresolved thread
2 files
+ 54
48
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 51
45
@@ -171,68 +171,74 @@ def json_day_schedule(request, year=None, month=None, day=None):
@@ -171,68 +171,74 @@ def json_day_schedule(request, year=None, month=None, day=None):
)
)
def json_playout(request):
class APIPlayoutViewSet(
"""
mixins.ListModelMixin,
Return a JSON representation of the scheduled playout.
viewsets.GenericViewSet,
 
):
 
queryset = TimeSlot.objects.all()
Expects GET parameters `start` (date), `end` (date), and `includeVirtual` (boolean).
def list(self, request, *args, **kwargs):
 
"""
 
Return a JSON representation of the scheduled playout.
- `start` is today by default.
Expects GET parameters `start` (date), `end` (date), and `includeVirtual` (boolean).
- `end` is one week after the start date by default.
- `includeVirtual` is false by default.
The schedule will include virtual timeslots to fill unscheduled gaps if requested.
- `start` is today by default.
 
- `end` is one week after the start date by default.
 
- `includeVirtual` is false by default.
Called by
The schedule will include virtual timeslots to fill unscheduled gaps if requested.
- engine (playout) to retrieve timeslots within a given timerange
- internal calendar to retrieve all timeslots for a week
"""
# datetime.now and datetime.combine return timezone naive datetime objects
Called by
if request.GET.get("start") is None:
- engine (playout) to retrieve timeslots within a given timerange
schedule_start = timezone.make_aware(datetime.combine(datetime.now(), time(0, 0)))
- internal calendar to retrieve all timeslots for a week
else:
"""
schedule_start = timezone.make_aware(
datetime.combine(parse_date(request.GET.get("start")), time(0, 0))
)
if request.GET.get("end") is None:
# datetime.now and datetime.combine return timezone naive datetime objects
schedule_end = schedule_start + timedelta(days=7)
if request.GET.get("start") is None:
else:
schedule_start = timezone.make_aware(datetime.combine(datetime.now(), time(0, 0)))
schedule_end = timezone.make_aware(
else:
datetime.combine(parse_date(request.GET.get("end")) + timedelta(days=1), time(0, 0))
schedule_start = timezone.make_aware(
)
datetime.combine(parse_date(request.GET.get("start")), time(0, 0))
 
)
include_virtual = request.GET.get("include_virtual") == "true"
if request.GET.get("end") is None:
 
schedule_end = schedule_start + timedelta(days=7)
 
else:
 
schedule_end = timezone.make_aware(
 
datetime.combine(parse_date(request.GET.get("end")) + timedelta(days=1), time(0, 0))
 
)
timeslots = get_timerange_timeslots(schedule_start, schedule_end).select_related("schedule")
include_virtual = request.GET.get("include_virtual") == "true"
schedule = []
timeslots = get_timerange_timeslots(schedule_start, schedule_end).select_related("schedule")
first_timeslot = timeslots.first()
schedule = []
if include_virtual and first_timeslot.start > schedule_start:
first_timeslot = timeslots.first()
schedule.append(gap_entry(gap_start=schedule_start, gap_end=first_timeslot.start))
for current, upcoming in pairwise(timeslots):
if include_virtual and first_timeslot.start > schedule_start:
schedule.append(timeslot_entry(timeslot=current))
schedule.append(gap_entry(gap_start=schedule_start, gap_end=first_timeslot.start))
if include_virtual and current.end != upcoming.start:
for current, upcoming in pairwise(timeslots):
schedule.append(gap_entry(gap_start=current.end, gap_end=upcoming.start))
schedule.append(timeslot_entry(timeslot=current))
last_timeslot = timeslots.last()
if include_virtual and current.end != upcoming.start:
 
schedule.append(gap_entry(gap_start=current.end, gap_end=upcoming.start))
# we need to append the last timeslot to the schedule to complete it
last_timeslot = timeslots.last()
if last_timeslot:
schedule.append(timeslot_entry(timeslot=last_timeslot))
if include_virtual and last_timeslot.end < schedule_end:
# we need to append the last timeslot to the schedule to complete it
schedule.append(gap_entry(gap_start=last_timeslot.end, gap_end=schedule_end))
if last_timeslot:
 
schedule.append(timeslot_entry(timeslot=last_timeslot))
return HttpResponse(
if include_virtual and last_timeslot.end < schedule_end:
json.dumps(schedule, ensure_ascii=False).encode("utf8"),
schedule.append(gap_entry(gap_start=last_timeslot.end, gap_end=schedule_end))
content_type="application/json; charset=utf-8",
)
return HttpResponse(
 
json.dumps(schedule, ensure_ascii=False).encode("utf8"),
 
content_type="application/json; charset=utf-8",
 
)
@extend_schema_view(
@extend_schema_view(
Loading