diff --git a/engine/apps/api/serializers/schedule_base.py b/engine/apps/api/serializers/schedule_base.py index b9e07a24..4cbd7641 100644 --- a/engine/apps/api/serializers/schedule_base.py +++ b/engine/apps/api/serializers/schedule_base.py @@ -3,6 +3,7 @@ from rest_framework import serializers from apps.api.serializers.user_group import UserGroupSerializer from apps.schedules.ical_utils import list_users_to_notify_from_ical +from apps.schedules.models import OnCallSchedule from apps.schedules.tasks import schedule_notify_about_empty_shifts_in_schedule, schedule_notify_about_gaps_in_schedule from common.api_helpers.custom_fields import TeamPrimaryKeyRelatedField from common.api_helpers.mixins import EagerLoadingMixin @@ -83,3 +84,14 @@ class ScheduleBaseSerializer(EagerLoadingMixin, serializers.ModelSerializer): created_schedule.check_gaps_for_next_week() schedule_notify_about_gaps_in_schedule.apply_async((created_schedule.pk,)) return created_schedule + + +class ScheduleFastSerializer(serializers.ModelSerializer): + id = serializers.CharField(read_only=True, source="public_primary_key") + + class Meta: + model = OnCallSchedule + fields = [ + "id", + "name", + ] diff --git a/engine/apps/api/views/schedule.py b/engine/apps/api/views/schedule.py index 9bc55546..d27676d4 100644 --- a/engine/apps/api/views/schedule.py +++ b/engine/apps/api/views/schedule.py @@ -17,6 +17,7 @@ from rest_framework.views import Response from rest_framework.viewsets import ModelViewSet from apps.api.permissions import MODIFY_ACTIONS, READ_ACTIONS, ActionPermission, AnyRole, IsAdmin, IsAdminOrEditor +from apps.api.serializers.schedule_base import ScheduleFastSerializer from apps.api.serializers.schedule_polymorphic import ( PolymorphicScheduleCreateSerializer, PolymorphicScheduleSerializer, @@ -31,10 +32,17 @@ from apps.slack.models import SlackChannel from apps.slack.tasks import update_slack_user_group_for_schedules from apps.user_management.organization_log_creator import OrganizationLogType, create_organization_log from common.api_helpers.exceptions import BadRequest, Conflict -from common.api_helpers.mixins import CreateSerializerMixin, PublicPrimaryKeyMixin, UpdateSerializerMixin +from common.api_helpers.mixins import ( + CreateSerializerMixin, + PublicPrimaryKeyMixin, + ShortSerializerMixin, + UpdateSerializerMixin, +) -class ScheduleView(PublicPrimaryKeyMixin, CreateSerializerMixin, UpdateSerializerMixin, ModelViewSet): +class ScheduleView( + PublicPrimaryKeyMixin, ShortSerializerMixin, CreateSerializerMixin, UpdateSerializerMixin, ModelViewSet +): authentication_classes = (PluginAuthentication,) permission_classes = (IsAuthenticated, ActionPermission) action_permissions = { @@ -56,6 +64,7 @@ class ScheduleView(PublicPrimaryKeyMixin, CreateSerializerMixin, UpdateSerialize serializer_class = PolymorphicScheduleSerializer create_serializer_class = PolymorphicScheduleCreateSerializer update_serializer_class = PolymorphicScheduleUpdateSerializer + short_serializer_class = ScheduleFastSerializer @cached_property def can_update_user_groups(self): @@ -80,19 +89,22 @@ class ScheduleView(PublicPrimaryKeyMixin, CreateSerializerMixin, UpdateSerialize return context def get_queryset(self): + is_short_request = self.request.query_params.get("short", "false") == "true" organization = self.request.auth.organization - slack_channels = SlackChannel.objects.filter( - slack_team_identity=organization.slack_team_identity, - slack_id=OuterRef("channel"), - ) queryset = OnCallSchedule.objects.filter( organization=organization, team=self.request.user.current_team, - ).annotate( - slack_channel_name=Subquery(slack_channels.values("name")[:1]), - slack_channel_pk=Subquery(slack_channels.values("public_primary_key")[:1]), ) - queryset = self.serializer_class.setup_eager_loading(queryset) + if not is_short_request: + slack_channels = SlackChannel.objects.filter( + slack_team_identity=organization.slack_team_identity, + slack_id=OuterRef("channel"), + ) + queryset = queryset.annotate( + slack_channel_name=Subquery(slack_channels.values("name")[:1]), + slack_channel_pk=Subquery(slack_channels.values("public_primary_key")[:1]), + ) + queryset = self.serializer_class.setup_eager_loading(queryset) return queryset def get_object(self): diff --git a/grafana-plugin/src/components/Policy/EscalationPolicy.tsx b/grafana-plugin/src/components/Policy/EscalationPolicy.tsx index f18aeb55..1d2b5ce1 100644 --- a/grafana-plugin/src/components/Policy/EscalationPolicy.tsx +++ b/grafana-plugin/src/components/Policy/EscalationPolicy.tsx @@ -11,6 +11,7 @@ import PluginLink from 'components/PluginLink/PluginLink'; import TimeRange from 'components/TimeRange/TimeRange'; import Timeline from 'components/Timeline/Timeline'; import GSelect from 'containers/GSelect/GSelect'; +import RemoteSelect from 'containers/RemoteSelect/RemoteSelect'; import UserTooltip from 'containers/UserTooltip/UserTooltip'; import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; import { ActionDTO } from 'models/action'; @@ -271,14 +272,15 @@ export class EscalationPolicy extends React.Component - );