Skip to content

ref(control_silo): Move UserAvatar model to users module #76190

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
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
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/avatar/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from sentry.api.base import control_silo_endpoint
from sentry.api.bases.avatar import AvatarMixin
from sentry.api.bases.user import UserEndpoint
from sentry.models.avatars.user_avatar import UserAvatar
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.services.user.serial import serialize_rpc_user
from sentry.users.services.user.service import user_service

Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/serializers/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@
from sentry.auth.elevated_mode import has_elevated_mode
from sentry.hybridcloud.services.organization_mapping import organization_mapping_service
from sentry.models.authidentity import AuthIdentity
from sentry.models.avatars.user_avatar import UserAvatar
from sentry.models.organization import OrganizationStatus
from sentry.models.organizationmapping import OrganizationMapping
from sentry.models.organizationmembermapping import OrganizationMemberMapping
from sentry.organizations.services.organization import RpcOrganizationSummary
from sentry.users.models.authenticator import Authenticator
from sentry.users.models.user import User
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.models.user_option import UserOption
from sentry.users.models.useremail import UserEmail
from sentry.users.models.userpermission import UserPermission
Expand Down
2 changes: 0 additions & 2 deletions src/sentry/models/avatars/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@
from .control_base import ControlAvatarBase
from .organization_avatar import OrganizationAvatar
from .sentry_app_avatar import SentryAppAvatar
from .user_avatar import UserAvatar

__all__ = (
"AvatarBase",
"ControlAvatarBase",
"OrganizationAvatar",
"SentryAppAvatar",
"UserAvatar",
)
2 changes: 1 addition & 1 deletion src/sentry/notifications/utils/avatar.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
from django.utils.html import format_html
from django.utils.safestring import SafeString

from sentry.models.avatars.user_avatar import UserAvatar
from sentry.users.models.user import User
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.services.user import RpcUser
from sentry.utils.assets import get_asset_url
from sentry.utils.avatar import get_email_avatar
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/testutils/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@
from sentry.models.authidentity import AuthIdentity
from sentry.models.authprovider import AuthProvider
from sentry.models.avatars.sentry_app_avatar import SentryAppAvatar
from sentry.models.avatars.user_avatar import UserAvatar
from sentry.models.commit import Commit
from sentry.models.commitauthor import CommitAuthor
from sentry.models.commitfilechange import CommitFileChange
Expand Down Expand Up @@ -164,6 +163,7 @@
UptimeSubscription,
)
from sentry.users.models.user import User
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.models.user_option import UserOption
from sentry.users.models.useremail import UserEmail
from sentry.users.models.userpermission import UserPermission
Expand Down
4 changes: 2 additions & 2 deletions src/sentry/users/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,14 @@
from sentry.hybridcloud.outbox.category import OutboxCategory
from sentry.integrations.types import EXTERNAL_PROVIDERS, ExternalProviders
from sentry.locks import locks
from sentry.models.avatars import UserAvatar
from sentry.models.lostpasswordhash import LostPasswordHash
from sentry.models.organizationmapping import OrganizationMapping
from sentry.models.organizationmembermapping import OrganizationMemberMapping
from sentry.models.orgauthtoken import OrgAuthToken
from sentry.organizations.services.organization import RpcRegionUser, organization_service
from sentry.types.region import find_all_region_names, find_regions_for_user
from sentry.users.models.authenticator import Authenticator
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.models.useremail import UserEmail
from sentry.users.services.user import RpcUser
from sentry.utils.http import absolute_uri
Expand Down Expand Up @@ -337,10 +337,10 @@ def merge_to(from_user: User, to_user: User) -> None:
# TODO: we could discover relations automatically and make this useful
from sentry.models.auditlogentry import AuditLogEntry
from sentry.models.authidentity import AuthIdentity
from sentry.models.avatars.user_avatar import UserAvatar
from sentry.models.identity import Identity
from sentry.models.organizationmembermapping import OrganizationMemberMapping
from sentry.users.models.authenticator import Authenticator
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.models.user_option import UserOption
from sentry.users.models.useremail import UserEmail

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import annotations

import contextlib
from collections.abc import Generator
from enum import IntEnum
from typing import Any, ClassVar, Self

Expand All @@ -10,17 +11,16 @@
from sentry.db.models.manager.base import BaseManager
from sentry.hybridcloud.models.outbox import ControlOutboxBase
from sentry.hybridcloud.outbox.category import OutboxCategory
from sentry.models.avatars import ControlAvatarBase
from sentry.types.region import find_regions_for_user

from . import ControlAvatarBase


class UserAvatarType(IntEnum):
LETTER_AVATAR = 0
UPLOAD = 1
GRAVATAR = 2

def api_name(self):
def api_name(self) -> str:
return self.name.lower()

@classmethod
Expand Down Expand Up @@ -63,7 +63,7 @@ def outboxes_for_update(self, shard_identifier: int | None = None) -> list[Contr
)

@contextlib.contextmanager
def _maybe_prepare_outboxes(self, *, outbox_before_super: bool):
def _maybe_prepare_outboxes(self, *, outbox_before_super: bool) -> Generator[None]:
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not rlly familiar with the convention here, should this be `Generator[None, None, None] from following this, or does it not matter ?

Copy link
Member

Choose a reason for hiding this comment

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

Generator[None] is the simpler form and one we should use. Recently all Generator[none, none, none] were updated. See 16b7563

from sentry.hybridcloud.models.outbox import outbox_context

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

def get_cache_key(self, size):
def get_cache_key(self, size: int) -> str:
return f"avatar:{self.user_id}:{size}"
2 changes: 1 addition & 1 deletion src/sentry/users/services/user/impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@
from sentry.hybridcloud.services.organization_mapping.model import RpcOrganizationMapping
from sentry.hybridcloud.services.organization_mapping.serial import serialize_organization_mapping
from sentry.models.authidentity import AuthIdentity
from sentry.models.avatars import UserAvatar
from sentry.models.organization import OrganizationStatus
from sentry.models.organizationmapping import OrganizationMapping
from sentry.models.organizationmembermapping import OrganizationMemberMapping
from sentry.signals import user_signup
from sentry.users.models.user import User
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.models.useremail import UserEmail
from sentry.users.services.user import (
RpcAvatar,
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/users/services/user/serial.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from django.utils.functional import LazyObject

from sentry.db.models.manager.base_query_set import BaseQuerySet
from sentry.models.avatars.user_avatar import UserAvatar
from sentry.users.models.user import User
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.services.user import (
RpcAuthenticator,
RpcAvatar,
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/web/frontend/user_avatar.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from sentry.models.avatars.user_avatar import UserAvatar
from sentry.users.models.user_avatar import UserAvatar
from sentry.web.frontend.base import AvatarPhotoView, control_silo_view


Expand Down
2 changes: 1 addition & 1 deletion tests/sentry/api/endpoints/test_user_avatar.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
from django.urls import reverse

from sentry import options as options_store
from sentry.models.avatars.user_avatar import UserAvatar, UserAvatarType
from sentry.models.files import ControlFile, File
from sentry.silo.base import SiloMode
from sentry.testutils.cases import APITestCase
from sentry.testutils.silo import assume_test_silo_mode, control_silo_test
from sentry.users.models.user_avatar import UserAvatar, UserAvatarType


@control_silo_test
Expand Down
2 changes: 1 addition & 1 deletion tests/sentry/api/serializers/test_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
from sentry.auth.authenticators import available_authenticators
from sentry.models.authidentity import AuthIdentity
from sentry.models.authprovider import AuthProvider
from sentry.models.avatars.user_avatar import UserAvatar
from sentry.testutils.cases import TestCase
from sentry.testutils.silo import control_silo_test
from sentry.users.models.authenticator import Authenticator
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.models.useremail import UserEmail
from sentry.users.models.userpermission import UserPermission

Expand Down
17 changes: 17 additions & 0 deletions tests/sentry/models/test_organization_avatar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from sentry.models.avatars.organization_avatar import OrganizationAvatar
from sentry.models.files.file import File
from sentry.testutils.cases import TestCase


class OrganizationAvatarTestCase(TestCase):
def test_set_null(self):
org = self.create_organization()
afile = File.objects.create(name="avatar.png", type=OrganizationAvatar.FILE_TYPE)
avatar = OrganizationAvatar.objects.create(organization=org, file_id=afile.id)

assert avatar.get_file() == afile

afile.delete()
assert avatar.get_file() is None
assert OrganizationAvatar.objects.get(id=avatar.id).file_id is None
assert OrganizationAvatar.objects.get(id=avatar.id).get_file() is None
2 changes: 1 addition & 1 deletion tests/sentry/models/test_projectownership.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from unittest.mock import patch

from sentry.models.avatars.user_avatar import UserAvatar
from sentry.models.groupassignee import GroupAssignee
from sentry.models.groupowner import GroupOwner, GroupOwnerType, OwnerRuleType
from sentry.models.projectownership import ProjectOwnership
Expand All @@ -11,6 +10,7 @@
from sentry.testutils.silo import assume_test_silo_mode_of
from sentry.testutils.skips import requires_snuba
from sentry.types.actor import Actor, ActorType
from sentry.users.models.user_avatar import UserAvatar
from sentry.users.services.user.service import user_service

pytestmark = requires_snuba
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
from sentry import options as options_store
from sentry.models.avatars.organization_avatar import OrganizationAvatar
from sentry.models.avatars.user_avatar import UserAvatar
from sentry.models.files.control_file import ControlFile
from sentry.models.files.file import File
from sentry.testutils.cases import TestCase
from sentry.testutils.silo import control_silo_test
from sentry.users.models.user_avatar import UserAvatar


@control_silo_test
Expand All @@ -26,17 +24,3 @@ def test_set_null(self):
assert avatar.get_file() is None
assert UserAvatar.objects.get(id=avatar.id).control_file_id is None
assert UserAvatar.objects.get(id=avatar.id).get_file() is None


class OrganizationAvatarTestCase(TestCase):
def test_set_null(self):
org = self.create_organization()
afile = File.objects.create(name="avatar.png", type=OrganizationAvatar.FILE_TYPE)
avatar = OrganizationAvatar.objects.create(organization=org, file_id=afile.id)

assert avatar.get_file() == afile

afile.delete()
assert avatar.get_file() is None
assert OrganizationAvatar.objects.get(id=avatar.id).file_id is None
assert OrganizationAvatar.objects.get(id=avatar.id).get_file() is None
2 changes: 1 addition & 1 deletion tests/sentry/web/frontend/test_user_avatar.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

from django.urls import reverse

from sentry.models.avatars.user_avatar import UserAvatar
from sentry.models.files.control_file import ControlFile
from sentry.testutils.cases import TestCase
from sentry.testutils.silo import control_silo_test
from sentry.users.models.user_avatar import UserAvatar
from sentry.web.frontend.generic import FOREVER_CACHE


Expand Down
Loading