Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions src/sentry/models/groupopenperiod.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -173,16 +172,14 @@ 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,
)
.filter(started_before_query_ends & (ended_after_query_starts | still_open))
.order_by("-date_started")
)

return group_open_periods[:limit]
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be handled by self.paginate(). This function isn't used anywhere else



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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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)

Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Loading