From 5ebcb3949926547daabf0d5c0e403cd2368d2378 Mon Sep 17 00:00:00 2001 From: Julia Date: Tue, 12 Jul 2022 17:13:56 +0300 Subject: [PATCH] fix by_day value, fix getting next event date with respect to rotation end date --- engine/apps/api/serializers/on_call_shifts.py | 2 +- engine/apps/api/views/on_call_shifts.py | 4 ++-- .../schedules/models/custom_on_call_shift.py | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/engine/apps/api/serializers/on_call_shifts.py b/engine/apps/api/serializers/on_call_shifts.py index 8d789a73..4d3739e1 100644 --- a/engine/apps/api/serializers/on_call_shifts.py +++ b/engine/apps/api/serializers/on_call_shifts.py @@ -90,7 +90,7 @@ class OnCallShiftSerializer(EagerLoadingMixin, serializers.ModelSerializer): def validate_by_day(self, by_day): if by_day: for day in by_day: - if day not in CustomOnCallShift.ICAL_WEEKDAY_MAP.keys(): + if day not in CustomOnCallShift.WEB_WEEKDAY_MAP: raise serializers.ValidationError(["Invalid day value."]) return by_day diff --git a/engine/apps/api/views/on_call_shifts.py b/engine/apps/api/views/on_call_shifts.py index 2aa8c689..a12e5c0b 100644 --- a/engine/apps/api/views/on_call_shifts.py +++ b/engine/apps/api/views/on_call_shifts.py @@ -95,8 +95,8 @@ class OnCallShiftView(PublicPrimaryKeyMixin, UpdateSerializerMixin, ModelViewSet [ { "display_name": display_name, - "value": day_number, + "value": value, } - for day_number, display_name in CustomOnCallShift.WEEKDAY_CHOICES + for value, display_name in CustomOnCallShift.WEB_WEEKDAY_MAP.items() ] ) diff --git a/engine/apps/schedules/models/custom_on_call_shift.py b/engine/apps/schedules/models/custom_on_call_shift.py index 442f88a7..15c35da8 100644 --- a/engine/apps/schedules/models/custom_on_call_shift.py +++ b/engine/apps/schedules/models/custom_on_call_shift.py @@ -115,6 +115,16 @@ class CustomOnCallShift(models.Model): SATURDAY: "SA", SUNDAY: "SU", } + + WEB_WEEKDAY_MAP = { + "MO": "Monday", + "TU": "Tuesday", + "WE": "Wednesday", + "TH": "Thursday", + "FR": "Friday", + "SA": "Saturday", + "SU": "Sunday", + } ( SOURCE_WEB, SOURCE_API, @@ -240,6 +250,8 @@ class CustomOnCallShift(models.Model): users_queue = self.get_rolling_users() for counter, users in enumerate(users_queue, start=1): start = self.get_next_start_date(event_ical) + if not start: # means that rotation ends before next event starts + break for user_counter, user in enumerate(users, start=1): event_ical = self.generate_ical(user, start, user_counter, counter, time_zone) result += event_ical @@ -301,6 +313,10 @@ class CustomOnCallShift(models.Model): if days_for_next_event > DAYS_IN_A_MONTH: days_for_next_event = days_for_next_event % DAYS_IN_A_MONTH next_event_start = current_event_start + timezone.timedelta(days=days_for_next_event) + + # check if rotation ends before next event starts + if self.until and next_event_start > self.until: + return next_event = None # repetitions generate the next event shift according with the recurrence rules repetitions = UnfoldableCalendar(current_event).RepeatedEvent(