from apps.api.serializers.schedule_base import ScheduleBaseSerializer from apps.schedules.models import OnCallScheduleWeb from apps.schedules.tasks import ( check_gaps_and_empty_shifts_in_schedule, schedule_notify_about_empty_shifts_in_schedule, schedule_notify_about_gaps_in_schedule, ) from apps.slack.models import SlackChannel, SlackUserGroup from common.api_helpers.custom_fields import OrganizationFilteredPrimaryKeyRelatedField, TimeZoneField class ScheduleWebSerializer(ScheduleBaseSerializer): time_zone = TimeZoneField(required=False) class Meta: model = OnCallScheduleWeb fields = [*ScheduleBaseSerializer.Meta.fields, "slack_channel", "time_zone"] def get_enable_web_overrides(self, obj): return True class ScheduleWebCreateSerializer(ScheduleWebSerializer): slack_channel_id = OrganizationFilteredPrimaryKeyRelatedField( filter_field="slack_team_identity__organizations", queryset=SlackChannel.objects, required=False, allow_null=True, write_only=True, ) user_group = OrganizationFilteredPrimaryKeyRelatedField( filter_field="slack_team_identity__organizations", queryset=SlackUserGroup.objects, required=False, allow_null=True, ) class Meta(ScheduleWebSerializer.Meta): fields = [*ScheduleBaseSerializer.Meta.fields, "slack_channel_id", "time_zone"] def update(self, instance, validated_data): updated_schedule = super().update(instance, validated_data) old_time_zone = instance.time_zone updated_time_zone = updated_schedule.time_zone if old_time_zone != updated_time_zone: updated_schedule.drop_cached_ical() check_gaps_and_empty_shifts_in_schedule.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 updated_schedule