diff --git a/src/sentry/api/helpers/group_index/update.py b/src/sentry/api/helpers/group_index/update.py index 1962ee68746813..39b2ac44c3a3e5 100644 --- a/src/sentry/api/helpers/group_index/update.py +++ b/src/sentry/api/helpers/group_index/update.py @@ -10,13 +10,12 @@ import rest_framework from django.db import IntegrityError, router, transaction from django.db.models import Q -from django.db.models.signals import post_save from django.utils import timezone as django_timezone from rest_framework import serializers from rest_framework.request import Request from rest_framework.response import Response -from sentry import analytics, features, options +from sentry import analytics, features from sentry.api.serializers import serialize from sentry.api.serializers.models.actor import ActorSerializer, ActorSerializerResponse from sentry.db.models.query import create_or_update @@ -531,13 +530,6 @@ def update_groups( group.status = GroupStatus.RESOLVED group.substatus = None group.resolved_at = now - if affected and not options.get("groups.enable-post-update-signal"): - post_save.send( - sender=Group, - instance=group, - created=False, - update_fields=["resolved_at", "status", "substatus"], - ) remove_group_from_inbox( group, action=GroupInboxRemoveAction.RESOLVED, user=acting_user ) diff --git a/src/sentry/event_manager.py b/src/sentry/event_manager.py index 86f4a882ba8baa..f3543be5a26d51 100644 --- a/src/sentry/event_manager.py +++ b/src/sentry/event_manager.py @@ -15,7 +15,6 @@ from django.core.exceptions import ValidationError from django.db import IntegrityError, OperationalError, connection, router, transaction from django.db.models import Func, Max -from django.db.models.signals import post_save from django.utils.encoding import force_str from urllib3.exceptions import MaxRetryError, TimeoutError from usageaccountant import UsageUnit @@ -1717,13 +1716,6 @@ def _handle_regression(group: Group, event: BaseEvent, release: Release | None) transition_type="automatic", sender="handle_regression", ) - if not options.get("groups.enable-post-update-signal"): - post_save.send( - sender=Group, - instance=group, - created=False, - update_fields=["last_seen", "active_at", "status", "substatus"], - ) follows_semver = False resolved_in_activity = None diff --git a/src/sentry/issues/escalating.py b/src/sentry/issues/escalating.py index d9f88b36cf200b..5d5cde83918f75 100644 --- a/src/sentry/issues/escalating.py +++ b/src/sentry/issues/escalating.py @@ -12,7 +12,6 @@ from typing import Any, TypedDict import jsonschema -from django.db.models.signals import post_save from snuba_sdk import ( Column, Condition, @@ -28,7 +27,7 @@ ) from snuba_sdk.expressions import Granularity -from sentry import features, options +from sentry import features from sentry.eventstore.models import GroupEvent from sentry.issues.escalating_group_forecast import EscalatingGroupForecast from sentry.issues.escalating_issues_alg import GroupCount @@ -507,13 +506,6 @@ def manage_issue_states( if updated: group.status = GroupStatus.UNRESOLVED group.substatus = GroupSubStatus.ESCALATING - if not options.get("groups.enable-post-update-signal"): - post_save.send( - sender=Group, - instance=group, - created=False, - update_fields=["status", "substatus"], - ) add_group_to_inbox(group, GroupInboxReason.ESCALATING, snooze_details) record_group_history(group, GroupHistoryStatus.ESCALATING) @@ -553,13 +545,6 @@ def manage_issue_states( if updated: group.status = GroupStatus.UNRESOLVED group.substatus = GroupSubStatus.ONGOING - if not options.get("groups.enable-post-update-signal"): - post_save.send( - sender=Group, - instance=group, - created=False, - update_fields=["status", "substatus"], - ) add_group_to_inbox(group, GroupInboxReason.ONGOING, snooze_details) record_group_history(group, GroupHistoryStatus.ONGOING) @@ -574,13 +559,6 @@ def manage_issue_states( if updated: group.status = GroupStatus.UNRESOLVED group.substatus = GroupSubStatus.ONGOING - if not options.get("groups.enable-post-update-signal"): - post_save.send( - sender=Group, - instance=group, - created=False, - update_fields=["status", "substatus"], - ) add_group_to_inbox(group, GroupInboxReason.UNIGNORED, snooze_details) record_group_history(group, GroupHistoryStatus.UNIGNORED) Activity.objects.create_group_activity( diff --git a/src/sentry/issues/ongoing.py b/src/sentry/issues/ongoing.py index 71318a2b09231d..b514e1a8c27562 100644 --- a/src/sentry/issues/ongoing.py +++ b/src/sentry/issues/ongoing.py @@ -2,9 +2,7 @@ from typing import Any import sentry_sdk -from django.db.models.signals import post_save -from sentry import options from sentry.models.group import Group, GroupStatus from sentry.models.groupinbox import bulk_remove_groups_from_inbox from sentry.signals import issue_unresolved @@ -53,13 +51,3 @@ def bulk_transition_group_to_ongoing( with sentry_sdk.start_span(name="bulk_remove_groups_from_inbox"): bulk_remove_groups_from_inbox(groups_to_transistion) - - with sentry_sdk.start_span(name="post_save_send_robust"): - if not options.get("groups.enable-post-update-signal"): - for group in groups_to_transistion: - post_save.send_robust( - sender=Group, - instance=group, - created=False, - update_fields=["status", "substatus"], - ) diff --git a/src/sentry/issues/status_change.py b/src/sentry/issues/status_change.py index cfda68a6ef8384..fcd65111d5da21 100644 --- a/src/sentry/issues/status_change.py +++ b/src/sentry/issues/status_change.py @@ -6,9 +6,6 @@ from datetime import datetime, timedelta, timezone from typing import Any -from django.db.models.signals import post_save - -from sentry import options from sentry.integrations.tasks.kick_off_status_syncs import kick_off_status_syncs from sentry.issues.ignored import IGNORED_CONDITION_FIELDS from sentry.issues.ongoing import TRANSITION_AFTER_DAYS @@ -165,13 +162,4 @@ def handle_status_update( kick_off_status_syncs.apply_async( kwargs={"project_id": group.project_id, "group_id": group.id} ) - - if not options.get("groups.enable-post-update-signal"): - post_save.send( - sender=Group, - instance=group, - created=False, - update_fields=["status", "substatus"], - ) - return ActivityInfo(activity_type, activity_data) diff --git a/src/sentry/models/activity.py b/src/sentry/models/activity.py index 827d244880cf3c..dcb329abdafb99 100644 --- a/src/sentry/models/activity.py +++ b/src/sentry/models/activity.py @@ -8,10 +8,8 @@ from django.conf import settings from django.db import models from django.db.models import F -from django.db.models.signals import post_save from django.utils import timezone -from sentry import options from sentry.backup.scopes import RelocationScope from sentry.db.models import ( BoundedPositiveIntegerField, @@ -169,26 +167,14 @@ def save(self, *args, **kwargs): # HACK: support Group.num_comments if self.type == ActivityType.NOTE.value and self.group is not None: - from sentry.models.group import Group - self.group.update(num_comments=F("num_comments") + 1) - if not options.get("groups.enable-post-update-signal"): - post_save.send_robust( - sender=Group, instance=self.group, created=True, update_fields=["num_comments"] - ) def delete(self, *args, **kwargs): super().delete(*args, **kwargs) # HACK: support Group.num_comments if self.type == ActivityType.NOTE.value and self.group is not None: - from sentry.models.group import Group - self.group.update(num_comments=F("num_comments") - 1) - if not options.get("groups.enable-post-update-signal"): - post_save.send_robust( - sender=Group, instance=self.group, created=True, update_fields=["num_comments"] - ) def send_notification(self): activity.send_activity_notifications.delay(self.id) diff --git a/src/sentry/models/group.py b/src/sentry/models/group.py index 0e5ff5f5005f4c..3400782744608e 100644 --- a/src/sentry/models/group.py +++ b/src/sentry/models/group.py @@ -21,7 +21,7 @@ from django.utils.translation import gettext_lazy as _ from snuba_sdk import Column, Condition, Op -from sentry import eventstore, eventtypes, options, tagstore +from sentry import eventstore, eventtypes, tagstore from sentry.backup.scopes import RelocationScope from sentry.constants import DEFAULT_LOGGER_NAME, LOG_LEVELS, MAX_CULPRIT_LENGTH from sentry.db.models import ( @@ -314,11 +314,7 @@ class GroupManager(BaseManager["Group"]): use_for_related_fields = True def get_queryset(self): - return ( - super() - .get_queryset() - .with_post_update_signal(options.get("groups.enable-post-update-signal")) - ) + return super().get_queryset().with_post_update_signal(True) def by_qualified_short_id(self, organization_id: int, short_id: str): return self.by_qualified_short_id_bulk(organization_id, [short_id])[0] diff --git a/tests/sentry/api/helpers/test_group_index.py b/tests/sentry/api/helpers/test_group_index.py index 1ad1e035d7ac1c..099a11b93c67b7 100644 --- a/tests/sentry/api/helpers/test_group_index.py +++ b/tests/sentry/api/helpers/test_group_index.py @@ -17,7 +17,7 @@ from sentry.api.helpers.group_index.validators import ValidationError from sentry.api.issue_search import parse_search_query from sentry.models.activity import Activity -from sentry.models.group import Group, GroupStatus +from sentry.models.group import GroupStatus from sentry.models.groupassignee import GroupAssignee from sentry.models.groupbookmark import GroupBookmark from sentry.models.grouphash import GroupHash @@ -137,8 +137,7 @@ def test_resolving_unresolved_group(self, send_robust: Mock) -> None: assert send_robust.called @patch("sentry.signals.issue_ignored.send_robust") - @patch("sentry.issues.status_change.post_save") - def test_ignoring_group_archived_forever(self, post_save: Mock, send_robust: Mock) -> None: + def test_ignoring_group_archived_forever(self, send_robust: Mock) -> None: group = self.create_group() add_group_to_inbox(group, GroupInboxReason.NEW) @@ -157,12 +156,6 @@ def test_ignoring_group_archived_forever(self, post_save: Mock, send_robust: Moc assert group.status == GroupStatus.IGNORED assert group.substatus == GroupSubStatus.FOREVER assert send_robust.called - post_save.send.assert_called_with( - sender=Group, - instance=group, - created=False, - update_fields=["status", "substatus"], - ) assert not GroupInbox.objects.filter(group=group).exists() @patch("sentry.signals.issue_ignored.send_robust") diff --git a/tests/sentry/db/models/manager/test_base_query_set.py b/tests/sentry/db/models/manager/test_base_query_set.py index f37f8e8996b0cd..191af6c7f4b353 100644 --- a/tests/sentry/db/models/manager/test_base_query_set.py +++ b/tests/sentry/db/models/manager/test_base_query_set.py @@ -4,7 +4,6 @@ from sentry.models.group import Group from sentry.signals import post_update from sentry.testutils.cases import TestCase -from sentry.testutils.helpers import override_options @contextmanager @@ -40,31 +39,18 @@ def test_empty_query(self): class TestSendPostUpdateSignal(TestCase): def test_not_triggered(self): - with catch_signal(post_update) as handler, override_options( - {"groups.enable-post-update-signal": True} - ): + with catch_signal(post_update) as handler: self.group.message = "hi" self.group.save() assert not handler.called - with catch_signal(post_update) as handler, override_options( - {"groups.enable-post-update-signal": True} - ): + with catch_signal(post_update) as handler: self.group.update(message="hi") assert not handler.called - with catch_signal(post_update) as handler, override_options( - {"groups.enable-post-update-signal": False} - ): - assert Group.objects.filter(id=self.group.id).update(message="hi") == 1 - - assert not handler.called - - with catch_signal(post_update) as handler, override_options( - {"groups.enable-post-update-signal": True} - ): + with catch_signal(post_update) as handler: assert ( Group.objects.filter(id=self.group.id) .with_post_update_signal(False) @@ -75,9 +61,7 @@ def test_not_triggered(self): assert not handler.called # Test signal not fired when Django detects the query will return no results - with catch_signal(post_update) as handler, override_options( - {"groups.enable-post-update-signal": True} - ): + with catch_signal(post_update) as handler: assert ( Group.objects.filter(id__in=[]).with_post_update_signal(True).update(message="hi") == 0 @@ -86,7 +70,7 @@ def test_not_triggered(self): assert not handler.called def test_enable(self): - qs = Group.objects.all() + qs = Group.objects.with_post_update_signal(False) assert not qs._with_post_update_signal new_qs = qs.with_post_update_signal(True) # Make sure we don't modify the previous queryset @@ -95,9 +79,7 @@ def test_enable(self): def test_triggered(self): message = "hi" - with catch_signal(post_update) as handler, override_options( - {"groups.enable-post-update-signal": True} - ): + with catch_signal(post_update) as handler: assert Group.objects.filter(id=self.group.id).update(message=message) == 1 self.group.refresh_from_db() diff --git a/tests/sentry/issues/test_attributes.py b/tests/sentry/issues/test_attributes.py index ffc00b3caaeefe..929ced7b48f39c 100644 --- a/tests/sentry/issues/test_attributes.py +++ b/tests/sentry/issues/test_attributes.py @@ -224,12 +224,7 @@ def run_attr_test( with patch( "sentry.issues.attributes._log_group_attributes_changed" ) as _log_group_attributes_changed: - with override_options( - { - "groups.enable-post-update-signal": True, - "issues.group_attributes.send_kafka": True, - } - ): + with override_options({"issues.group_attributes.send_kafka": True}): Group.objects.filter(id__in=[g.id for g in groups]).update(**update_fields) _log_group_attributes_changed.assert_called_with( Operation.UPDATED, "group", expected_str