Update upcoming shift endpoint to return a list (#1784)

This commit is contained in:
Matias Bordese 2023-04-18 13:42:04 -03:00 committed by GitHub
parent 4149c266bb
commit 6cff9729d8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 31 deletions

View file

@ -1716,19 +1716,20 @@ def test_upcoming_shifts_oncall(
response = client.get(url, format="json", **make_user_auth_headers(admin, token))
assert response.status_code == status.HTTP_200_OK
returned_data = response.data
assert returned_data[schedule.public_primary_key]["schedule"] == schedule.name
assert returned_data[schedule.public_primary_key]["is_oncall"]
assert returned_data[schedule.public_primary_key]["current_shift"]["start"] == on_call_shift.start
returned_data = response.data[0]
assert returned_data["schedule_id"] == schedule.public_primary_key
assert returned_data["schedule_name"] == schedule.name
assert returned_data["is_oncall"]
assert returned_data["current_shift"]["start"] == on_call_shift.start
next_shift_start = on_call_shift.start + timezone.timedelta(days=1)
assert returned_data[schedule.public_primary_key]["next_shift"]["start"] == next_shift_start
assert returned_data["next_shift"]["start"] == next_shift_start
# empty response for other user
url = reverse("api-internal:user-upcoming-shifts", kwargs={"pk": other_user.public_primary_key})
response = client.get(url, format="json", **make_user_auth_headers(admin, token))
assert response.status_code == status.HTTP_200_OK
assert response.data == {}
assert response.data == []
@pytest.mark.django_db
@ -1768,11 +1769,12 @@ def test_upcoming_shifts_override(
response = client.get(url, format="json", **make_user_auth_headers(admin, token))
assert response.status_code == status.HTTP_200_OK
returned_data = response.data
assert returned_data[schedule.public_primary_key]["schedule"] == schedule.name
assert returned_data[schedule.public_primary_key]["is_oncall"] is False
assert returned_data[schedule.public_primary_key]["current_shift"] is None
assert returned_data[schedule.public_primary_key]["next_shift"]["start"] == override.start
returned_data = response.data[0]
assert returned_data["schedule_id"] == schedule.public_primary_key
assert returned_data["schedule_name"] == schedule.name
assert returned_data["is_oncall"] is False
assert returned_data["current_shift"] is None
assert returned_data["next_shift"]["start"] == override.start
@pytest.mark.django_db
@ -1789,7 +1791,8 @@ def test_upcoming_shifts_multiple_schedules(
_, token = make_token_for_organization(organization)
schedules = []
for i in range(3):
# create schedules in a reversed order to check the output is sorted later
for i in range(2, -1, -1):
schedule = make_schedule(
organization,
schedule_class=OnCallScheduleWeb,
@ -1822,16 +1825,14 @@ def test_upcoming_shifts_multiple_schedules(
assert response.status_code == status.HTTP_200_OK
returned_data = response.data
for i, schedule in enumerate(schedules):
assert returned_data[schedule.public_primary_key]["schedule"] == schedule.name
for i, schedule in enumerate(reversed(schedules)):
assert returned_data[i]["schedule_name"] == schedule.name
expected_start = today + timezone.timedelta(hours=start_h) + timezone.timedelta(days=i)
if i == 0:
assert returned_data[schedule.public_primary_key]["is_oncall"]
assert returned_data[schedule.public_primary_key]["current_shift"]["start"] == expected_start
assert returned_data[schedule.public_primary_key]["next_shift"][
"start"
] == expected_start + timezone.timedelta(days=1)
assert returned_data[i]["is_oncall"]
assert returned_data[i]["current_shift"]["start"] == expected_start
assert returned_data[i]["next_shift"]["start"] == expected_start + timezone.timedelta(days=1)
else:
assert returned_data[schedule.public_primary_key]["is_oncall"] is False
assert returned_data[schedule.public_primary_key]["current_shift"] is None
assert returned_data[schedule.public_primary_key]["next_shift"]["start"] == expected_start
assert returned_data[i]["is_oncall"] is False
assert returned_data[i]["current_shift"] is None
assert returned_data[i]["next_shift"]["start"] == expected_start

View file

@ -475,16 +475,26 @@ class UserView(
schedules = OnCallSchedule.objects.related_to_user(user)
# check upcoming shifts
upcoming = {}
upcoming = []
for schedule in schedules:
current_shift, upcoming_shift = schedule.upcoming_shift_for_user(user, days=days)
if current_shift or upcoming_shift:
upcoming[schedule.public_primary_key] = {
"schedule": schedule.name,
"is_oncall": current_shift is not None,
"current_shift": current_shift,
"next_shift": upcoming_shift,
}
upcoming.append(
{
"schedule_id": schedule.public_primary_key,
"schedule_name": schedule.name,
"is_oncall": current_shift is not None,
"current_shift": current_shift,
"next_shift": upcoming_shift,
}
)
# sort entries by start timestamp
def sorting_key(entry):
shift = entry["current_shift"] if entry["current_shift"] else entry["next_shift"]
return shift["start"]
upcoming.sort(key=sorting_key)
return Response(upcoming, status=status.HTTP_200_OK)

View file

@ -1203,7 +1203,7 @@ def test_user_related_schedules(
make_schedule(organization, schedule_class=OnCallScheduleWeb)
schedules = OnCallSchedule.objects.related_to_user(admin)
assert list(schedules) == [schedule1, schedule2]
assert set(schedules) == {schedule1, schedule2}
@pytest.mark.django_db
@ -1268,7 +1268,7 @@ def test_user_related_schedules_only_username(
schedule3.refresh_ical_file()
schedules = OnCallSchedule.objects.related_to_user(user)
assert list(schedules) == [schedule1, schedule2]
assert set(schedules) == {schedule1, schedule2}
@pytest.mark.django_db