Browse Source

feat(crons): Add `unassigned` to owner filter (#69251)

Evan Purkhiser 10 months ago
parent
commit
53c0c8f556

+ 12 - 6
src/sentry/monitors/endpoints/organization_monitor_index.py

@@ -203,9 +203,11 @@ class OrganizationMonitorIndexEndpoint(OrganizationEndpoint):
         if owners:
             owners = set(owners)
 
-            # Remove special 'myteams' from owners, this can't be parsed as an ActorTuple
-            myteams = ["myteams"] if "myteams" in owners else []
+            # Remove special values from owners, this can't be parsed as an ActorTuple
+            include_myteams = "myteams" in owners
             owners.discard("myteams")
+            include_unassigned = "unassigned" in owners
+            owners.discard("unassigned")
 
             actors = [ActorTuple.from_actor_identifier(identifier) for identifier in owners]
 
@@ -215,13 +217,17 @@ class OrganizationMonitorIndexEndpoint(OrganizationEndpoint):
             teams = get_teams(
                 request,
                 organization,
-                teams=[*team_ids, *myteams],
+                teams=[*team_ids, *(["myteams"] if include_myteams else [])],
             )
             team_ids = [team.id for team in teams]
 
-            queryset = queryset.filter(
-                Q(owner_user_id__in=user_ids) | Q(owner_team_id__in=team_ids)
-            )
+            owner_filter = Q(owner_user_id__in=user_ids) | Q(owner_team_id__in=team_ids)
+
+            if include_unassigned:
+                unassigned_filter = Q(owner_user_id=None) & Q(owner_team_id=None)
+                queryset = queryset.filter(unassigned_filter | owner_filter)
+            else:
+                queryset = queryset.filter(owner_filter)
 
         if query:
             tokens = tokenize_query(query)

+ 15 - 7
tests/sentry/monitors/endpoints/test_organization_monitor_index.py

@@ -216,28 +216,36 @@ class ListOrganizationMonitorsTest(MonitorTestCase):
         team_2 = self.create_team()
         self.create_team_membership(team_2, user=self.user)
 
-        mon_1 = self._create_monitor(name="A monitor", owner_user_id=user_1.id)
-        mon_2 = self._create_monitor(name="B monitor", owner_user_id=user_2.id)
-        mon_3 = self._create_monitor(name="C monitor", owner_user_id=None, owner_team_id=team_1.id)
-        mon_4 = self._create_monitor(name="C monitor", owner_user_id=None, owner_team_id=team_2.id)
+        mon_a = self._create_monitor(name="A monitor", owner_user_id=user_1.id)
+        mon_b = self._create_monitor(name="B monitor", owner_user_id=user_2.id)
+        mon_c = self._create_monitor(name="C monitor", owner_user_id=None, owner_team_id=team_1.id)
+        mon_d = self._create_monitor(name="D monitor", owner_user_id=None, owner_team_id=team_2.id)
+        mon_e = self._create_monitor(name="E monitor", owner_user_id=None, owner_team_id=None)
 
         # Monitor by user
         response = self.get_success_response(self.organization.slug, owner=[f"user:{user_1.id}"])
-        self.check_valid_response(response, [mon_1])
+        self.check_valid_response(response, [mon_a])
 
         # Monitors by users and teams
         response = self.get_success_response(
             self.organization.slug,
             owner=[f"user:{user_1.id}", f"user:{user_2.id}", f"team:{team_1.id}"],
         )
-        self.check_valid_response(response, [mon_1, mon_2, mon_3])
+        self.check_valid_response(response, [mon_a, mon_b, mon_c])
 
         # myteams
         response = self.get_success_response(
             self.organization.slug,
             owner=["myteams"],
         )
-        self.check_valid_response(response, [mon_4])
+        self.check_valid_response(response, [mon_d])
+
+        # unassigned monitors
+        response = self.get_success_response(
+            self.organization.slug,
+            owner=["unassigned", f"user:{user_1.id}"],
+        )
+        self.check_valid_response(response, [mon_a, mon_e])
 
         # Invalid user ID
         response = self.get_success_response(