Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 16 additions & 20 deletions src/sentry/api/endpoints/project_rule_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from rest_framework.request import Request
from rest_framework.response import Response

from sentry import analytics, audit_log, features
from sentry import analytics, audit_log
from sentry.analytics.events.rule_disable_opt_out import (
RuleDisableOptOutEdit,
RuleDisableOptOutExplicit,
Expand Down Expand Up @@ -137,13 +137,12 @@ def get(self, request: Request, project: Project, rule: Rule | Workflow) -> Resp
- Filters - help control noise by triggering an alert only if the issue matches the specified criteria.
- Actions - specify what should happen when the trigger conditions are met and the filters match.
"""
if features.has("organizations:workflow-engine-rule-serializers", project.organization):
if isinstance(rule, Workflow):
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just a nicety change unrelated to the delete method

workflow_engine_rule_serializer = WorkflowEngineRuleSerializer(
expand=request.GET.getlist("expand", []),
prepare_component_fields=True,
project_slug=project.slug,
)
# XXX: Note 'rule' here is actually a workflow object
serialized_rule = serialize(rule, request.user, workflow_engine_rule_serializer)
else:
# Serialize Rule object
Expand Down Expand Up @@ -419,28 +418,25 @@ def delete(self, request: Request, project: Project, rule: Rule | Workflow) -> R
- Actions: specify what should happen when the trigger conditions are met and the filters match.
"""
if isinstance(rule, Workflow):
return Response(
{
"rule": [
"Passing a workflow through this endpoint is not yet supported",
]
},
status=status.HTTP_400_BAD_REQUEST,
)

report_used_legacy_models()
with transaction.atomic(router.db_for_write(Rule)):
rule.update(status=ObjectStatus.PENDING_DELETION)
RuleActivity.objects.create(
rule=rule, user_id=request.user.id, type=RuleActivityType.DELETED.value
)
scheduled = RegionScheduledDeletion.schedule(rule, days=0, actor=request.user)
audit_id = "WORKFLOW_REMOVE"
with transaction.atomic(router.db_for_write(Workflow)):
rule.update(status=ObjectStatus.PENDING_DELETION)
scheduled = RegionScheduledDeletion.schedule(rule, days=0, actor=request.user)
else:
audit_id = "RULE_REMOVE"
report_used_legacy_models()
with transaction.atomic(router.db_for_write(Rule)):
rule.update(status=ObjectStatus.PENDING_DELETION)
RuleActivity.objects.create(
rule=rule, user_id=request.user.id, type=RuleActivityType.DELETED.value
)
scheduled = RegionScheduledDeletion.schedule(rule, days=0, actor=request.user)

self.create_audit_entry(
request=request,
organization=project.organization,
target_object=rule.id,
event=audit_log.get_event_id("RULE_REMOVE"),
event=audit_log.get_event_id(audit_id),
data=rule.get_audit_log_data(),
transaction_id=scheduled.id,
)
Expand Down
16 changes: 12 additions & 4 deletions tests/sentry/api/endpoints/test_project_rule_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@
from sentry.testutils.helpers.datetime import freeze_time
from sentry.testutils.silo import assume_test_silo_mode
from sentry.types.actor import Actor
from sentry.workflow_engine.models import AlertRuleWorkflow
from sentry.workflow_engine.models import Action, AlertRuleWorkflow
from sentry.workflow_engine.models.data_condition import Condition, DataCondition
from sentry.workflow_engine.models.data_condition_group import DataConditionGroup
from sentry.workflow_engine.models.detector_workflow import DetectorWorkflow
from sentry.workflow_engine.models.workflow import Workflow
from sentry.workflow_engine.models.workflow_data_condition_group import WorkflowDataConditionGroup
from tests.sentry.workflow_engine.test_base import BaseWorkflowTest
Expand Down Expand Up @@ -1641,10 +1642,17 @@ def test_simple(self) -> None:
).exists()

@with_feature("organizations:workflow-engine-rule-serializers")
def test_workflow_passed(self) -> None:
self.get_error_response(
self.organization.slug, self.project.slug, self.fake_workflow_id, status_code=400
def test_single_written_workflow_passed(self) -> None:
self.get_success_response(
self.organization.slug, self.project.slug, self.fake_workflow_id, status_code=202
)
with self.tasks():
run_scheduled_deletions()

assert not Workflow.objects.filter(id=self.workflow.id).exists()
assert not DetectorWorkflow.objects.filter(id=self.detector_workflow.id).exists()
assert not DataConditionGroup.objects.filter(id=self.workflow_triggers.id).exists()
assert not Action.objects.filter(id=self.action.id).exists()

def test_dual_delete_workflow_engine(self) -> None:
rule = self.create_project_rule(
Expand Down
Loading