From 6f88f51117752fff031465f4872ea768981753df Mon Sep 17 00:00:00 2001 From: Cathy Teng Date: Thu, 20 Nov 2025 14:48:35 -0800 Subject: [PATCH 1/3] allow deleting disabled org integrations --- .../endpoints/organization_integration_details.py | 4 +--- .../test_organization_integration_details.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/sentry/integrations/api/endpoints/organization_integration_details.py b/src/sentry/integrations/api/endpoints/organization_integration_details.py index 5ad861a2e65ba2..9cf77f0afb1148 100644 --- a/src/sentry/integrations/api/endpoints/organization_integration_details.py +++ b/src/sentry/integrations/api/endpoints/organization_integration_details.py @@ -118,9 +118,7 @@ def delete( with transaction.atomic(using=router.db_for_write(OrganizationIntegration)): updated = False - for oi in OrganizationIntegration.objects.filter( - id=org_integration.id, status=ObjectStatus.ACTIVE - ): + for oi in OrganizationIntegration.objects.filter(id=org_integration.id): oi.update(status=ObjectStatus.PENDING_DELETION) updated = True diff --git a/tests/sentry/integrations/api/endpoints/test_organization_integration_details.py b/tests/sentry/integrations/api/endpoints/test_organization_integration_details.py index 6df344987fa559..882ebdc0f9b49d 100644 --- a/tests/sentry/integrations/api/endpoints/test_organization_integration_details.py +++ b/tests/sentry/integrations/api/endpoints/test_organization_integration_details.py @@ -3,6 +3,7 @@ import responses from sentry import audit_log +from sentry.constants import ObjectStatus from sentry.deletions.models.scheduleddeletion import ScheduledDeletion from sentry.integrations.base import IntegrationInstallation from sentry.integrations.models.integration import Integration @@ -106,6 +107,18 @@ def test_removal(self) -> None: model_name="OrganizationIntegration", object_id=org_integration.id ) + def test_delete_disabled_integration(self) -> None: + self.integration.update(status=ObjectStatus.DISABLED) + self.get_success_response(self.organization.slug, self.integration.id) + assert Integration.objects.filter(id=self.integration.id).exists() + + org_integration = OrganizationIntegration.objects.get( + integration=self.integration, organization_id=self.organization.id + ) + assert ScheduledDeletion.objects.filter( + model_name="OrganizationIntegration", object_id=org_integration.id + ) + @control_silo_test class IssueOrganizationIntegrationDetailsGetTest(APITestCase): From 1edcb873a5f8a139febbd00a69ec8cd6f0b0d302 Mon Sep 17 00:00:00 2001 From: Cathy Teng Date: Thu, 20 Nov 2025 14:51:09 -0800 Subject: [PATCH 2/3] query for active or disabled --- .../api/endpoints/organization_integration_details.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sentry/integrations/api/endpoints/organization_integration_details.py b/src/sentry/integrations/api/endpoints/organization_integration_details.py index 9cf77f0afb1148..1d31ccbf796b8f 100644 --- a/src/sentry/integrations/api/endpoints/organization_integration_details.py +++ b/src/sentry/integrations/api/endpoints/organization_integration_details.py @@ -118,7 +118,9 @@ def delete( with transaction.atomic(using=router.db_for_write(OrganizationIntegration)): updated = False - for oi in OrganizationIntegration.objects.filter(id=org_integration.id): + for oi in OrganizationIntegration.objects.filter( + id=org_integration.id, status__in=[ObjectStatus.ACTIVE, ObjectStatus.DISABLED] + ): oi.update(status=ObjectStatus.PENDING_DELETION) updated = True From 16476a3b43e22f5a6b58eefb500fa593891510ad Mon Sep 17 00:00:00 2001 From: Cathy Teng Date: Thu, 20 Nov 2025 14:52:22 -0800 Subject: [PATCH 3/3] fix test --- .../endpoints/test_organization_integration_details.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/sentry/integrations/api/endpoints/test_organization_integration_details.py b/tests/sentry/integrations/api/endpoints/test_organization_integration_details.py index 882ebdc0f9b49d..7b34292f6e4b1e 100644 --- a/tests/sentry/integrations/api/endpoints/test_organization_integration_details.py +++ b/tests/sentry/integrations/api/endpoints/test_organization_integration_details.py @@ -108,13 +108,14 @@ def test_removal(self) -> None: ) def test_delete_disabled_integration(self) -> None: - self.integration.update(status=ObjectStatus.DISABLED) - self.get_success_response(self.organization.slug, self.integration.id) - assert Integration.objects.filter(id=self.integration.id).exists() - org_integration = OrganizationIntegration.objects.get( integration=self.integration, organization_id=self.organization.id ) + org_integration.update(status=ObjectStatus.DISABLED) + self.get_success_response(self.organization.slug, self.integration.id) + assert Integration.objects.filter(id=self.integration.id).exists() + + org_integration.refresh_from_db() assert ScheduledDeletion.objects.filter( model_name="OrganizationIntegration", object_id=org_integration.id )