Skip to content

Commit f5a97ca

Browse files
ref: standardize user param as User | RpcUser | AnonymousUser in Serializers (#83436)
a tiny step to making these more typesafe <!-- Describe your PR here. -->
1 parent 42b93a4 commit f5a97ca

28 files changed

+258
-71
lines changed

Diff for: src/sentry/api/endpoints/group_ai_autofix.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import orjson
88
import requests
99
from django.conf import settings
10-
from django.contrib.auth.models import AbstractBaseUser, AnonymousUser
10+
from django.contrib.auth.models import AnonymousUser
1111
from rest_framework.response import Response
1212

1313
from sentry import eventstore, features
@@ -23,6 +23,7 @@
2323
from sentry.tasks.autofix import check_autofix_status
2424
from sentry.types.ratelimit import RateLimit, RateLimitCategory
2525
from sentry.users.models.user import User
26+
from sentry.users.services.user.model import RpcUser
2627
from sentry.users.services.user.service import user_service
2728

2829
logger = logging.getLogger(__name__)
@@ -49,7 +50,7 @@ class GroupAutofixEndpoint(GroupEndpoint):
4950
}
5051

5152
def _get_serialized_event(
52-
self, event_id: str, group: Group, user: AbstractBaseUser | AnonymousUser
53+
self, event_id: str, group: Group, user: User | RpcUser | AnonymousUser
5354
) -> dict[str, Any] | None:
5455
event = eventstore.backend.get_event_by_id(group.project.id, event_id, group_id=group.id)
5556

Diff for: src/sentry/api/endpoints/group_ai_summary.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import orjson
88
import requests
99
from django.conf import settings
10-
from django.contrib.auth.models import AbstractBaseUser, AnonymousUser
10+
from django.contrib.auth.models import AnonymousUser
1111
from pydantic import BaseModel
1212
from rest_framework.response import Response
1313

@@ -24,6 +24,8 @@
2424
from sentry.models.project import Project
2525
from sentry.seer.signed_seer_api import get_seer_salted_url, sign_with_seer_secret
2626
from sentry.types.ratelimit import RateLimit, RateLimitCategory
27+
from sentry.users.models.user import User
28+
from sentry.users.services.user.model import RpcUser
2729
from sentry.utils.cache import cache
2830

2931
logger = logging.getLogger(__name__)
@@ -59,7 +61,7 @@ class GroupAiSummaryEndpoint(GroupEndpoint):
5961
def _get_event(
6062
self,
6163
group: Group,
62-
user: AbstractBaseUser | AnonymousUser,
64+
user: User | RpcUser | AnonymousUser,
6365
provided_event_id: str | None = None,
6466
) -> tuple[dict[str, Any] | None, GroupEvent | None]:
6567
event = None

Diff for: src/sentry/api/serializers/base.py

+20-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import sentry_sdk
88
from django.contrib.auth.models import AnonymousUser
99

10+
from sentry.users.models.user import User
11+
from sentry.users.services.user.model import RpcUser
12+
1013
logger = logging.getLogger(__name__)
1114

1215
K = TypeVar("K")
@@ -26,7 +29,7 @@ def wrapped(cls: type[K]) -> type[K]:
2629

2730
def serialize(
2831
objects: Any | Sequence[Any],
29-
user: Any | None = None,
32+
user: User | RpcUser | AnonymousUser | None = None,
3033
serializer: Any | None = None,
3134
**kwargs: Any,
3235
) -> Any:
@@ -81,15 +84,19 @@ class Serializer:
8184
"""A Serializer class contains the logic to serialize a specific type of object."""
8285

8386
def __call__(
84-
self, obj: Any, attrs: Mapping[Any, Any], user: Any, **kwargs: Any
87+
self,
88+
obj: Any,
89+
attrs: Mapping[Any, Any],
90+
user: User | RpcUser | AnonymousUser,
91+
**kwargs: Any,
8592
) -> Mapping[str, Any] | None:
8693
"""See documentation for `serialize`."""
8794
if obj is None:
8895
return None
8996
return self._serialize(obj, attrs, user, **kwargs)
9097

9198
def get_attrs(
92-
self, item_list: Sequence[Any], user: Any, **kwargs: Any
99+
self, item_list: Sequence[Any], user: User | RpcUser | AnonymousUser, **kwargs: Any
93100
) -> MutableMapping[Any, Any]:
94101
"""
95102
Fetch all of the associated data needed to serialize the objects in `item_list`.
@@ -102,7 +109,11 @@ def get_attrs(
102109
return {}
103110

104111
def _serialize(
105-
self, obj: Any, attrs: Mapping[Any, Any], user: Any, **kwargs: Any
112+
self,
113+
obj: Any,
114+
attrs: Mapping[Any, Any],
115+
user: User | RpcUser | AnonymousUser,
116+
**kwargs: Any,
106117
) -> Mapping[str, Any] | None:
107118
try:
108119
return self.serialize(obj, attrs, user, **kwargs)
@@ -111,7 +122,11 @@ def _serialize(
111122
return None
112123

113124
def serialize(
114-
self, obj: Any, attrs: Mapping[Any, Any], user: Any, **kwargs: Any
125+
self,
126+
obj: Any,
127+
attrs: Mapping[Any, Any],
128+
user: User | RpcUser | AnonymousUser,
129+
**kwargs: Any,
115130
) -> Mapping[str, Any]:
116131
"""
117132
Convert an arbitrary python object `obj` to an object that only contains primitives.

Diff for: src/sentry/api/serializers/models/organization_member/base.py

+14-5
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
from collections.abc import Mapping, MutableMapping, Sequence
33
from typing import Any
44

5+
from django.contrib.auth.models import AnonymousUser
6+
57
from sentry import roles
68
from sentry.api.serializers import Serializer, register, serialize
79
from sentry.integrations.models.external_actor import ExternalActor
810
from sentry.models.organizationmember import OrganizationMember
911
from sentry.users.models.user import User
10-
from sentry.users.services.user import RpcUser
12+
from sentry.users.services.user.model import RpcUser
1113
from sentry.users.services.user.service import user_service
1214

1315
from .response import OrganizationMemberResponse
@@ -20,7 +22,10 @@ def __init__(self, expand: Sequence[str] | None = None) -> None:
2022
self.expand = expand or []
2123

2224
def get_attrs(
23-
self, item_list: Sequence[OrganizationMember], user: User, **kwargs: Any
25+
self,
26+
item_list: Sequence[OrganizationMember],
27+
user: User | RpcUser | AnonymousUser,
28+
**kwargs: Any,
2429
) -> MutableMapping[OrganizationMember, MutableMapping[str, Any]]:
2530
"""
2631
Fetch all of the associated Users and ExternalActors needed to serialize
@@ -85,19 +90,23 @@ def get_attrs(
8590
return attrs
8691

8792
def serialize(
88-
self, obj: OrganizationMember, attrs: Mapping[str, Any], user: Any, **kwargs: Any
93+
self,
94+
obj: OrganizationMember,
95+
attrs: Mapping[str, Any],
96+
user: User | RpcUser | AnonymousUser,
97+
**kwargs: Any,
8998
) -> OrganizationMemberResponse:
9099
inviter_name = None
91100
if obj.inviter_id:
92101
inviter = attrs["inviter"]
93102
if inviter:
94103
inviter_name = inviter.get_display_name()
95-
user = attrs["user"]
104+
serialized_user = attrs["user"]
96105
email = attrs["email"]
97106
data: OrganizationMemberResponse = {
98107
"id": str(obj.id),
99108
"email": email,
100-
"name": user["name"] if user else email,
109+
"name": serialized_user["name"] if serialized_user else email,
101110
"user": attrs["user"],
102111
"orgRole": obj.role,
103112
"pending": obj.is_pending,

Diff for: src/sentry/api/serializers/models/organization_member/expand/projects.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
from collections.abc import Mapping, MutableMapping, Sequence
33
from typing import Any, cast
44

5+
from django.contrib.auth.models import AnonymousUser
6+
57
from sentry.models.organizationmember import OrganizationMember
68
from sentry.models.organizationmemberteam import OrganizationMemberTeam
79
from sentry.models.projectteam import ProjectTeam
810
from sentry.models.team import TeamStatus
911
from sentry.users.models.user import User
12+
from sentry.users.services.user.model import RpcUser
1013

1114
from ..base import OrganizationMemberSerializer
1215
from ..response import OrganizationMemberWithProjectsResponse
@@ -19,7 +22,10 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
1922
super().__init__(*args, **kwargs)
2023

2124
def get_attrs(
22-
self, item_list: Sequence[OrganizationMember], user: User, **kwargs: Any
25+
self,
26+
item_list: Sequence[OrganizationMember],
27+
user: User | RpcUser | AnonymousUser,
28+
**kwargs: Any,
2329
) -> MutableMapping[OrganizationMember, MutableMapping[str, Any]]:
2430
attrs = super().get_attrs(item_list, user)
2531

Diff for: src/sentry/api/serializers/models/organization_member/expand/roles.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
from collections.abc import Iterable, Mapping, MutableMapping, Sequence
44
from typing import Any, cast
55

6+
from django.contrib.auth.models import AnonymousUser
7+
68
from sentry.api.serializers import serialize
79
from sentry.models.organizationmember import OrganizationMember
810
from sentry.roles import organization_roles, team_roles
911
from sentry.roles.manager import OrganizationRole, Role
1012
from sentry.users.models.user import User
1113
from sentry.users.services.user import UserSerializeType
14+
from sentry.users.services.user.model import RpcUser
1215
from sentry.users.services.user.service import user_service
1316

1417
from ...role import OrganizationRoleSerializer, TeamRoleSerializer
@@ -40,7 +43,10 @@ def __init__(
4043
self.allowed_roles = allowed_roles
4144

4245
def get_attrs(
43-
self, item_list: Sequence[OrganizationMember], user: User, **kwargs: Any
46+
self,
47+
item_list: Sequence[OrganizationMember],
48+
user: User | RpcUser | AnonymousUser,
49+
**kwargs: Any,
4450
) -> MutableMapping[OrganizationMember, MutableMapping[str, Any]]:
4551
result = super().get_attrs(item_list, user, **kwargs)
4652
users_by_id = {
@@ -58,7 +64,7 @@ def serialize(
5864
self,
5965
obj: OrganizationMember,
6066
attrs: Mapping[str, Any],
61-
user: User,
67+
user: User | RpcUser | AnonymousUser,
6268
**kwargs: Any,
6369
) -> OrganizationMemberWithRolesResponse:
6470
context = cast(

Diff for: src/sentry/api/serializers/models/organization_member/expand/teams.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
from collections.abc import Mapping, MutableMapping, Sequence
22
from typing import Any, cast
33

4+
from django.contrib.auth.models import AnonymousUser
5+
46
from sentry.models.organizationmember import OrganizationMember
57
from sentry.users.models.user import User
8+
from sentry.users.services.user.model import RpcUser
69

710
from ..base import OrganizationMemberSerializer
811
from ..response import OrganizationMemberWithTeamsResponse
@@ -11,7 +14,10 @@
1114

1215
class OrganizationMemberWithTeamsSerializer(OrganizationMemberSerializer):
1316
def get_attrs(
14-
self, item_list: Sequence[OrganizationMember], user: User, **kwargs: Any
17+
self,
18+
item_list: Sequence[OrganizationMember],
19+
user: User | RpcUser | AnonymousUser,
20+
**kwargs: Any,
1521
) -> MutableMapping[OrganizationMember, MutableMapping[str, Any]]:
1622
attrs = super().get_attrs(item_list, user)
1723
teams, teams_with_role = get_teams_by_organization_member_id(item_list)
@@ -29,7 +35,11 @@ def get_attrs(
2935
return attrs
3036

3137
def serialize(
32-
self, obj: OrganizationMember, attrs: Mapping[str, Any], user: Any, **kwargs: Any
38+
self,
39+
obj: OrganizationMember,
40+
attrs: Mapping[str, Any],
41+
user: User | RpcUser | AnonymousUser,
42+
**kwargs: Any,
3343
) -> OrganizationMemberWithTeamsResponse:
3444
d = cast(OrganizationMemberWithTeamsResponse, super().serialize(obj, attrs, user))
3545
d["teams"] = attrs.get("teams", []) # Deprecated

Diff for: src/sentry/api/serializers/models/project_template.py

+13-2
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
from enum import StrEnum
55
from typing import Any, TypedDict
66

7+
from django.contrib.auth.models import AnonymousUser
78
from rest_framework import serializers
89

910
from sentry.api.serializers import Serializer, register
1011
from sentry.models.options.project_template_option import TProjectOptions
1112
from sentry.models.projecttemplate import ProjectTemplate
1213
from sentry.users.models.user import User
14+
from sentry.users.services.user import RpcUser
1315

1416

1517
class ProjectTemplateAttributes(StrEnum):
@@ -32,7 +34,12 @@ def __init__(self, expand: Iterable[ProjectTemplateAttributes] | None = None) ->
3234
def _expand(self, key: ProjectTemplateAttributes) -> bool:
3335
return self.expand is not None and key in self.expand
3436

35-
def get_attrs(self, item_list: Sequence[ProjectTemplate], user: User, **kwargs: Any):
37+
def get_attrs(
38+
self,
39+
item_list: Sequence[ProjectTemplate],
40+
user: User | RpcUser | AnonymousUser,
41+
**kwargs: Any,
42+
):
3643
attrs = super().get_attrs(item_list, user, **kwargs)
3744
all_attrs: dict[ProjectTemplate, dict[ProjectTemplateAttributes, Any]] = defaultdict(dict)
3845

@@ -52,7 +59,11 @@ def get_attrs(self, item_list: Sequence[ProjectTemplate], user: User, **kwargs:
5259
return all_attrs
5360

5461
def serialize(
55-
self, obj: ProjectTemplate, attrs: Mapping[str, Any], user: User, **kwargs: Any
62+
self,
63+
obj: ProjectTemplate,
64+
attrs: Mapping[str, Any],
65+
user: User | RpcUser | AnonymousUser,
66+
**kwargs: Any,
5667
) -> SerializedProjectTemplate:
5768
response: SerializedProjectTemplate = {
5869
"id": obj.id,

Diff for: src/sentry/api/serializers/models/relocation.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from collections.abc import Mapping, MutableMapping, Sequence
33
from typing import Any
44

5+
from django.contrib.auth.models import AnonymousUser
56
from django.db.models import QuerySet
67

78
from sentry.api.serializers import Serializer, register
@@ -46,7 +47,7 @@ def serialize(
4647
self,
4748
obj: Relocation,
4849
attrs: Any,
49-
user: User,
50+
user: User | RpcUser | AnonymousUser,
5051
**kwargs: Any,
5152
) -> Mapping[str, Any]:
5253
scheduled_at_pause_step = (
@@ -109,7 +110,7 @@ def serialize(
109110
}
110111

111112
def get_attrs(
112-
self, item_list: Sequence[Relocation], user: User, **kwargs: Any
113+
self, item_list: Sequence[Relocation], user: User | RpcUser | AnonymousUser, **kwargs: Any
113114
) -> MutableMapping[Relocation, RelocationMetadata]:
114115
metadata_map = {}
115116
for relocation in item_list:

0 commit comments

Comments
 (0)