correctly filter schedule items based on is_valid

Fixes: #1360
This commit is contained in:
Kyle Robbertze 2021-09-21 21:42:57 +02:00
parent 2ec76d7690
commit 8ca356303b
3 changed files with 67 additions and 12 deletions

View File

@ -1,10 +1,10 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.test import SimpleTestCase from django.test import TestCase
from libretimeapi.models import Schedule, ShowInstance from libretimeapi.models import Schedule, ShowInstance
class TestSchedule(SimpleTestCase): class TestSchedule(TestCase):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
cls.show_instance = ShowInstance( cls.show_instance = ShowInstance(

View File

@ -1,5 +1,5 @@
import os import os
from datetime import datetime, timedelta from datetime import datetime, timedelta, timezone
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
@ -66,13 +66,13 @@ class TestScheduleViewSet(APITestCase):
) )
show = baker.make( show = baker.make(
"libretimeapi.ShowInstance", "libretimeapi.ShowInstance",
starts=datetime.now(tz=datetime.timezone.utc) - timedelta(minutes=5), starts=datetime.now(tz=timezone.utc) - timedelta(minutes=5),
ends=datetime.now(tz=datetime.timezone.utc) + timedelta(minutes=5), ends=datetime.now(tz=timezone.utc) + timedelta(minutes=5),
) )
scheduleItem = baker.make( scheduleItem = baker.make(
"libretimeapi.Schedule", "libretimeapi.Schedule",
starts=datetime.now(tz=datetime.timezone.utc), starts=datetime.now(tz=timezone.utc),
ends=datetime.now(tz=datetime.timezone.utc) + f.length, ends=datetime.now(tz=timezone.utc) + f.length,
cue_out=f.cueout, cue_out=f.cueout,
instance=show, instance=show,
file=f, file=f,
@ -100,13 +100,13 @@ class TestScheduleViewSet(APITestCase):
) )
show = baker.make( show = baker.make(
"libretimeapi.ShowInstance", "libretimeapi.ShowInstance",
starts=datetime.now(tz=datetime.timezone.utc) - timedelta(minutes=5), starts=datetime.now(tz=timezone.utc) - timedelta(minutes=5),
ends=datetime.now(tz=datetime.timezone.utc) + timedelta(seconds=20), ends=datetime.now(tz=timezone.utc) + timedelta(seconds=20),
) )
scheduleItem = baker.make( scheduleItem = baker.make(
"libretimeapi.Schedule", "libretimeapi.Schedule",
starts=datetime.now(tz=datetime.timezone.utc), starts=datetime.now(tz=timezone.utc),
ends=datetime.now(tz=datetime.timezone.utc) + f.length, ends=datetime.now(tz=timezone.utc) + f.length,
instance=show, instance=show,
file=f, file=f,
) )
@ -120,3 +120,47 @@ class TestScheduleViewSet(APITestCase):
self.assertNotEqual( self.assertNotEqual(
dateparse.parse_datetime(result[0]["ends"]), scheduleItem.ends dateparse.parse_datetime(result[0]["ends"]), scheduleItem.ends
) )
def test_schedule_item_invalid(self):
music_dir = baker.make(
"libretimeapi.MusicDir",
directory=os.path.join(os.path.dirname(__file__), "resources"),
)
f = baker.make(
"libretimeapi.File",
directory=music_dir,
mime="audio/mp3",
filepath="song.mp3",
length=timedelta(seconds=40.86),
cuein=timedelta(seconds=0),
cueout=timedelta(seconds=40.8131),
)
show = baker.make(
"libretimeapi.ShowInstance",
starts=datetime.now(tz=timezone.utc) - timedelta(minutes=5),
ends=datetime.now(tz=timezone.utc) + timedelta(minutes=5),
)
scheduleItem = baker.make(
"libretimeapi.Schedule",
starts=datetime.now(tz=timezone.utc),
ends=datetime.now(tz=timezone.utc) + f.length,
cue_out=f.cueout,
instance=show,
file=f,
)
invalidScheduleItem = baker.make(
"libretimeapi.Schedule",
starts=show.ends + timedelta(minutes=1),
ends=show.ends + timedelta(minutes=1) + f.length,
cue_out=f.cueout,
instance=show,
file=f,
)
self.client.credentials(HTTP_AUTHORIZATION="Api-Key {}".format(self.token))
response = self.client.get(self.path, {"is_valid": True})
self.assertEqual(response.status_code, 200)
result = response.json()
# The invalid item should be filtered out and not returned
self.assertEqual(len(result), 1)
self.assertEqual(dateparse.parse_datetime(result[0]["ends"]), scheduleItem.ends)
self.assertEqual(dateparse.parse_duration(result[0]["cue_out"]), f.cueout)

View File

@ -1,6 +1,7 @@
import os import os
from django.conf import settings from django.conf import settings
from django.db.models import F
from django.http import FileResponse from django.http import FileResponse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from rest_framework import status, viewsets from rest_framework import status, viewsets
@ -141,9 +142,19 @@ class PreferenceViewSet(viewsets.ModelViewSet):
class ScheduleViewSet(viewsets.ModelViewSet): class ScheduleViewSet(viewsets.ModelViewSet):
queryset = Schedule.objects.all() queryset = Schedule.objects.all()
serializer_class = ScheduleSerializer serializer_class = ScheduleSerializer
filter_fields = ("starts", "ends", "playout_status", "broadcasted", "is_valid") filter_fields = ("starts", "ends", "playout_status", "broadcasted")
model_permission_name = "schedule" model_permission_name = "schedule"
def get_queryset(self):
filter_valid = self.request.query_params.get("is_valid")
if filter_valid is None:
return self.queryset.all()
filter_valid = filter_valid.strip().lower() in ["true", "yes", "1"]
if filter_valid:
return self.queryset.filter(starts__lt=F("instance__ends"))
else:
return self.queryset.filter(starts__gte=F("instance__ends"))
class ServiceRegisterViewSet(viewsets.ModelViewSet): class ServiceRegisterViewSet(viewsets.ModelViewSet):
queryset = ServiceRegister.objects.all() queryset = ServiceRegister.objects.all()