diff --git a/program/services.py b/program/services.py index fc323d4120aa6ad729d280cd760270d6b708cff8..e8744fabfdb755787c9796857ccc0ca976f515ed 100644 --- a/program/services.py +++ b/program/services.py @@ -100,6 +100,19 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s 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 + + # FIXME: refactor this to eliminate the duplication + if last_date_is_unknown: + if AUTO_SET_LAST_DATE_TO_END_OF_YEAR: + year = timezone.now().year + new_schedule.last_date = timezone.datetime(year, 12, 31).date() + else: + new_schedule.last_date = new_schedule.first_date + timedelta( + days=+AUTO_SET_LAST_DATE_TO_DAYS_IN_FUTURE + ) + show = new_schedule.show conflicts = make_conflicts(schedule, schedule_pk, show_pk) @@ -307,6 +320,9 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s # Database changes if no errors found + if last_date_is_unknown: + new_schedule.last_date = None + if to_create: new_schedule.save() @@ -344,7 +360,11 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s def instantiate_upcoming_schedule( data: ScheduleData, show_pk: int, pk: int | None = None ) -> Schedule: - """Returns an upcoming schedule instance for conflict resolution""" + """ + Returns an upcoming schedule instance for conflict resolution. + + If the data does not contain a last_date, the Schedule instance will not contain a last_date. + """ rrule = RRule.objects.get(pk=data["rrule"]) show = Show.objects.get(pk=show_pk) @@ -366,15 +386,7 @@ def instantiate_upcoming_schedule( end_time = parse_time(data["end_time"]) # last_date may not be present in data - if data.get("last_date") is not None: - last_date = parse_date(data["last_date"]) - else: - # If last_date was not set, set it to the end of the year or add x days - if AUTO_SET_LAST_DATE_TO_END_OF_YEAR: - year = timezone.now().year - last_date = timezone.datetime(year, 12, 31).date() - else: - last_date = first_date + timedelta(days=+AUTO_SET_LAST_DATE_TO_DAYS_IN_FUTURE) + last_date = parse_date(data["last_date"]) if data.get("last_date") is not None else None return Schedule( pk=pk, @@ -434,12 +446,6 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]: """ timeslots = [] - # adjust last_date if end_time is after midnight - if schedule.end_time < schedule.start_time: - last_date = schedule.first_date + timedelta(days=+1) - else: - last_date = schedule.first_date - if schedule.rrule.freq == 3: # daily: Ignore schedule.by_weekday to set by_weekday by_weekday_start = by_weekday_end = (0, 1, 2, 3, 4, 5, 6) elif ( @@ -487,6 +493,22 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]: if schedule.end_time < schedule.start_time: by_weekday_end = by_weekday_start + 1 if by_weekday_start < 6 else 0 + # adjust last_date if end_time is after midnight + if schedule.end_time < schedule.start_time: + last_date = schedule.first_date + timedelta(days=+1) + else: + last_date = schedule.first_date + + # FIXME: refactor this to eliminate the duplication + if schedule.last_date is None: + if AUTO_SET_LAST_DATE_TO_END_OF_YEAR: + year = timezone.now().year + until = timezone.datetime(year, 12, 31).date() + else: + until = schedule.first_date + timedelta(days=+AUTO_SET_LAST_DATE_TO_DAYS_IN_FUTURE) + else: + until = schedule.last_date + if schedule.rrule.freq == 0: # once: starts = [datetime.combine(schedule.first_date, schedule.start_time)] ends = [datetime.combine(last_date, schedule.end_time)] @@ -496,7 +518,7 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]: freq=schedule.rrule.freq, dtstart=datetime.combine(schedule.first_date, schedule.start_time), interval=schedule.rrule.interval, - until=schedule.last_date + relativedelta(days=+1), + until=until + relativedelta(days=+1), bysetpos=schedule.rrule.by_set_pos, byweekday=by_weekday_start, ) @@ -506,7 +528,7 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]: freq=schedule.rrule.freq, dtstart=datetime.combine(last_date, schedule.end_time), interval=schedule.rrule.interval, - until=schedule.last_date + relativedelta(days=+1), + until=until + relativedelta(days=+1), bysetpos=schedule.rrule.by_set_pos, byweekday=by_weekday_end, )