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.instance.ends
return self.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: class Meta:
managed = False managed = False
db_table = "cc_schedule" db_table = "cc_schedule"

View File

@ -5,40 +5,52 @@ from libretimeapi.models import Schedule, ShowInstance
class TestSchedule(SimpleTestCase): class TestSchedule(SimpleTestCase):
def test_get_cueout(self): @classmethod
show_instance = ShowInstance( def setUpTestData(cls):
cls.show_instance = ShowInstance(
created=datetime(year=2021, month=10, day=1, hour=12), created=datetime(year=2021, month=10, day=1, hour=12),
starts=datetime(year=2021, month=10, day=2, hour=1), starts=datetime(year=2021, month=10, day=2, hour=1),
ends=datetime(year=2021, month=10, day=2, hour=2), 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) def create_schedule(self, starts):
cue_in = timedelta(seconds=1) return Schedule(
cue_out = length - timedelta(seconds=4) starts=starts,
ends=starts + self.length,
def create_schedule(starts): cue_in=self.cue_in,
return Schedule( cue_out=self.cue_out,
starts=starts, instance=self.show_instance,
ends=starts + length, )
cue_in=cue_in,
cue_out=cue_out,
instance=show_instance,
)
def test_get_cueout(self):
# No overlapping schedule datetimes, normal usecase: # No overlapping schedule datetimes, normal usecase:
s1_starts = datetime(year=2021, month=10, day=2, hour=1, minute=30) s1_starts = datetime(year=2021, month=10, day=2, hour=1, minute=30)
s1 = create_schedule(s1_starts) s1 = self.create_schedule(s1_starts)
self.assertEqual(s1.get_cueout(), cue_out) self.assertEqual(s1.get_cueout(), self.cue_out)
self.assertEqual(s1.get_ends(), s1_starts + length) self.assertEqual(s1.get_ends(), s1_starts + self.length)
# Mixed overlapping schedule datetimes (only ends is overlapping): # Mixed overlapping schedule datetimes (only ends is overlapping):
s2_starts = datetime(year=2021, month=10, day=2, hour=1, minute=55) 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_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): # Fully overlapping schedule datetimes (starts and ends are overlapping):
s3_starts = datetime(year=2021, month=10, day=2, hour=2, minute=1) s3_starts = datetime(year=2021, month=10, day=2, hour=2, minute=1)
s3 = create_schedule(s3_starts) s3 = self.create_schedule(s3_starts)
self.assertEqual(s3.get_cueout(), cue_out) self.assertEqual(s3.get_cueout(), self.cue_out)
self.assertEqual(s3.get_ends(), show_instance.ends) 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): 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") filter_fields = ("starts", "ends", "playout_status", "broadcasted", "is_valid")
model_permission_name = "schedule" model_permission_name = "schedule"

View File

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