Skip to content

Commit 7ce3c57

Browse files
ref(control_silo): Move UserAvatar model to users module
Part of moving control silo user related resources into the users module, this PR does not include an old UserRole import shim as it's not used in getsentry. Includes adding of types for functions. Apart of (#73856)
1 parent 74cc8f6 commit 7ce3c57

File tree

15 files changed

+35
-36
lines changed

15 files changed

+35
-36
lines changed

src/sentry/api/endpoints/avatar/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from sentry.api.base import control_silo_endpoint
88
from sentry.api.bases.avatar import AvatarMixin
99
from sentry.api.bases.user import UserEndpoint
10-
from sentry.models.avatars.user_avatar import UserAvatar
10+
from sentry.users.models.user_avatar import UserAvatar
1111
from sentry.users.services.user.serial import serialize_rpc_user
1212
from sentry.users.services.user.service import user_service
1313

src/sentry/api/serializers/models/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
from sentry.auth.elevated_mode import has_elevated_mode
1919
from sentry.hybridcloud.services.organization_mapping import organization_mapping_service
2020
from sentry.models.authidentity import AuthIdentity
21-
from sentry.models.avatars.user_avatar import UserAvatar
2221
from sentry.models.options.user_option import UserOption
2322
from sentry.models.organization import OrganizationStatus
2423
from sentry.models.organizationmapping import OrganizationMapping
@@ -28,6 +27,7 @@
2827
from sentry.organizations.services.organization import RpcOrganizationSummary
2928
from sentry.users.models.authenticator import Authenticator
3029
from sentry.users.models.user import User
30+
from sentry.users.models.user_avatar import UserAvatar
3131
from sentry.users.models.userrole import UserRoleUser
3232
from sentry.users.services.user import RpcUser
3333
from sentry.utils.avatar import get_gravatar_url

src/sentry/models/avatars/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22
from .control_base import ControlAvatarBase
33
from .organization_avatar import OrganizationAvatar
44
from .sentry_app_avatar import SentryAppAvatar
5-
from .user_avatar import UserAvatar
65

76
__all__ = (
87
"AvatarBase",
98
"ControlAvatarBase",
109
"OrganizationAvatar",
1110
"SentryAppAvatar",
12-
"UserAvatar",
1311
)

src/sentry/notifications/utils/avatar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from django.utils.html import format_html
55
from django.utils.safestring import SafeString
66

7-
from sentry.models.avatars.user_avatar import UserAvatar
87
from sentry.users.models.user import User
8+
from sentry.users.models.user_avatar import UserAvatar
99
from sentry.users.services.user import RpcUser
1010
from sentry.utils.assets import get_asset_url
1111
from sentry.utils.avatar import get_email_avatar

src/sentry/testutils/factories.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@
8383
from sentry.models.authidentity import AuthIdentity
8484
from sentry.models.authprovider import AuthProvider
8585
from sentry.models.avatars.sentry_app_avatar import SentryAppAvatar
86-
from sentry.models.avatars.user_avatar import UserAvatar
8786
from sentry.models.commit import Commit
8887
from sentry.models.commitauthor import CommitAuthor
8988
from sentry.models.commitfilechange import CommitFileChange
@@ -167,6 +166,7 @@
167166
UptimeSubscription,
168167
)
169168
from sentry.users.models.user import User
169+
from sentry.users.models.user_avatar import UserAvatar
170170
from sentry.users.models.userrole import UserRole
171171
from sentry.users.services.user import RpcUser
172172
from sentry.utils import loremipsum

src/sentry/users/models/user.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
from sentry.hybridcloud.outbox.category import OutboxCategory
4242
from sentry.integrations.types import EXTERNAL_PROVIDERS, ExternalProviders
4343
from sentry.locks import locks
44-
from sentry.models.avatars import UserAvatar
4544
from sentry.models.lostpasswordhash import LostPasswordHash
4645
from sentry.models.organizationmapping import OrganizationMapping
4746
from sentry.models.organizationmembermapping import OrganizationMemberMapping
@@ -50,6 +49,7 @@
5049
from sentry.organizations.services.organization import RpcRegionUser, organization_service
5150
from sentry.types.region import find_all_region_names, find_regions_for_user
5251
from sentry.users.models.authenticator import Authenticator
52+
from sentry.users.models.user_avatar import UserAvatar
5353
from sentry.users.services.user import RpcUser
5454
from sentry.utils.http import absolute_uri
5555
from sentry.utils.retries import TimedRetryPolicy
@@ -337,12 +337,12 @@ def merge_to(from_user: User, to_user: User) -> None:
337337
# TODO: we could discover relations automatically and make this useful
338338
from sentry.models.auditlogentry import AuditLogEntry
339339
from sentry.models.authidentity import AuthIdentity
340-
from sentry.models.avatars.user_avatar import UserAvatar
341340
from sentry.models.identity import Identity
342341
from sentry.models.options.user_option import UserOption
343342
from sentry.models.organizationmembermapping import OrganizationMemberMapping
344343
from sentry.models.useremail import UserEmail
345344
from sentry.users.models.authenticator import Authenticator
345+
from sentry.users.models.user_avatar import UserAvatar
346346

347347
from_user_id = from_user.id
348348
to_user_id = to_user.id

src/sentry/models/avatars/user_avatar.py renamed to src/sentry/users/models/user_avatar.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import contextlib
4+
from collections.abc import Generator
45
from enum import IntEnum
56
from typing import Any, ClassVar, Self
67

@@ -10,17 +11,16 @@
1011
from sentry.db.models.manager.base import BaseManager
1112
from sentry.hybridcloud.models.outbox import ControlOutboxBase
1213
from sentry.hybridcloud.outbox.category import OutboxCategory
14+
from sentry.models.avatars import ControlAvatarBase
1315
from sentry.types.region import find_regions_for_user
1416

15-
from . import ControlAvatarBase
16-
1717

1818
class UserAvatarType(IntEnum):
1919
LETTER_AVATAR = 0
2020
UPLOAD = 1
2121
GRAVATAR = 2
2222

23-
def api_name(self):
23+
def api_name(self) -> str:
2424
return self.name.lower()
2525

2626
@classmethod
@@ -63,7 +63,7 @@ def outboxes_for_update(self, shard_identifier: int | None = None) -> list[Contr
6363
)
6464

6565
@contextlib.contextmanager
66-
def _maybe_prepare_outboxes(self, *, outbox_before_super: bool):
66+
def _maybe_prepare_outboxes(self, *, outbox_before_super: bool) -> Generator[None]:
6767
from sentry.hybridcloud.models.outbox import outbox_context
6868

6969
with outbox_context(
@@ -88,5 +88,5 @@ def delete(self, *args: Any, **kwds: Any) -> tuple[int, dict[str, Any]]:
8888
with self._maybe_prepare_outboxes(outbox_before_super=True):
8989
return super().delete(*args, **kwds)
9090

91-
def get_cache_key(self, size):
91+
def get_cache_key(self, size: int) -> str:
9292
return f"avatar:{self.user_id}:{size}"

src/sentry/users/services/user/serial.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from django.utils.functional import LazyObject
77

88
from sentry.db.models.manager.base_query_set import BaseQuerySet
9-
from sentry.models.avatars.user_avatar import UserAvatar
109
from sentry.users.models.user import User
10+
from sentry.users.models.user_avatar import UserAvatar
1111
from sentry.users.services.user import (
1212
RpcAuthenticator,
1313
RpcAvatar,

src/sentry/web/frontend/user_avatar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sentry.models.avatars.user_avatar import UserAvatar
1+
from sentry.users.models.user_avatar import UserAvatar
22
from sentry.web.frontend.base import AvatarPhotoView, control_silo_view
33

44

tests/sentry/api/endpoints/test_user_avatar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
from django.urls import reverse
55

66
from sentry import options as options_store
7-
from sentry.models.avatars.user_avatar import UserAvatar, UserAvatarType
87
from sentry.models.files import ControlFile, File
98
from sentry.silo.base import SiloMode
109
from sentry.testutils.cases import APITestCase
1110
from sentry.testutils.silo import assume_test_silo_mode, control_silo_test
11+
from sentry.users.models.user_avatar import UserAvatar, UserAvatarType
1212

1313

1414
@control_silo_test

tests/sentry/api/serializers/test_user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
from sentry.auth.authenticators import available_authenticators
44
from sentry.models.authidentity import AuthIdentity
55
from sentry.models.authprovider import AuthProvider
6-
from sentry.models.avatars.user_avatar import UserAvatar
76
from sentry.models.useremail import UserEmail
87
from sentry.models.userpermission import UserPermission
98
from sentry.testutils.cases import TestCase
109
from sentry.testutils.silo import control_silo_test
1110
from sentry.users.models.authenticator import Authenticator
11+
from sentry.users.models.user_avatar import UserAvatar
1212

1313

1414
@control_silo_test
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from sentry.models.avatars.organization_avatar import OrganizationAvatar
2+
from sentry.models.files.file import File
3+
from sentry.testutils.cases import TestCase
4+
5+
6+
class OrganizationAvatarTestCase(TestCase):
7+
def test_set_null(self):
8+
org = self.create_organization()
9+
afile = File.objects.create(name="avatar.png", type=OrganizationAvatar.FILE_TYPE)
10+
avatar = OrganizationAvatar.objects.create(organization=org, file_id=afile.id)
11+
12+
assert avatar.get_file() == afile
13+
14+
afile.delete()
15+
assert avatar.get_file() is None
16+
assert OrganizationAvatar.objects.get(id=avatar.id).file_id is None
17+
assert OrganizationAvatar.objects.get(id=avatar.id).get_file() is None

tests/sentry/models/test_projectownership.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from unittest.mock import patch
22

3-
from sentry.models.avatars.user_avatar import UserAvatar
43
from sentry.models.groupassignee import GroupAssignee
54
from sentry.models.groupowner import GroupOwner, GroupOwnerType, OwnerRuleType
65
from sentry.models.projectownership import ProjectOwnership
@@ -11,6 +10,7 @@
1110
from sentry.testutils.silo import assume_test_silo_mode_of
1211
from sentry.testutils.skips import requires_snuba
1312
from sentry.types.actor import Actor, ActorType
13+
from sentry.users.models.user_avatar import UserAvatar
1414
from sentry.users.services.user.service import user_service
1515

1616
pytestmark = requires_snuba
Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
from sentry import options as options_store
2-
from sentry.models.avatars.organization_avatar import OrganizationAvatar
3-
from sentry.models.avatars.user_avatar import UserAvatar
42
from sentry.models.files.control_file import ControlFile
5-
from sentry.models.files.file import File
63
from sentry.testutils.cases import TestCase
74
from sentry.testutils.silo import control_silo_test
5+
from sentry.users.models.user_avatar import UserAvatar
86

97

108
@control_silo_test
@@ -26,17 +24,3 @@ def test_set_null(self):
2624
assert avatar.get_file() is None
2725
assert UserAvatar.objects.get(id=avatar.id).control_file_id is None
2826
assert UserAvatar.objects.get(id=avatar.id).get_file() is None
29-
30-
31-
class OrganizationAvatarTestCase(TestCase):
32-
def test_set_null(self):
33-
org = self.create_organization()
34-
afile = File.objects.create(name="avatar.png", type=OrganizationAvatar.FILE_TYPE)
35-
avatar = OrganizationAvatar.objects.create(organization=org, file_id=afile.id)
36-
37-
assert avatar.get_file() == afile
38-
39-
afile.delete()
40-
assert avatar.get_file() is None
41-
assert OrganizationAvatar.objects.get(id=avatar.id).file_id is None
42-
assert OrganizationAvatar.objects.get(id=avatar.id).get_file() is None

tests/sentry/web/frontend/test_user_avatar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
from django.urls import reverse
44

5-
from sentry.models.avatars.user_avatar import UserAvatar
65
from sentry.models.files.control_file import ControlFile
76
from sentry.testutils.cases import TestCase
87
from sentry.testutils.silo import control_silo_test
8+
from sentry.users.models.user_avatar import UserAvatar
99
from sentry.web.frontend.generic import FOREVER_CACHE
1010

1111

0 commit comments

Comments
 (0)