# What this PR does Removes unnecessary team checks enforced by public API, as they seem to be outdated and not aligned with the web UI and docs. From public [docs](https://grafana.com/docs/oncall/latest/user-and-team-management/#manage-teams-in-grafana-oncall): > Resources from different teams can be connected with one another. For instance, you can create an integration in one team, set up multiple routes for the integration, and utilize escalation chains from other teams. Users, schedules, and outgoing webhooks from other teams can also be included in the escalation chain. ## Checklist - [x] Unit, integration, and e2e (if applicable) tests updated - [x] Documentation added (or `pr:no public docs` PR label added if not required) - [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not required)
75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
from apps.public_api.serializers.schedules_base import ScheduleBaseSerializer
|
|
from apps.schedules.models import CustomOnCallShift, OnCallScheduleWeb
|
|
from apps.schedules.tasks import (
|
|
drop_cached_ical_task,
|
|
schedule_notify_about_empty_shifts_in_schedule,
|
|
schedule_notify_about_gaps_in_schedule,
|
|
)
|
|
from common.api_helpers.custom_fields import TeamPrimaryKeyRelatedField, UsersFilteredByOrganizationField
|
|
from common.timezones import TimeZoneField
|
|
|
|
|
|
class ScheduleWebSerializer(ScheduleBaseSerializer):
|
|
team_id = TeamPrimaryKeyRelatedField(required=False, allow_null=True, source="team")
|
|
time_zone = TimeZoneField(required=True)
|
|
shifts = UsersFilteredByOrganizationField(
|
|
queryset=CustomOnCallShift.objects,
|
|
required=False,
|
|
source="custom_shifts",
|
|
)
|
|
|
|
class Meta:
|
|
model = OnCallScheduleWeb
|
|
fields = [
|
|
"id",
|
|
"team_id",
|
|
"name",
|
|
"time_zone",
|
|
"slack",
|
|
"on_call_now",
|
|
"shifts",
|
|
]
|
|
|
|
def to_internal_value(self, data):
|
|
if data.get("shifts", []) is None: # handle a None value
|
|
data["shifts"] = []
|
|
result = super().to_internal_value(data)
|
|
return result
|
|
|
|
|
|
class ScheduleWebUpdateSerializer(ScheduleWebSerializer):
|
|
time_zone = TimeZoneField(required=False)
|
|
|
|
class Meta:
|
|
model = OnCallScheduleWeb
|
|
fields = [
|
|
"id",
|
|
"team_id",
|
|
"name",
|
|
"time_zone",
|
|
"slack",
|
|
"on_call_now",
|
|
"shifts",
|
|
]
|
|
extra_kwargs = {
|
|
"name": {"required": False},
|
|
}
|
|
|
|
def update(self, instance, validated_data):
|
|
validated_data = self._correct_validated_data(validated_data)
|
|
new_time_zone = validated_data.get("time_zone", instance.time_zone)
|
|
new_shifts = validated_data.get("shifts", [])
|
|
existing_shifts = instance.custom_shifts.all()
|
|
|
|
ical_changed = False
|
|
|
|
if new_time_zone != instance.time_zone or set(existing_shifts) != set(new_shifts):
|
|
ical_changed = True
|
|
|
|
if ical_changed:
|
|
drop_cached_ical_task.apply_async(
|
|
(instance.pk,),
|
|
)
|
|
schedule_notify_about_empty_shifts_in_schedule.apply_async((instance.pk,))
|
|
schedule_notify_about_gaps_in_schedule.apply_async((instance.pk,))
|
|
return super().update(instance, validated_data)
|