From 9d5f6aed8a1c891f39ad7e1bbee192abab09091e Mon Sep 17 00:00:00 2001 From: Malachi Willey Date: Fri, 21 Nov 2025 16:14:36 -0800 Subject: [PATCH] fix(aci): Immediate deletion of workflow-detector connections --- .../organization_detector_workflow_details.py | 10 ++++++---- .../endpoints/organization_detector_workflow_index.py | 10 ++++++---- .../test_organization_detector_workflow_details.py | 11 ----------- .../test_organization_detector_workflow_index.py | 6 ------ 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/src/sentry/workflow_engine/endpoints/organization_detector_workflow_details.py b/src/sentry/workflow_engine/endpoints/organization_detector_workflow_details.py index 854c344271e4bf..d10d4d46b0012b 100644 --- a/src/sentry/workflow_engine/endpoints/organization_detector_workflow_details.py +++ b/src/sentry/workflow_engine/endpoints/organization_detector_workflow_details.py @@ -20,7 +20,6 @@ RESPONSE_UNAUTHORIZED, ) from sentry.apidocs.parameters import DetectorWorkflowParams, GlobalParams -from sentry.deletions.models.scheduleddeletion import RegionScheduledDeletion from sentry.models.organization import Organization from sentry.utils.audit import create_audit_entry from sentry.workflow_engine.endpoints.serializers.detector_workflow_serializer import ( @@ -101,13 +100,16 @@ def delete( if not can_edit_detector_workflow_connections(detector_workflow.detector, request): raise PermissionDenied - RegionScheduledDeletion.schedule(detector_workflow, days=0, actor=request.user) + detector_workflow_id = detector_workflow.id + audit_log_data = detector_workflow.get_audit_log_data() + + detector_workflow.delete() create_audit_entry( request=request, organization=organization, - target_object=detector_workflow.id, + target_object=detector_workflow_id, event=audit_log.get_event_id("DETECTOR_WORKFLOW_REMOVE"), - data=detector_workflow.get_audit_log_data(), + data=audit_log_data, ) return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/src/sentry/workflow_engine/endpoints/organization_detector_workflow_index.py b/src/sentry/workflow_engine/endpoints/organization_detector_workflow_index.py index 310fc890656f29..440f3847c4e11c 100644 --- a/src/sentry/workflow_engine/endpoints/organization_detector_workflow_index.py +++ b/src/sentry/workflow_engine/endpoints/organization_detector_workflow_index.py @@ -18,7 +18,6 @@ RESPONSE_UNAUTHORIZED, ) from sentry.apidocs.parameters import GlobalParams -from sentry.deletions.models.scheduleddeletion import RegionScheduledDeletion from sentry.utils.audit import create_audit_entry from sentry.workflow_engine.endpoints.serializers.detector_workflow_serializer import ( DetectorWorkflowSerializer, @@ -135,13 +134,16 @@ def delete(self, request, organization): if not queryset: return Response(status=status.HTTP_404_NOT_FOUND) + detector_workflows = list(queryset) + # check that the user has permission to edit all detectors connections before deleting - for detector_workflow in queryset: + for detector_workflow in detector_workflows: if not can_edit_detector_workflow_connections(detector_workflow.detector, request): raise PermissionDenied - for detector_workflow in queryset: - RegionScheduledDeletion.schedule(detector_workflow, days=0, actor=request.user) + queryset.delete() + + for detector_workflow in detector_workflows: create_audit_entry( request=request, organization=organization, diff --git a/tests/sentry/workflow_engine/endpoints/test_organization_detector_workflow_details.py b/tests/sentry/workflow_engine/endpoints/test_organization_detector_workflow_details.py index e99b83aacf8bb5..356a42f959e95e 100644 --- a/tests/sentry/workflow_engine/endpoints/test_organization_detector_workflow_details.py +++ b/tests/sentry/workflow_engine/endpoints/test_organization_detector_workflow_details.py @@ -3,7 +3,6 @@ from sentry import audit_log from sentry.api.serializers import serialize from sentry.deletions.models.scheduleddeletion import RegionScheduledDeletion -from sentry.deletions.tasks.scheduled import run_scheduled_deletions from sentry.testutils.cases import APITestCase from sentry.testutils.outbox import outbox_runner from sentry.testutils.silo import region_silo_test @@ -71,16 +70,6 @@ def test_simple(self, mock_audit: mock.MagicMock) -> None: self.detector_workflow.id, ) - # verify the DetectorWorkflow was scheduled for deletion - assert RegionScheduledDeletion.objects.filter( - model_name="DetectorWorkflow", - object_id=self.detector_workflow.id, - ).exists() - - # delete the DetectorWorkflow - with self.tasks(): - run_scheduled_deletions() - # verify it was deleted assert not DetectorWorkflow.objects.filter(id=self.detector_workflow.id).exists() diff --git a/tests/sentry/workflow_engine/endpoints/test_organization_detector_workflow_index.py b/tests/sentry/workflow_engine/endpoints/test_organization_detector_workflow_index.py index 5663af5fa0a554..c0429f30fa05e5 100644 --- a/tests/sentry/workflow_engine/endpoints/test_organization_detector_workflow_index.py +++ b/tests/sentry/workflow_engine/endpoints/test_organization_detector_workflow_index.py @@ -2,7 +2,6 @@ from unittest.mock import MagicMock, call from sentry import audit_log -from sentry.deletions.tasks.scheduled import run_scheduled_deletions from sentry.grouping.grouptype import ErrorGroupType from sentry.testutils.cases import APITestCase from sentry.testutils.silo import region_silo_test @@ -311,8 +310,6 @@ def test_simple(self, mock_audit: MagicMock) -> None: self.organization.slug, qs_params={"detector_id": self.detector_1.id, "workflow_id": self.workflow_1.id}, ) - with self.tasks(): - run_scheduled_deletions() assert not DetectorWorkflow.objects.filter( detector_id=self.detector_1.id, workflow_id=self.workflow_1.id @@ -335,9 +332,6 @@ def test_batch_delete(self, mock_audit: MagicMock) -> None: self.organization.slug, qs_params={"detector_id": self.detector_1.id}, ) - with self.tasks(): - run_scheduled_deletions() - assert not DetectorWorkflow.objects.filter(detector_id=self.detector_1.id).exists() assert DetectorWorkflow.objects.filter(detector_id=self.detector_2.id).exists()