filter out invalid schedule items

This commit is contained in:
Kyle Robbertze 2021-09-21 11:36:49 +02:00
parent fc02f8cafb
commit 6caa29e0c9
4 changed files with 44 additions and 23 deletions

View File

@ -68,6 +68,14 @@ class Schedule(models.Model):
return self.instance.ends
return self.ends
@property
def is_valid(self):
"""
A schedule item is valid if it starts before the end of the show instance
it is in
"""
return self.starts < self.instance.ends
class Meta:
managed = False
db_table = "cc_schedule"

View File

@ -5,40 +5,52 @@ from libretimeapi.models import Schedule, ShowInstance
class TestSchedule(SimpleTestCase):
def test_get_cueout(self):
show_instance = ShowInstance(
@classmethod
def setUpTestData(cls):
cls.show_instance = ShowInstance(
created=datetime(year=2021, month=10, day=1, hour=12),
starts=datetime(year=2021, month=10, day=2, hour=1),
ends=datetime(year=2021, month=10, day=2, hour=2),
)
cls.length = timedelta(minutes=10)
cls.cue_in = timedelta(seconds=1)
cls.cue_out = cls.length - timedelta(seconds=4)
length = timedelta(minutes=10)
cue_in = timedelta(seconds=1)
cue_out = length - timedelta(seconds=4)
def create_schedule(starts):
return Schedule(
starts=starts,
ends=starts + length,
cue_in=cue_in,
cue_out=cue_out,
instance=show_instance,
)
def create_schedule(self, starts):
return Schedule(
starts=starts,
ends=starts + self.length,
cue_in=self.cue_in,
cue_out=self.cue_out,
instance=self.show_instance,
)
def test_get_cueout(self):
# No overlapping schedule datetimes, normal usecase:
s1_starts = datetime(year=2021, month=10, day=2, hour=1, minute=30)
s1 = create_schedule(s1_starts)
self.assertEqual(s1.get_cueout(), cue_out)
self.assertEqual(s1.get_ends(), s1_starts + length)
s1 = self.create_schedule(s1_starts)
self.assertEqual(s1.get_cueout(), self.cue_out)
self.assertEqual(s1.get_ends(), s1_starts + self.length)
# Mixed overlapping schedule datetimes (only ends is overlapping):
s2_starts = datetime(year=2021, month=10, day=2, hour=1, minute=55)
s2 = create_schedule(s2_starts)
s2 = self.create_schedule(s2_starts)
self.assertEqual(s2.get_cueout(), timedelta(minutes=5))
self.assertEqual(s2.get_ends(), show_instance.ends)
self.assertEqual(s2.get_ends(), self.show_instance.ends)
# Fully overlapping schedule datetimes (starts and ends are overlapping):
s3_starts = datetime(year=2021, month=10, day=2, hour=2, minute=1)
s3 = create_schedule(s3_starts)
self.assertEqual(s3.get_cueout(), cue_out)
self.assertEqual(s3.get_ends(), show_instance.ends)
s3 = self.create_schedule(s3_starts)
self.assertEqual(s3.get_cueout(), self.cue_out)
self.assertEqual(s3.get_ends(), self.show_instance.ends)
def test_is_valid(self):
# Starts before the schedule ends
s1_starts = datetime(year=2021, month=10, day=2, hour=1, minute=30)
s1 = self.create_schedule(s1_starts)
self.assertTrue(s1.is_valid)
# Starts after the schedule ends
s2_starts = datetime(year=2021, month=10, day=2, hour=3)
s2 = self.create_schedule(s2_starts)
self.assertFalse(s2.is_valid)

View File

@ -141,7 +141,7 @@ class PreferenceViewSet(viewsets.ModelViewSet):
class ScheduleViewSet(viewsets.ModelViewSet):
queryset = Schedule.objects.all()
serializer_class = ScheduleSerializer
filter_fields = ("starts", "ends", "playout_status", "broadcasted")
filter_fields = ("starts", "ends", "playout_status", "broadcasted", "is_valid")
model_permission_name = "schedule"

View File

@ -54,6 +54,7 @@ class AirtimeApiClient:
data = self.services.schedule_url(
params={
"ends__range": ("{}Z,{}Z".format(str_current, str_end)),
"is_valid": True,
}
)
result = {"media": {}}