From 617146f5ea424895d45906ab66f3b18acac22d8a Mon Sep 17 00:00:00 2001 From: Michael Derynck Date: Thu, 15 Feb 2024 10:53:55 -0700 Subject: [PATCH] When team is removed do not delete webhooks belonging to it (#3873) # What this PR does When a team is deleted webhooks belonging to that team will be marked as having no team instead of the webhook being deleted. ## Which issue(s) this PR fixes ## Checklist - [x] Unit, integration, and e2e (if applicable) tests updated - [x] Documentation added (or `pr:no public docs` PR label added if not required) - [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not required) --- CHANGELOG.md | 1 + .../migrations/0012_alter_webhook_team.py | 20 +++++++++++++++++++ engine/apps/webhooks/models/webhook.py | 2 +- engine/apps/webhooks/tests/test_webhook.py | 16 +++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 engine/apps/webhooks/migrations/0012_alter_webhook_team.py diff --git a/CHANGELOG.md b/CHANGELOG.md index dafa545e..a00a1eab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Check for permissions on Slack escalate command ([#3891](https://github.com/grafana/oncall/pull/3891)) +- Do not delete webhook if its team is deleted @mderynck ([#3873](https://github.com/grafana/oncall/pull/3873)) ## v1.3.105 (2024-02-13) diff --git a/engine/apps/webhooks/migrations/0012_alter_webhook_team.py b/engine/apps/webhooks/migrations/0012_alter_webhook_team.py new file mode 100644 index 00000000..cf9204d5 --- /dev/null +++ b/engine/apps/webhooks/migrations/0012_alter_webhook_team.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.10 on 2024-02-14 17:55 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('user_management', '0020_organization_is_grafana_labels_enabled'), + ('webhooks', '0011_auto_20230920_1813'), + ] + + operations = [ + migrations.AlterField( + model_name='webhook', + name='team', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='webhooks', to='user_management.team'), + ), + ] diff --git a/engine/apps/webhooks/models/webhook.py b/engine/apps/webhooks/models/webhook.py index d5731f6e..d2f1bb96 100644 --- a/engine/apps/webhooks/models/webhook.py +++ b/engine/apps/webhooks/models/webhook.py @@ -120,7 +120,7 @@ class Webhook(models.Model): ) team = models.ForeignKey( - "user_management.Team", null=True, on_delete=models.CASCADE, related_name="webhooks", default=None + "user_management.Team", null=True, on_delete=models.SET_NULL, related_name="webhooks", default=None ) user = models.ForeignKey( diff --git a/engine/apps/webhooks/tests/test_webhook.py b/engine/apps/webhooks/tests/test_webhook.py index 50d3e6bc..39420e00 100644 --- a/engine/apps/webhooks/tests/test_webhook.py +++ b/engine/apps/webhooks/tests/test_webhook.py @@ -304,3 +304,19 @@ def test_escaping_unicode_in_string(make_organization, make_custom_webhook, data } request_kwargs = webhook.build_request_kwargs(payload) assert request_kwargs == {"headers": {}, **expected_kwargs} + + +@pytest.mark.django_db +def test_webhook_not_deleted_with_team(make_organization, make_team, make_custom_webhook): + organization = make_organization() + team = make_team(organization=organization) + webhook = make_custom_webhook( + organization=organization, + team=team, + ) + assert webhook.team == team + webhook_pk = webhook.pk + team.delete() + + webhook = Webhook.objects.get(pk=webhook_pk) + assert webhook.team is None