Просмотр исходного кода

ref(models): Combine option models into a submodule (#31615)

Marcos Gaeta 3 лет назад
Родитель
Сommit
95355a8206

+ 1 - 3
mypy.ini

@@ -43,9 +43,7 @@ files = src/sentry/analytics/,
         src/sentry/mail/notifications.py,
         src/sentry/models/debugfile.py,
         src/sentry/models/groupsubscription.py,
-        src/sentry/models/organizationoption.py,
-        src/sentry/models/projectoption.py,
-        src/sentry/models/useroption.py,
+        src/sentry/models/options/,
         src/sentry/notifications/,
         src/sentry/processing/realtime_metrics/,
         src/sentry/ratelimits/,

+ 1 - 1
src/sentry/ingest/inbound_filters.py

@@ -2,7 +2,7 @@ from rest_framework import serializers
 
 from sentry import tsdb
 from sentry.api.fields.multiplechoice import MultipleChoiceField
-from sentry.models.projectoption import ProjectOption
+from sentry.models import ProjectOption
 from sentry.relay.utils import to_camel_case_name
 from sentry.signals import inbound_filter_toggled
 

+ 1 - 2
src/sentry/integrations/mixins/issues.py

@@ -6,8 +6,7 @@ from collections import defaultdict
 from typing import Any, Mapping, Sequence
 
 from sentry.integrations.utils import where_should_sync
-from sentry.models import ExternalIssue, GroupLink, User
-from sentry.models.useroption import UserOption
+from sentry.models import ExternalIssue, GroupLink, User, UserOption
 from sentry.shared_integrations.exceptions import ApiError, IntegrationError
 from sentry.tasks.integrations import sync_status_inbound as sync_status_inbound_task
 from sentry.utils.compat import filter

+ 1 - 4
src/sentry/models/__init__.py

@@ -68,20 +68,18 @@ from .monitor import *  # NOQA
 from .monitorcheckin import *  # NOQA
 from .monitorlocation import *  # NOQA
 from .notificationsetting import *  # NOQA
-from .option import *  # NOQA
+from .options import *  # NOQA
 from .organization import *  # NOQA
 from .organizationaccessrequest import *  # NOQA
 from .organizationmember import *  # NOQA
 from .organizationmemberteam import *  # NOQA
 from .organizationonboardingtask import *  # NOQA
-from .organizationoption import *  # NOQA
 from .platformexternalissue import *  # NOQA
 from .processingissue import *  # NOQA
 from .project import *  # NOQA
 from .projectbookmark import *  # NOQA
 from .projectcodeowners import *  # NOQA
 from .projectkey import *  # NOQA
-from .projectoption import *  # NOQA
 from .projectownership import *  # NOQA
 from .projectplatform import *  # NOQA
 from .projectredirect import *  # NOQA
@@ -115,7 +113,6 @@ from .transaction_threshold import *  # NOQA
 from .user import *  # NOQA
 from .useremail import *  # NOQA
 from .userip import *  # NOQA
-from .useroption import *  # NOQA
 from .userpermission import *  # NOQA
 from .userreport import *  # NOQA
 from .userrole import *  # NOQA

+ 11 - 0
src/sentry/models/options/__init__.py

@@ -0,0 +1,11 @@
+from .option import Option
+from .organization_option import OrganizationOption
+from .project_option import ProjectOption
+from .user_option import UserOption
+
+__all__ = (
+    "Option",
+    "OrganizationOption",
+    "ProjectOption",
+    "UserOption",
+)

+ 1 - 1
src/sentry/models/option.py → src/sentry/models/options/option.py

@@ -5,7 +5,7 @@ from sentry.db.models import Model, sane_repr
 from sentry.db.models.fields import EncryptedPickledObjectField
 
 
-class Option(Model):
+class Option(Model):  # type: ignore
     """
     Global options which apply in most situations as defaults,
     and generally can be overwritten by per-project options.

+ 11 - 9
src/sentry/models/organizationoption.py → src/sentry/models/options/organization_option.py

@@ -1,4 +1,6 @@
-from typing import TYPE_CHECKING, Any, Mapping, Optional, Sequence
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Mapping, Sequence
 
 from django.db import models
 
@@ -14,8 +16,8 @@ if TYPE_CHECKING:
 
 class OrganizationOptionManager(OptionManager["Organization"]):
     def get_value_bulk(
-        self, instances: Sequence["Organization"], key: str
-    ) -> Mapping["Organization", Any]:
+        self, instances: Sequence[Organization], key: str
+    ) -> Mapping[Organization, Any]:
         instance_map = {i.id: i for i in instances}
         queryset = self.filter(organization__in=instances, key=key)
         result = {i: None for i in instances}
@@ -24,12 +26,12 @@ class OrganizationOptionManager(OptionManager["Organization"]):
         return result
 
     def get_value(
-        self, organization: "Organization", key: str, default: Optional[Value] = None
+        self, organization: Organization, key: str, default: Value | None = None
     ) -> Value:
         result = self.get_all_values(organization)
         return result.get(key, default)
 
-    def unset_value(self, organization: "Organization", key: str) -> None:
+    def unset_value(self, organization: Organization, key: str) -> None:
         try:
             inst = self.get(organization=organization, key=key)
         except self.model.DoesNotExist:
@@ -37,11 +39,11 @@ class OrganizationOptionManager(OptionManager["Organization"]):
         inst.delete()
         self.reload_cache(organization.id, "organizationoption.unset_value")
 
-    def set_value(self, organization: "Organization", key: str, value: Value) -> None:
+    def set_value(self, organization: Organization, key: str, value: Value) -> None:
         self.create_or_update(organization=organization, key=key, values={"value": value})
         self.reload_cache(organization.id, "organizationoption.set_value")
 
-    def get_all_values(self, organization: "Organization") -> Mapping[str, Value]:
+    def get_all_values(self, organization: Organization) -> Mapping[str, Value]:
         if isinstance(organization, models.Model):
             organization_id = organization.id
         else:
@@ -71,10 +73,10 @@ class OrganizationOptionManager(OptionManager["Organization"]):
         self._option_cache[cache_key] = result
         return result
 
-    def post_save(self, instance: "OrganizationOption", **kwargs: Any) -> None:
+    def post_save(self, instance: OrganizationOption, **kwargs: Any) -> None:
         self.reload_cache(instance.organization_id, "organizationoption.post_save")
 
-    def post_delete(self, instance: "OrganizationOption", **kwargs: Any) -> None:
+    def post_delete(self, instance: OrganizationOption, **kwargs: Any) -> None:
         self.reload_cache(instance.organization_id, "organizationoption.post_delete")
 
 

+ 12 - 10
src/sentry/models/projectoption.py → src/sentry/models/options/project_option.py

@@ -1,4 +1,6 @@
-from typing import TYPE_CHECKING, Any, Mapping, Optional, Sequence
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Mapping, Sequence
 
 from django.db import models
 
@@ -14,7 +16,7 @@ if TYPE_CHECKING:
 
 
 class ProjectOptionManager(OptionManager["Project"]):
-    def get_value_bulk(self, instances: Sequence["Project"], key: str) -> Mapping["Project", Any]:
+    def get_value_bulk(self, instances: Sequence[Project], key: str) -> Mapping[Project, Any]:
         instance_map = {i.id: i for i in instances}
         queryset = self.filter(project__in=instances, key=key)
         result = {i: None for i in instances}
@@ -24,10 +26,10 @@ class ProjectOptionManager(OptionManager["Project"]):
 
     def get_value(
         self,
-        project: "Project",
+        project: Project,
         key: str,
-        default: Optional[Value] = None,
-        validate: Optional[ValidateFunction] = None,
+        default: Value | None = None,
+        validate: ValidateFunction | None = None,
     ) -> Any:
         result = self.get_all_values(project)
         if key in result:
@@ -39,11 +41,11 @@ class ProjectOptionManager(OptionManager["Project"]):
                 return well_known_key.get_default(project)
         return default
 
-    def unset_value(self, project: "Project", key: str) -> None:
+    def unset_value(self, project: Project, key: str) -> None:
         self.filter(project=project, key=key).delete()
         self.reload_cache(project.id, "projectoption.unset_value")
 
-    def set_value(self, project: "Project", key: str, value: Value) -> bool:
+    def set_value(self, project: Project, key: str, value: Value) -> bool:
         inst, created = self.create_or_update(project=project, key=key, values={"value": value})
         self.reload_cache(project.id, "projectoption.set_value")
 
@@ -51,7 +53,7 @@ class ProjectOptionManager(OptionManager["Project"]):
         success: bool = created or inst > 0
         return success
 
-    def get_all_values(self, project: "Project") -> Mapping[str, Value]:
+    def get_all_values(self, project: Project) -> Mapping[str, Value]:
         if isinstance(project, models.Model):
             project_id = project.id
         else:
@@ -80,10 +82,10 @@ class ProjectOptionManager(OptionManager["Project"]):
         self._option_cache[cache_key] = result
         return result
 
-    def post_save(self, instance: "ProjectOption", **kwargs: Any) -> None:
+    def post_save(self, instance: ProjectOption, **kwargs: Any) -> None:
         self.reload_cache(instance.project_id, "projectoption.post_save")
 
-    def post_delete(self, instance: "ProjectOption", **kwargs: Any) -> None:
+    def post_delete(self, instance: ProjectOption, **kwargs: Any) -> None:
         self.reload_cache(instance.project_id, "projectoption.post_delete")
 
 

+ 14 - 14
src/sentry/models/useroption.py → src/sentry/models/options/user_option.py

@@ -1,4 +1,6 @@
-from typing import TYPE_CHECKING, Any, Mapping, Optional
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Mapping
 
 from django.conf import settings
 from django.db import models
@@ -17,9 +19,9 @@ option_scope_error = "this is not a supported use case, scope to project OR orga
 class UserOptionManager(OptionManager["User"]):
     def _make_key(
         self,
-        user: "User",
-        project: Optional["Project"] = None,
-        organization: Optional["Organization"] = None,
+        user: User,
+        project: Project | None = None,
+        organization: Organization | None = None,
     ) -> str:
         if project:
             metakey = f"{user.pk}:{project.id}:project"
@@ -32,9 +34,7 @@ class UserOptionManager(OptionManager["User"]):
         key: str = super()._make_key(metakey)
         return key
 
-    def get_value(
-        self, user: "User", key: str, default: Optional[Value] = None, **kwargs: Any
-    ) -> Value:
+    def get_value(self, user: User, key: str, default: Value | None = None, **kwargs: Any) -> Value:
         project = kwargs.get("project")
         organization = kwargs.get("organization")
 
@@ -46,7 +46,7 @@ class UserOptionManager(OptionManager["User"]):
             result = self.get_all_values(user, project)
         return result.get(key, default)
 
-    def unset_value(self, user: "User", project: "Project", key: str) -> None:
+    def unset_value(self, user: User, project: Project, key: str) -> None:
         """
         This isn't implemented for user-organization scoped options yet, because it hasn't been needed.
         """
@@ -61,7 +61,7 @@ class UserOptionManager(OptionManager["User"]):
             return
         self._option_cache[metakey].pop(key, None)
 
-    def set_value(self, user: "User", key: str, value: Value, **kwargs: Any) -> None:
+    def set_value(self, user: User, key: str, value: Value, **kwargs: Any) -> None:
         project = kwargs.get("project")
         organization = kwargs.get("organization")
 
@@ -86,9 +86,9 @@ class UserOptionManager(OptionManager["User"]):
 
     def get_all_values(
         self,
-        user: "User",
-        project: Optional["Project"] = None,
-        organization: Optional["Organization"] = None,
+        user: User,
+        project: Project | None = None,
+        organization: Organization | None = None,
         force_reload: bool = False,
     ) -> Mapping[str, Value]:
         if organization and project:
@@ -107,12 +107,12 @@ class UserOptionManager(OptionManager["User"]):
         values: Mapping[str, Value] = self._option_cache.get(metakey, {})
         return values
 
-    def post_save(self, instance: "UserOption", **kwargs: Any) -> None:
+    def post_save(self, instance: UserOption, **kwargs: Any) -> None:
         self.get_all_values(
             instance.user, instance.project, instance.organization, force_reload=True
         )
 
-    def post_delete(self, instance: "UserOption", **kwargs: Any) -> None:
+    def post_delete(self, instance: UserOption, **kwargs: Any) -> None:
         self.get_all_values(
             instance.user, instance.project, instance.organization, force_reload=True
         )

+ 1 - 1
src/sentry/options/store.py

@@ -45,7 +45,7 @@ class OptionsStore:
 
     @cached_property
     def model(self):
-        from sentry.models.option import Option
+        from sentry.models.options import Option
 
         return Option
 

Некоторые файлы не были показаны из-за большого количества измененных файлов