diff --git a/src/sentry/models/groupopenperiod.py b/src/sentry/models/groupopenperiod.py index 4611043db29e4e..0a56d8e479bc6b 100644 --- a/src/sentry/models/groupopenperiod.py +++ b/src/sentry/models/groupopenperiod.py @@ -143,7 +143,6 @@ def get_open_periods_for_group( group: Group, query_start: datetime | None = None, query_end: datetime | None = None, - limit: int | None = None, ) -> BaseQuerySet[GroupOpenPeriod]: """ Get open periods for a group that overlap with the query time range. @@ -173,7 +172,7 @@ def get_open_periods_for_group( ended_after_query_starts = Q(date_ended__gte=query_start) still_open = Q(date_ended__isnull=True) - group_open_periods = ( + return ( GroupOpenPeriod.objects.filter( group=group, ) @@ -181,8 +180,6 @@ def get_open_periods_for_group( .order_by("-date_started") ) - return group_open_periods[:limit] - def create_open_period(group: Group, start_time: datetime, event_id: str | None = None) -> None: # no-op if the group does not create open periods diff --git a/src/sentry/workflow_engine/endpoints/organization_open_periods.py b/src/sentry/workflow_engine/endpoints/organization_open_periods.py index 2ec2788e38a1d8..8221a2992091ed 100644 --- a/src/sentry/workflow_engine/endpoints/organization_open_periods.py +++ b/src/sentry/workflow_engine/endpoints/organization_open_periods.py @@ -93,6 +93,13 @@ def get_group_from_group_id(self, group_id: str, organization: Organization) -> type=str, description="ID of the issue group.", ), + OpenApiParameter( + name="eventId", + location="query", + required=False, + type=str, + description="ID of the event to filter open periods by.", + ), ], responses={ 200: GroupOpenPeriodSerializer, @@ -113,6 +120,7 @@ def get(self, request: Request, organization: Organization) -> Response: detector_id_param = request.GET.get("detectorId") group_id_param = request.GET.get("groupId") + event_id_param = request.GET.get("eventId") # determines the time we need to subtract off of each timestamp before returning the data bucket_size_param = request.GET.get("bucketSize", 0) @@ -133,19 +141,15 @@ def get(self, request: Request, organization: Organization) -> Response: if not target_group: return self.paginate(request=request, queryset=[]) - limit = None - per_page = request.GET.get("per_page") - if per_page: - limit = int(per_page) - assert limit > 0 - open_periods = get_open_periods_for_group( group=target_group, query_start=start, query_end=end, - limit=limit, ) - # need to pass start, end to serializer + + if event_id_param: + open_periods = open_periods.filter(event_id=event_id_param) + return self.paginate( request=request, queryset=open_periods, diff --git a/tests/sentry/workflow_engine/endpoints/test_organization_open_periods.py b/tests/sentry/workflow_engine/endpoints/test_organization_open_periods.py index 13571b0bf15430..7e778b80ae2169 100644 --- a/tests/sentry/workflow_engine/endpoints/test_organization_open_periods.py +++ b/tests/sentry/workflow_engine/endpoints/test_organization_open_periods.py @@ -8,7 +8,6 @@ from sentry.models.groupopenperiod import ( GroupOpenPeriod, create_open_period, - get_open_periods_for_group, update_group_open_period, ) from sentry.models.groupopenperiodactivity import GroupOpenPeriodActivity, OpenPeriodActivityType @@ -250,7 +249,6 @@ def test_open_periods_limit(self) -> None: resolution_time=resolved_time, resolution_activity=resolve_activity, ) - get_open_periods_for_group(self.group) unresolved_time = timezone.now() self.group.status = GroupStatus.UNRESOLVED @@ -457,3 +455,52 @@ def test_open_period_activities_time_period(self) -> None: "value": PriorityLevel(self.group.priority).to_str(), "dateCreated": update_gopa.date_added, } + + def test_filter_by_event_id(self) -> None: + GroupOpenPeriod.objects.filter(group=self.group).delete() + + event_id_1 = "a" * 32 + event_id_2 = "b" * 32 + + base_time = timezone.now() - timedelta(minutes=20) + + # Update group.first_seen to ensure default time range captures our test data + self.group.first_seen = base_time + self.group.save() + + open_period_1 = GroupOpenPeriod.objects.create( + group=self.group, + project=self.group.project, + date_started=base_time, + date_ended=base_time + timedelta(minutes=5), + event_id=event_id_1, + ) + open_period_2 = GroupOpenPeriod.objects.create( + group=self.group, + project=self.group.project, + date_started=base_time + timedelta(minutes=6), + date_ended=base_time + timedelta(minutes=10), + event_id=event_id_2, + ) + + response = self.get_success_response( + *self.get_url_args(), + qs_params={ + "groupId": self.group.id, + "eventId": event_id_1, + }, + ) + + assert len(response.data) == 1 + assert response.data[0]["id"] == str(open_period_1.id) + + response = self.get_success_response( + *self.get_url_args(), + qs_params={ + "groupId": self.group.id, + "eventId": event_id_2, + }, + ) + + assert len(response.data) == 1 + assert response.data[0]["id"] == str(open_period_2.id)