filter out invalid schedule items
This commit is contained in:
parent
fc02f8cafb
commit
6caa29e0c9
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
||||
|
|
|
@ -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": {}}
|
||||
|
|
Loading…
Reference in New Issue