Skip to content

ref: run auto-type-annotate on **/issues/**.py #90000

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 22, 2025
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
11 changes: 9 additions & 2 deletions src/sentry/issues/endpoints/group_hashes.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from functools import partial

from django.contrib.auth.models import AnonymousUser
from rest_framework.request import Request
from rest_framework.response import Response

Expand All @@ -12,6 +13,8 @@
from sentry.models.group import Group
from sentry.models.grouphash import GroupHash
from sentry.tasks.unmerge import unmerge
from sentry.users.models.user import User
from sentry.users.services.user.model import RpcUser
from sentry.utils import metrics
from sentry.utils.snuba import raw_query

Expand Down Expand Up @@ -95,12 +98,16 @@ def put(self, request: Request, group: Group) -> Response:

return Response(status=202)

def __handle_results(self, project_id, group_id, user, full, results):
def __handle_results(
self, project_id, group_id, user: User | RpcUser | AnonymousUser | None, full, results
):
return [
self.__handle_result(user, project_id, group_id, full, result) for result in results
]

def __handle_result(self, user, project_id, group_id, full, result):
def __handle_result(
self, user: User | RpcUser | AnonymousUser | None, project_id, group_id, full, result
):
event = eventstore.backend.get_event_by_id(project_id, result["event_id"])

serializer = EventSerializer if full else SimpleEventSerializer
Expand Down
4 changes: 3 additions & 1 deletion src/sentry/issues/endpoints/organization_issues_count.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
from sentry.api.issue_search import convert_query_values, parse_search_query
from sentry.api.utils import get_date_range_from_params
from sentry.exceptions import InvalidParams
from sentry.models.organization import Organization
from sentry.organizations.services.organization.model import RpcOrganization
from sentry.snuba import discover
from sentry.types.ratelimit import RateLimit, RateLimitCategory

Expand Down Expand Up @@ -65,7 +67,7 @@ def _count(
result = search.backend.query(**query_kwargs)
return result.hits

def get(self, request: Request, organization) -> Response:
def get(self, request: Request, organization: Organization | RpcOrganization) -> Response:
stats_period = request.GET.get("groupStatsPeriod")
try:
start, end = get_date_range_from_params(request.GET)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ class OrganizationGroupSearchViewDetailsStarredEndpointTest(APITestCase):
endpoint = "sentry-api-0-organization-group-search-view-starred"
method = "post"

def setUp(self):
def setUp(self) -> None:
super().setUp()
self.login_as(user=self.user)
self.org = self.create_organization(owner=self.user)

def get_url(self, view_id):
def get_url(self, view_id: int) -> str:
return reverse(
self.endpoint,
kwargs={
Expand All @@ -24,7 +24,9 @@ def get_url(self, view_id):
},
)

def create_view(self, user_id=None, visibility=None, starred=False):
def create_view(
self, user_id: int | None = None, visibility: str | None = None, starred: bool = False
) -> GroupSearchView:
user_id = user_id or self.user.id
visibility = visibility or GroupSearchViewVisibility.OWNER

Expand All @@ -45,13 +47,13 @@ def create_view(self, user_id=None, visibility=None, starred=False):
return view

@with_feature("organizations:issue-stream-custom-views")
def test_view_not_found(self):
def test_view_not_found(self) -> None:
response = self.client.post(self.get_url(737373), data={"starred": True})

assert response.status_code == 404

@with_feature("organizations:issue-stream-custom-views")
def test_organization_view_accessible(self):
def test_organization_view_accessible(self) -> None:
other_user = self.create_user()
view = self.create_view(
user_id=other_user.id, visibility=GroupSearchViewVisibility.ORGANIZATION
Expand All @@ -67,7 +69,7 @@ def test_organization_view_accessible(self):
).exists()

@with_feature("organizations:issue-stream-custom-views")
def test_invalid_request_data(self):
def test_invalid_request_data(self) -> None:
view = self.create_view()

# Missing starred field
Expand All @@ -79,7 +81,7 @@ def test_invalid_request_data(self):
assert response.status_code == 400

@with_feature("organizations:issue-stream-custom-views")
def test_star_view_with_position(self):
def test_star_view_with_position(self) -> None:
view1 = self.create_view(starred=True)
view2 = self.create_view(starred=True)
view_to_be_starred = self.create_view()
Expand Down Expand Up @@ -111,7 +113,7 @@ def test_star_view_with_position(self):
).exists()

@with_feature("organizations:issue-stream-custom-views")
def test_star_view_without_position(self):
def test_star_view_without_position(self) -> None:
view = self.create_view()

response = self.client.post(self.get_url(view.id), data={"starred": True})
Expand All @@ -127,7 +129,7 @@ def test_star_view_without_position(self):
assert starred_view.position == 0

@with_feature("organizations:issue-stream-custom-views")
def test_unstar_view(self):
def test_unstar_view(self) -> None:
starred_view = self.create_view(starred=True)
view_to_be_unstarred = self.create_view(starred=True)

Expand All @@ -146,23 +148,23 @@ def test_unstar_view(self):
).exists()

@with_feature("organizations:issue-stream-custom-views")
def test_star_already_starred_view(self):
def test_star_already_starred_view(self) -> None:
view = self.create_view(starred=True)

response = self.client.post(self.get_url(view.id), data={"starred": True})

assert response.status_code == 204

@with_feature("organizations:issue-stream-custom-views")
def test_unstar_not_starred_view(self):
def test_unstar_not_starred_view(self) -> None:
view = self.create_view()

response = self.client.post(self.get_url(view.id), data={"starred": False})

assert response.status_code == 204

@with_feature("organizations:issue-stream-custom-views")
def test_multiple_starred_views_order(self):
def test_multiple_starred_views_order(self) -> None:
view1 = self.create_view()
view2 = self.create_view()
view3 = self.create_view()
Expand Down Expand Up @@ -205,7 +207,7 @@ def test_multiple_starred_views_order(self):
)

@with_feature("organizations:issue-stream-custom-views")
def test_unstar_adjust_positions(self):
def test_unstar_adjust_positions(self) -> None:
view1 = self.create_view(starred=True)
view2 = self.create_view(starred=True)
view3 = self.create_view(starred=True)
Expand Down Expand Up @@ -233,7 +235,7 @@ def test_unstar_adjust_positions(self):
== 0
)

def test_error_when_feature_flag_disabled(self):
def test_error_when_feature_flag_disabled(self) -> None:
view = self.create_view()

response = self.client.post(self.get_url(view.id), data={"starred": True})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
class OrganizationGroupSearchViewStarredOrderEndpointTest(APITestCase):
endpoint = "sentry-api-0-organization-group-search-view-starred-order"

def setUp(self):
def setUp(self) -> None:
super().setUp()
self.login_as(user=self.user)
self.user_2 = self.create_user()
Expand Down Expand Up @@ -58,7 +58,7 @@ def setUp(self):
visibility=GroupSearchViewVisibility.ORGANIZATION,
)

def star_views(self, view_ids: list[int]):
def star_views(self, view_ids: list[int]) -> None:
for idx, view_id in enumerate(view_ids):
GroupSearchViewStarred.objects.create(
organization=self.organization,
Expand All @@ -68,7 +68,7 @@ def star_views(self, view_ids: list[int]):
)

@with_feature("organizations:issue-stream-custom-views")
def test_simple_reordering(self):
def test_simple_reordering(self) -> None:
self.star_views([self.views[0].id, self.views[1].id, self.views[2].id])

new_order = [self.views[2].id, self.views[0].id, self.views[1].id]
Expand All @@ -92,7 +92,7 @@ def test_simple_reordering(self):
assert starred_views[2].position == 2

@with_feature("organizations:issue-stream-custom-views")
def test_same_order_reordering(self):
def test_same_order_reordering(self) -> None:
original_order = [self.views[0].id, self.views[1].id, self.views[2].id]

self.star_views(original_order)
Expand All @@ -116,7 +116,7 @@ def test_same_order_reordering(self):
assert starred_views[2].position == 2

@with_feature("organizations:issue-stream-custom-views")
def reordering_with_shared_views(self):
def reordering_with_shared_views(self) -> None:
self.star_views([self.views[0].id, self.views[1].id, self.views[2].id, self.shared_view.id])

new_order = [self.shared_view.id, self.views[2].id, self.views[0].id, self.views[1].id]
Expand All @@ -143,7 +143,7 @@ def reordering_with_shared_views(self):
assert starred_views[3].position == 3

@with_feature("organizations:issue-stream-custom-views")
def test_empty_starred_list(self):
def test_empty_starred_list(self) -> None:
response = self.client.put(self.url, data={"view_ids": []}, format="json")

assert response.status_code == 204
Expand All @@ -154,7 +154,7 @@ def test_empty_starred_list(self):
).exists()

@with_feature("organizations:issue-stream-custom-views")
def test_error_on_fewer_views_than_starred_views(self):
def test_error_on_fewer_views_than_starred_views(self) -> None:
self.star_views([self.views[0].id, self.views[1].id, self.views[2].id])

response = self.client.put(
Expand All @@ -164,7 +164,7 @@ def test_error_on_fewer_views_than_starred_views(self):
assert response.status_code == 400

@with_feature("organizations:issue-stream-custom-views")
def test_error_on_more_views_than_starred_views(self):
def test_error_on_more_views_than_starred_views(self) -> None:
self.star_views([self.views[0].id, self.views[1].id])

response = self.client.put(
Expand All @@ -176,7 +176,7 @@ def test_error_on_more_views_than_starred_views(self):
assert response.status_code == 400

@with_feature("organizations:issue-stream-custom-views")
def test_error_on_duplicate_view_ids(self):
def test_error_on_duplicate_view_ids(self) -> None:
view_ids = [self.views[0].id, self.views[1].id, self.views[1].id]

response = self.client.put(self.url, data={"view_ids": view_ids}, format="json")
Expand All @@ -192,7 +192,7 @@ def test_error_on_duplicate_view_ids(self):
class OrganizationGroupSearchViewStarredOrderTransactionTest(TransactionTestCase):
endpoint = "sentry-api-0-organization-group-search-view-starred-order"

def setUp(self):
def setUp(self) -> None:
super().setUp()
self.login_as(user=self.user)

Expand All @@ -209,7 +209,7 @@ def setUp(self):
)

@with_feature("organizations:issue-stream-custom-views")
def test_nonexistent_view_id(self):
def test_nonexistent_view_id(self) -> None:
non_existent_id = 373737
view_ids = [self.view.id, non_existent_id]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def create_view(
)
return view

def star_view(self, user: User, view: GroupSearchView):
def star_view(self, user: User, view: GroupSearchView) -> None:
GroupSearchViewStarred.objects.insert_starred_view(
user_id=user.id,
organization=self.organization,
Expand All @@ -52,7 +52,7 @@ def star_view(self, user: User, view: GroupSearchView):

@with_feature({"organizations:issue-stream-custom-views": True})
@with_feature({"organizations:global-views": True})
def test_simple_case(self):
def test_simple_case(self) -> None:
self.login_as(user=self.user)
view_1 = self.create_view(user=self.user, name="Starred View 1", starred=True)
view_2 = self.create_view(user=self.user, name="Starred View 2", starred=True)
Expand All @@ -71,7 +71,7 @@ def test_simple_case(self):

@with_feature({"organizations:issue-stream-custom-views": True})
@with_feature({"organizations:global-views": True})
def test_views_starred_by_many_users(self):
def test_views_starred_by_many_users(self) -> None:
user_1 = self.user
user_2 = self.create_user()
self.create_member(user=user_2, organization=self.organization)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,28 @@
import datetime
import time
import uuid
from typing import TypedDict

from sentry.testutils.cases import APITestCase, SnubaTestCase


class _FlagResult(TypedDict):
flag: str
result: bool


class OrganizationGroupSuspectFlagsTestCase(APITestCase, SnubaTestCase):
endpoint = "sentry-api-0-organization-group-suspect-flags"

def setUp(self):
def setUp(self) -> None:
super().setUp()
self.login_as(user=self.user)

@property
def features(self):
def features(self) -> dict[str, bool]:
return {"organizations:feature-flag-suspect-flags": True}

def test_get(self):
def test_get(self) -> None:
today = datetime.datetime.now(tz=datetime.UTC) - datetime.timedelta(minutes=5)
group = self.create_group(
first_seen=today - datetime.timedelta(hours=1),
Expand Down Expand Up @@ -55,19 +61,26 @@ def test_get(self):
]
}

def test_get_no_flag_access(self):
def test_get_no_flag_access(self) -> None:
"""Does not have feature-flag access."""
group = self.create_group()
response = self.client.get(f"/api/0/issues/{group.id}/suspect/flags/")
assert response.status_code == 404

def test_get_no_group(self):
def test_get_no_group(self) -> None:
"""Group not found."""
with self.feature(self.features):
response = self.client.get("/api/0/issues/22/suspect/flags/")
assert response.status_code == 404

def _mock_event(self, ts, hash="a" * 32, group_id=None, project_id=1, flags=None):
def _mock_event(
self,
ts: datetime.datetime,
hash: str = "a" * 32,
group_id: int | None = None,
project_id: int = 1,
flags: list[_FlagResult] | None = None,
) -> None:
self.snuba_insert(
(
2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@
class OrganizationGroupSuspectTagsTestCase(APITestCase, SnubaTestCase):
endpoint = "sentry-api-0-organization-group-suspect-tags"

def setUp(self):
def setUp(self) -> None:
super().setUp()
self.login_as(user=self.user)

@property
def features(self):
def features(self) -> dict[str, bool]:
return {"organizations:issues-suspect-tags": True}

def test_get(self):
def test_get(self) -> None:
today = datetime.datetime.now(tz=datetime.UTC) - datetime.timedelta(minutes=5)
group = self.create_group(
first_seen=today - datetime.timedelta(hours=1),
Expand Down Expand Up @@ -49,13 +49,13 @@ def test_get(self):
]
}

def test_get_no_tag_access(self):
def test_get_no_tag_access(self) -> None:
"""Does not have feature-tag access."""
group = self.create_group()
response = self.client.get(f"/api/0/issues/{group.id}/suspect/tags/")
assert response.status_code == 404

def test_get_no_group(self):
def test_get_no_group(self) -> None:
"""Group not found."""
with self.feature(self.features):
response = self.client.get("/api/0/issues/22/suspect/tags/")
Expand Down
Loading
Loading