Browse Source

fix(rules): Fix issue alert rule display when filtered to assignees (#72374)

When the filter "The issue is assigned to ___" is used, the rule details
page just shows it as "The issue is assigned to Member" or "The issue is
assigned to Team" rather than actually showing the name of the user or
team. This PR displays the names.

Fixes
https://github.com/getsentry/team-core-product-foundations/issues/265
Colleen O'Rourke 9 months ago
parent
commit
b39fa23307

+ 18 - 1
src/sentry/rules/filters/assigned_to.py

@@ -7,14 +7,15 @@ from django import forms
 
 from sentry.eventstore.models import GroupEvent
 from sentry.mail.forms.assigned_to import AssignedToForm
+from sentry.models.team import Team
 from sentry.notifications.types import ASSIGNEE_CHOICES, AssigneeTargetType
 from sentry.rules import EventState
 from sentry.rules.filters.base import EventFilter
+from sentry.services.hybrid_cloud.user.service import user_service
 from sentry.utils.cache import cache
 
 if TYPE_CHECKING:
     from sentry.models.group import Group
-    from sentry.models.team import Team
     from sentry.models.user import User
 
 
@@ -55,3 +56,19 @@ class AssignedToFilter(EventFilter):
     def get_form_instance(self) -> forms.Form:
         form: forms.Form = self.form_cls(self.project, self.data)
         return form
+
+    def render_label(self) -> str:
+        target_type = AssigneeTargetType(self.get_option("targetType"))
+        target_identifer = self.get_option("targetIdentifier")
+        if target_type == AssigneeTargetType.TEAM:
+            try:
+                team = Team.objects.get(id=target_identifer)
+            except Team.DoesNotExist:
+                return self.label.format(**self.data)
+            return self.label.format(targetType=f"team #{team.slug}")
+
+        elif target_type == AssigneeTargetType.MEMBER:
+            user = user_service.get_user(user_id=target_identifer)
+            return self.label.format(targetType=user.username)
+
+        return self.label.format(**self.data)

+ 59 - 0
tests/sentry/api/endpoints/test_project_rule_details.py

@@ -177,6 +177,65 @@ class ProjectRuleDetailsTest(ProjectRuleDetailsBaseTestCase):
         assert len(response.data["filters"]) == 1
         assert response.data["filters"][0]["id"] == conditions[1]["id"]
 
+    def test_with_assigned_to_team_filter(self):
+        conditions: list[dict[str, Any]] = [
+            {"id": "sentry.rules.conditions.every_event.EveryEventCondition"},
+            {
+                "targetType": "Team",
+                "id": "sentry.rules.filters.assigned_to.AssignedToFilter",
+                "targetIdentifier": self.team.id,
+            },
+        ]
+        actions: list[dict[str, Any]] = [
+            {"id": "sentry.rules.actions.notify_event.NotifyEventAction"}
+        ]
+        data = {
+            "conditions": conditions,
+            "actions": actions,
+            "filter_match": "all",
+            "action_match": "all",
+            "frequency": 30,
+        }
+        self.rule.update(data=data)
+
+        response = self.get_success_response(
+            self.organization.slug, self.project.slug, self.rule.id, status_code=200
+        )
+        assert response.data["id"] == str(self.rule.id)
+        assert (
+            response.data["filters"][0]["name"]
+            == f"The issue is assigned to team #{self.team.slug}"
+        )
+
+    def test_with_assigned_to_user_filter(self):
+        conditions: list[dict[str, Any]] = [
+            {"id": "sentry.rules.conditions.every_event.EveryEventCondition"},
+            {
+                "targetType": "Member",
+                "id": "sentry.rules.filters.assigned_to.AssignedToFilter",
+                "targetIdentifier": self.user.id,
+            },
+        ]
+        actions: list[dict[str, Any]] = [
+            {"id": "sentry.rules.actions.notify_event.NotifyEventAction"}
+        ]
+        data = {
+            "conditions": conditions,
+            "actions": actions,
+            "filter_match": "all",
+            "action_match": "all",
+            "frequency": 30,
+        }
+        self.rule.update(data=data)
+
+        response = self.get_success_response(
+            self.organization.slug, self.project.slug, self.rule.id, status_code=200
+        )
+        assert response.data["id"] == str(self.rule.id)
+        assert (
+            response.data["filters"][0]["name"] == f"The issue is assigned to {self.user.username}"
+        )
+
     @responses.activate
     def test_neglected_rule(self):
         now = datetime.now(UTC)