From d2ff72bf507294d6ac0558d8f8326f822c2b2362 Mon Sep 17 00:00:00 2001 From: Ernesto Rico Schmidt <ernesto@helsinki.at> Date: Fri, 5 May 2023 11:30:20 -0400 Subject: [PATCH] Fix edge-cases where by_weekday_start may be None --- program/services.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/program/services.py b/program/services.py index e8744fab..480c4aef 100644 --- a/program/services.py +++ b/program/services.py @@ -45,7 +45,7 @@ class ScheduleData(TypedDict): end_time: str first_date: str id: int | None - is_repetition: bool + is_repetition: bool | None last_date: str | None rrule: int show: int | None @@ -97,11 +97,11 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s """ schedule = data["schedule"] - solutions = data.get("solutions", []) # only needed if conflicts exist + solutions = data.get("solutions", []) # only needed if conflicts exist new_schedule = instantiate_upcoming_schedule(schedule, show_pk, schedule_pk) - last_date_is_unknown = new_schedule.last_date is None # we need to keep track of this + last_date_is_unknown = new_schedule.last_date is None # we need to keep track of this # FIXME: refactor this to eliminate the duplication if last_date_is_unknown: @@ -369,7 +369,7 @@ def instantiate_upcoming_schedule( rrule = RRule.objects.get(pk=data["rrule"]) show = Show.objects.get(pk=show_pk) - is_repetition = data["is_repetition"] + is_repetition = data["is_repetition"] if "is_repetition" in data else False # default is `False` add_business_days_only = ( @@ -424,7 +424,11 @@ def make_conflicts(data: ScheduleData, schedule_pk: int | None, show_pk: int) -> if schedule_pk is not None: existing_schedule = Schedule.objects.get(pk=schedule_pk) - if new_schedule.last_date > existing_schedule.last_date: + if ( + new_schedule.last_date + and existing_schedule.last_date + and new_schedule.last_date > existing_schedule.last_date + ): last_timeslot = ( TimeSlot.objects.filter(schedule=existing_schedule).order_by("start").reverse()[0] ) @@ -453,11 +457,15 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]: and schedule.rrule.interval == 1 and schedule.rrule.by_weekdays is None ): # weekly: Use schedule.by_weekday for by_weekday - by_weekday_start = by_weekday_end = int(schedule.by_weekday) + by_weekday_start = by_weekday_end = ( + int(schedule.by_weekday) if schedule.by_weekday is not None else None + ) # adjust by_weekday_end if end_time is after midnight if schedule.end_time < schedule.start_time: - by_weekday_end = by_weekday_start + 1 if by_weekday_start < 6 else 0 + by_weekday_end = ( + by_weekday_start + 1 if by_weekday_start and by_weekday_start < 6 else 0 + ) elif ( schedule.rrule.freq == 2 and schedule.rrule.interval == 1 @@ -491,7 +499,9 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]: # adjust by_weekday_end if end_time is after midnight if schedule.end_time < schedule.start_time: - by_weekday_end = by_weekday_start + 1 if by_weekday_start < 6 else 0 + by_weekday_end = ( + by_weekday_start + 1 if by_weekday_start and by_weekday_start < 6 else 0 + ) # adjust last_date if end_time is after midnight if schedule.end_time < schedule.start_time: -- GitLab