From cc2b4eeae2733d0cb08b30d96db700c0ca7b1134 Mon Sep 17 00:00:00 2001 From: Ildar Iskhakov Date: Wed, 22 Mar 2023 15:43:32 +0800 Subject: [PATCH] Fix resource duplication caused by available_teams_lookup_args (#1593) # What this PR does ## Which issue(s) this PR fixes ## Checklist - [ ] Tests updated - [ ] Documentation added - [ ] `CHANGELOG.md` updated --- engine/apps/api/views/alert_group.py | 2 +- engine/apps/api/views/alert_receive_channel.py | 2 +- engine/apps/api/views/alert_receive_channel_template.py | 2 +- engine/apps/api/views/channel_filter.py | 2 +- engine/apps/api/views/custom_button.py | 2 +- engine/apps/api/views/escalation_chain.py | 2 +- engine/apps/api/views/escalation_policy.py | 2 +- engine/apps/api/views/integration_heartbeat.py | 2 +- engine/apps/api/views/on_call_shifts.py | 2 +- engine/apps/api/views/resolution_note.py | 2 +- engine/apps/api/views/schedule.py | 4 ++-- engine/apps/api/views/webhooks.py | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/engine/apps/api/views/alert_group.py b/engine/apps/api/views/alert_group.py index c912d661..a0a290be 100644 --- a/engine/apps/api/views/alert_group.py +++ b/engine/apps/api/views/alert_group.py @@ -294,7 +294,7 @@ class AlertGroupView( ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() queryset = queryset.only("id") diff --git a/engine/apps/api/views/alert_receive_channel.py b/engine/apps/api/views/alert_receive_channel.py index af26278a..8675d95f 100644 --- a/engine/apps/api/views/alert_receive_channel.py +++ b/engine/apps/api/views/alert_receive_channel.py @@ -139,7 +139,7 @@ class AlertReceiveChannelView( queryset = self.serializer_class.setup_eager_loading(queryset) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() # Hide direct paging integrations from the list view, but not from the filters if not is_filters_request: diff --git a/engine/apps/api/views/alert_receive_channel_template.py b/engine/apps/api/views/alert_receive_channel_template.py index b9d31394..4c0d16d4 100644 --- a/engine/apps/api/views/alert_receive_channel_template.py +++ b/engine/apps/api/views/alert_receive_channel_template.py @@ -37,7 +37,7 @@ class AlertReceiveChannelTemplateView( organization=self.request.auth.organization, ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() return queryset diff --git a/engine/apps/api/views/channel_filter.py b/engine/apps/api/views/channel_filter.py index b8f18b48..adfe534f 100644 --- a/engine/apps/api/views/channel_filter.py +++ b/engine/apps/api/views/channel_filter.py @@ -70,7 +70,7 @@ class ChannelFilterView( slack_channel_pk=Subquery(slack_channels_subq.values("public_primary_key")[:1]), ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() queryset = self.serializer_class.setup_eager_loading(queryset) return queryset diff --git a/engine/apps/api/views/custom_button.py b/engine/apps/api/views/custom_button.py index b536a28f..9b8653d6 100644 --- a/engine/apps/api/views/custom_button.py +++ b/engine/apps/api/views/custom_button.py @@ -47,7 +47,7 @@ class CustomButtonView(TeamFilteringMixin, PublicPrimaryKeyMixin, ModelViewSet): organization=self.request.auth.organization, ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() return queryset diff --git a/engine/apps/api/views/escalation_chain.py b/engine/apps/api/views/escalation_chain.py index f8d21ce3..fab3c102 100644 --- a/engine/apps/api/views/escalation_chain.py +++ b/engine/apps/api/views/escalation_chain.py @@ -69,7 +69,7 @@ class EscalationChainViewSet( ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() if is_filters_request: # Do not annotate num_integrations and num_routes for filters request, diff --git a/engine/apps/api/views/escalation_policy.py b/engine/apps/api/views/escalation_policy.py index 81adf04d..c61fdaa4 100644 --- a/engine/apps/api/views/escalation_policy.py +++ b/engine/apps/api/views/escalation_policy.py @@ -74,7 +74,7 @@ class EscalationPolicyView( ).distinct() if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() queryset = self.serializer_class.setup_eager_loading(queryset) return queryset diff --git a/engine/apps/api/views/integration_heartbeat.py b/engine/apps/api/views/integration_heartbeat.py index 51dda44e..798fbe56 100644 --- a/engine/apps/api/views/integration_heartbeat.py +++ b/engine/apps/api/views/integration_heartbeat.py @@ -49,7 +49,7 @@ class IntegrationHeartBeatView( **lookup_kwargs, ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() queryset = self.serializer_class.setup_eager_loading(queryset) return queryset diff --git a/engine/apps/api/views/on_call_shifts.py b/engine/apps/api/views/on_call_shifts.py index a707bb42..b24482c1 100644 --- a/engine/apps/api/views/on_call_shifts.py +++ b/engine/apps/api/views/on_call_shifts.py @@ -56,7 +56,7 @@ class OnCallShiftView(TeamFilteringMixin, PublicPrimaryKeyMixin, UpdateSerialize ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() queryset = self.serializer_class.setup_eager_loading(queryset) return queryset.order_by("schedules") diff --git a/engine/apps/api/views/resolution_note.py b/engine/apps/api/views/resolution_note.py index f750bfb9..bd0b0ef1 100644 --- a/engine/apps/api/views/resolution_note.py +++ b/engine/apps/api/views/resolution_note.py @@ -40,7 +40,7 @@ class ResolutionNoteView(TeamFilteringMixin, PublicPrimaryKeyMixin, UpdateSerial ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() queryset = self.serializer_class.setup_eager_loading(queryset) return queryset diff --git a/engine/apps/api/views/schedule.py b/engine/apps/api/views/schedule.py index 77937e14..b66d28f5 100644 --- a/engine/apps/api/views/schedule.py +++ b/engine/apps/api/views/schedule.py @@ -171,7 +171,7 @@ class ScheduleView( "prev_ical_file_overrides", ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() if not is_short_request: queryset = self._annotate_queryset(queryset) queryset = self.serializer_class.setup_eager_loading(queryset) @@ -231,7 +231,7 @@ class ScheduleView( public_primary_key=pk, ) if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() queryset = self._annotate_queryset(queryset) try: diff --git a/engine/apps/api/views/webhooks.py b/engine/apps/api/views/webhooks.py index ad8a873f..1a013926 100644 --- a/engine/apps/api/views/webhooks.py +++ b/engine/apps/api/views/webhooks.py @@ -33,7 +33,7 @@ class WebhooksView(TeamFilteringMixin, PublicPrimaryKeyMixin, ModelViewSet): organization=self.request.auth.organization, ).prefetch_related("responses") if not ignore_filtering_by_available_teams: - queryset = queryset.filter(*self.available_teams_lookup_args) + queryset = queryset.filter(*self.available_teams_lookup_args).distinct() return queryset def get_object(self):