Skip to content

Commit e07587f

Browse files
ref: remove EnvironmentMixin (#89313)
<!-- Describe your PR here. -->
1 parent ebc567a commit e07587f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+164
-172
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ module = [
187187
"sentry.api.endpoints.release_thresholds.health_checks.*",
188188
"sentry.api.event_search",
189189
"sentry.api.helpers.deprecation",
190+
"sentry.api.helpers.environments",
190191
"sentry.api.helpers.group_index.update",
191192
"sentry.api.helpers.source_map_helper",
192193
"sentry.api.permissions",

src/sentry/api/base.py

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
from sentry.auth import access
3232
from sentry.auth.staff import has_staff_option
3333
from sentry.middleware import is_frontend_request
34-
from sentry.models.environment import Environment
3534
from sentry.organizations.absolute_url import generate_organization_url
3635
from sentry.ratelimits.config import DEFAULT_RATE_LIMIT_CONFIG, RateLimitConfig
3736
from sentry.silo.base import SiloLimit, SiloMode
@@ -70,7 +69,6 @@
7069

7170
__all__ = [
7271
"Endpoint",
73-
"EnvironmentMixin",
7472
"StatsMixin",
7573
"control_silo_endpoint",
7674
"region_silo_endpoint",
@@ -567,47 +565,6 @@ def get_request_source(self, request: Request) -> QuerySource:
567565
return QuerySource.API
568566

569567

570-
class EnvironmentMixin:
571-
def _get_environment_func(
572-
self, request: Request, organization_id: int
573-
) -> Callable[[], Environment | None]:
574-
"""\
575-
Creates a function that when called returns the ``Environment``
576-
associated with a request object, or ``None`` if no environment was
577-
provided. If the environment doesn't exist, an ``Environment.DoesNotExist``
578-
exception will be raised.
579-
580-
This returns as a callable since some objects outside of the API
581-
endpoint need to handle the "environment was provided but does not
582-
exist" state in addition to the two non-exceptional states (the
583-
environment was provided and exists, or the environment was not
584-
provided.)
585-
"""
586-
return functools.partial(self._get_environment_from_request, request, organization_id)
587-
588-
def _get_environment_id_from_request(
589-
self, request: Request, organization_id: int
590-
) -> int | None:
591-
environment = self._get_environment_from_request(request, organization_id)
592-
return environment.id if environment is not None else None
593-
594-
def _get_environment_from_request(
595-
self, request: Request, organization_id: int
596-
) -> Environment | None:
597-
if not hasattr(request, "_cached_environment"):
598-
environment_param = request.GET.get("environment")
599-
if environment_param is None:
600-
environment = None
601-
else:
602-
environment = Environment.get_for_organization_id(
603-
name=environment_param, organization_id=organization_id
604-
)
605-
606-
request._cached_environment = environment
607-
608-
return request._cached_environment
609-
610-
611568
class StatsArgsDict(TypedDict):
612569
start: datetime
613570
end: datetime

src/sentry/api/endpoints/group_attachments.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from sentry import features
99
from sentry.api.api_publish_status import ApiPublishStatus
10-
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
10+
from sentry.api.base import region_silo_endpoint
1111
from sentry.api.bases.group import GroupEndpoint
1212
from sentry.api.exceptions import ResourceDoesNotExist
1313
from sentry.api.helpers.environments import get_environments
@@ -69,7 +69,7 @@ def get_event_ids_from_filters(
6969

7070

7171
@region_silo_endpoint
72-
class GroupAttachmentsEndpoint(GroupEndpoint, EnvironmentMixin):
72+
class GroupAttachmentsEndpoint(GroupEndpoint):
7373
publish_status = {
7474
"GET": ApiPublishStatus.PRIVATE,
7575
}

src/sentry/api/endpoints/group_current_release.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from rest_framework.response import Response
44

55
from sentry.api.api_publish_status import ApiPublishStatus
6-
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
6+
from sentry.api.base import region_silo_endpoint
77
from sentry.api.bases import GroupEndpoint
88
from sentry.api.helpers.environments import get_environments
99
from sentry.api.serializers import serialize
@@ -14,7 +14,7 @@
1414

1515

1616
@region_silo_endpoint
17-
class GroupCurrentReleaseEndpoint(GroupEndpoint, EnvironmentMixin):
17+
class GroupCurrentReleaseEndpoint(GroupEndpoint):
1818
publish_status = {
1919
"GET": ApiPublishStatus.PRIVATE,
2020
}

src/sentry/api/endpoints/group_first_last_release.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
from rest_framework.response import Response
33

44
from sentry.api.api_publish_status import ApiPublishStatus
5-
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
5+
from sentry.api.base import region_silo_endpoint
66
from sentry.api.bases import GroupEndpoint
77
from sentry.api.helpers.group_index import get_first_last_release
88
from sentry.types.ratelimit import RateLimit, RateLimitCategory
99

1010

1111
@region_silo_endpoint
12-
class GroupFirstLastReleaseEndpoint(GroupEndpoint, EnvironmentMixin):
12+
class GroupFirstLastReleaseEndpoint(GroupEndpoint):
1313
publish_status = {
1414
"GET": ApiPublishStatus.PRIVATE,
1515
}

src/sentry/api/endpoints/group_stats.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,23 @@
33

44
from sentry import tsdb
55
from sentry.api.api_publish_status import ApiPublishStatus
6-
from sentry.api.base import EnvironmentMixin, StatsMixin, region_silo_endpoint
6+
from sentry.api.base import StatsMixin, region_silo_endpoint
77
from sentry.api.bases.group import GroupEndpoint
88
from sentry.api.exceptions import ResourceDoesNotExist
9+
from sentry.api.helpers.environments import get_environment_id
910
from sentry.models.environment import Environment
1011
from sentry.tsdb.base import TSDBModel
1112

1213

1314
@region_silo_endpoint
14-
class GroupStatsEndpoint(GroupEndpoint, EnvironmentMixin, StatsMixin):
15+
class GroupStatsEndpoint(GroupEndpoint, StatsMixin):
1516
publish_status = {
1617
"GET": ApiPublishStatus.UNKNOWN,
1718
}
1819

1920
def get(self, request: Request, group) -> Response:
2021
try:
21-
environment_id = self._get_environment_id_from_request(
22-
request, group.project.organization_id
23-
)
22+
environment_id = get_environment_id(request, group.project.organization_id)
2423
except Environment.DoesNotExist:
2524
raise ResourceDoesNotExist
2625

src/sentry/api/endpoints/group_tagkey_details.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
from sentry import tagstore
66
from sentry.api.api_owners import ApiOwner
77
from sentry.api.api_publish_status import ApiPublishStatus
8-
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
8+
from sentry.api.base import region_silo_endpoint
99
from sentry.api.bases.group import GroupEndpoint
1010
from sentry.api.exceptions import ResourceDoesNotExist
11+
from sentry.api.helpers.environments import get_environment_id
1112
from sentry.api.serializers import serialize
1213
from sentry.apidocs.constants import (
1314
RESPONSE_BAD_REQUEST,
@@ -24,7 +25,7 @@
2425

2526
@extend_schema(tags=["Events"])
2627
@region_silo_endpoint
27-
class GroupTagKeyDetailsEndpoint(GroupEndpoint, EnvironmentMixin):
28+
class GroupTagKeyDetailsEndpoint(GroupEndpoint):
2829
publish_status = {
2930
"GET": ApiPublishStatus.PUBLIC,
3031
}
@@ -56,9 +57,7 @@ def get(self, request: Request, group, key) -> Response:
5657
lookup_key = tagstore.backend.prefix_reserved_key(key)
5758
tenant_ids = {"organization_id": group.project.organization_id}
5859
try:
59-
environment_id = self._get_environment_id_from_request(
60-
request, group.project.organization_id
61-
)
60+
environment_id = get_environment_id(request, group.project.organization_id)
6261
except Environment.DoesNotExist:
6362
# if the environment doesn't exist then the tag can't possibly exist
6463
raise ResourceDoesNotExist

src/sentry/api/endpoints/group_tagkey_values.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from sentry import analytics, tagstore
66
from sentry.api.api_owners import ApiOwner
77
from sentry.api.api_publish_status import ApiPublishStatus
8-
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
8+
from sentry.api.base import region_silo_endpoint
99
from sentry.api.bases.group import GroupEndpoint
1010
from sentry.api.exceptions import ResourceDoesNotExist
1111
from sentry.api.helpers.environments import get_environments
@@ -25,7 +25,7 @@
2525

2626
@extend_schema(tags=["Events"])
2727
@region_silo_endpoint
28-
class GroupTagKeyValuesEndpoint(GroupEndpoint, EnvironmentMixin):
28+
class GroupTagKeyValuesEndpoint(GroupEndpoint):
2929
publish_status = {
3030
"GET": ApiPublishStatus.PUBLIC,
3131
}

src/sentry/api/endpoints/group_user_reports.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@
22
from rest_framework.response import Response
33

44
from sentry.api.api_publish_status import ApiPublishStatus
5-
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
5+
from sentry.api.base import region_silo_endpoint
66
from sentry.api.bases.group import GroupEndpoint
7+
from sentry.api.helpers.environments import get_environment
78
from sentry.api.paginator import DateTimePaginator
89
from sentry.api.serializers import serialize
910
from sentry.models.environment import Environment
1011
from sentry.models.userreport import UserReport
1112

1213

1314
@region_silo_endpoint
14-
class GroupUserReportsEndpoint(GroupEndpoint, EnvironmentMixin):
15+
class GroupUserReportsEndpoint(GroupEndpoint):
1516
publish_status = {
1617
"GET": ApiPublishStatus.PRIVATE,
1718
}
@@ -29,7 +30,7 @@ def get(self, request: Request, group) -> Response:
2930
"""
3031

3132
try:
32-
environment = self._get_environment_from_request(request, group.organization.id)
33+
environment = get_environment(request, group.organization.id)
3334
except Environment.DoesNotExist:
3435
report_list = UserReport.objects.none()
3536
else:

src/sentry/api/endpoints/organization_events_meta.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77

88
from sentry import features, options, search
99
from sentry.api.api_publish_status import ApiPublishStatus
10-
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
10+
from sentry.api.base import region_silo_endpoint
1111
from sentry.api.bases import (
1212
NoProjects,
1313
OrganizationEventsEndpointBase,
1414
OrganizationEventsV2EndpointBase,
1515
)
1616
from sentry.api.event_search import parse_search_query
17+
from sentry.api.helpers.environments import get_environment_func
1718
from sentry.api.helpers.group_index import build_query_params_from_request
1819
from sentry.api.serializers import serialize
1920
from sentry.api.serializers.models.group import GroupSerializer
@@ -108,7 +109,7 @@ def get(self, request: Request, organization) -> Response:
108109

109110

110111
@region_silo_endpoint
111-
class OrganizationEventsRelatedIssuesEndpoint(OrganizationEventsEndpointBase, EnvironmentMixin):
112+
class OrganizationEventsRelatedIssuesEndpoint(OrganizationEventsEndpointBase):
112113
publish_status = {
113114
"GET": ApiPublishStatus.PRIVATE,
114115
}
@@ -162,9 +163,7 @@ def get(self, request: Request, organization) -> Response:
162163
context = serialize(
163164
results,
164165
request.user,
165-
GroupSerializer(
166-
environment_func=self._get_environment_func(request, organization.id)
167-
),
166+
GroupSerializer(environment_func=get_environment_func(request, organization.id)),
168167
)
169168

170169
return Response(context)

src/sentry/api/endpoints/organization_issues_resolved_in_release.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from sentry.api.api_owners import ApiOwner
55
from sentry.api.api_publish_status import ApiPublishStatus
6-
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
6+
from sentry.api.base import region_silo_endpoint
77
from sentry.api.bases.organization import OrganizationEndpoint, OrganizationPermission
88
from sentry.api.helpers.releases import get_group_ids_resolved_in_release
99
from sentry.api.serializers import serialize
@@ -12,7 +12,7 @@
1212

1313

1414
@region_silo_endpoint
15-
class OrganizationIssuesResolvedInReleaseEndpoint(OrganizationEndpoint, EnvironmentMixin):
15+
class OrganizationIssuesResolvedInReleaseEndpoint(OrganizationEndpoint):
1616
owner = ApiOwner.ISSUES
1717
publish_status = {
1818
"GET": ApiPublishStatus.PRIVATE,

src/sentry/api/endpoints/organization_projects.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
from rest_framework.response import Response
99

1010
from sentry.api.api_publish_status import ApiPublishStatus
11-
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
11+
from sentry.api.base import region_silo_endpoint
1212
from sentry.api.bases.organization import OrganizationAndStaffPermission, OrganizationEndpoint
13+
from sentry.api.helpers.environments import get_environment_id
1314
from sentry.api.paginator import OffsetPaginator
1415
from sentry.api.serializers import serialize
1516
from sentry.api.serializers.models.project import (
@@ -44,7 +45,7 @@ def get_dataset(dataset_label: str) -> Any:
4445

4546
@extend_schema(tags=["Organizations"])
4647
@region_silo_endpoint
47-
class OrganizationProjectsEndpoint(OrganizationEndpoint, EnvironmentMixin):
48+
class OrganizationProjectsEndpoint(OrganizationEndpoint):
4849
publish_status = {
4950
"GET": ApiPublishStatus.PUBLIC,
5051
}
@@ -177,7 +178,7 @@ def get(self, request: Request, organization) -> Response:
177178
expand.add("options")
178179

179180
def serialize_on_result(result):
180-
environment_id = self._get_environment_id_from_request(request, organization.id)
181+
environment_id = get_environment_id(request, organization.id)
181182
serializer = ProjectSummarySerializer(
182183
environment_id=environment_id,
183184
stats_period=stats_period,
@@ -198,7 +199,7 @@ def serialize_on_result(result):
198199

199200

200201
@region_silo_endpoint
201-
class OrganizationProjectsCountEndpoint(OrganizationEndpoint, EnvironmentMixin):
202+
class OrganizationProjectsCountEndpoint(OrganizationEndpoint):
202203
publish_status = {
203204
"GET": ApiPublishStatus.PRIVATE,
204205
}

src/sentry/api/endpoints/organization_releases.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from sentry import analytics, release_health
1414
from sentry.api.api_publish_status import ApiPublishStatus
15-
from sentry.api.base import EnvironmentMixin, ReleaseAnalyticsMixin, region_silo_endpoint
15+
from sentry.api.base import ReleaseAnalyticsMixin, region_silo_endpoint
1616
from sentry.api.bases import NoProjects
1717
from sentry.api.bases.organization import OrganizationReleasesBaseEndpoint
1818
from sentry.api.exceptions import ConflictError, InvalidRepository
@@ -228,9 +228,7 @@ def debounce_update_release_health_data(organization, project_ids: list[int]):
228228

229229

230230
@region_silo_endpoint
231-
class OrganizationReleasesEndpoint(
232-
OrganizationReleasesBaseEndpoint, EnvironmentMixin, ReleaseAnalyticsMixin
233-
):
231+
class OrganizationReleasesEndpoint(OrganizationReleasesBaseEndpoint, ReleaseAnalyticsMixin):
234232
publish_status = {
235233
"GET": ApiPublishStatus.UNKNOWN,
236234
"POST": ApiPublishStatus.UNKNOWN,
@@ -632,7 +630,7 @@ def post(self, request: Request, organization) -> Response:
632630

633631

634632
@region_silo_endpoint
635-
class OrganizationReleasesStatsEndpoint(OrganizationReleasesBaseEndpoint, EnvironmentMixin):
633+
class OrganizationReleasesStatsEndpoint(OrganizationReleasesBaseEndpoint):
636634
publish_status = {
637635
"GET": ApiPublishStatus.UNKNOWN,
638636
}

src/sentry/api/endpoints/organization_stats.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,18 @@
44
from sentry import tsdb
55
from sentry.api.api_owners import ApiOwner
66
from sentry.api.api_publish_status import ApiPublishStatus
7-
from sentry.api.base import EnvironmentMixin, StatsMixin, region_silo_endpoint
7+
from sentry.api.base import StatsMixin, region_silo_endpoint
88
from sentry.api.bases.organization import OrganizationEndpoint
99
from sentry.api.exceptions import ResourceDoesNotExist
10+
from sentry.api.helpers.environments import get_environment_id
1011
from sentry.models.environment import Environment
1112
from sentry.models.project import Project
1213
from sentry.models.team import Team
1314
from sentry.tsdb.base import TSDBModel
1415

1516

1617
@region_silo_endpoint
17-
class OrganizationStatsEndpoint(OrganizationEndpoint, EnvironmentMixin, StatsMixin):
18+
class OrganizationStatsEndpoint(OrganizationEndpoint, StatsMixin):
1819
publish_status = {
1920
# Deprecated APIs remain private until removed
2021
"GET": ApiPublishStatus.PRIVATE,
@@ -91,9 +92,7 @@ def get(self, request: Request, organization) -> Response:
9192
if group == "project":
9293
stat_model = TSDBModel.project
9394
try:
94-
query_kwargs["environment_id"] = self._get_environment_id_from_request(
95-
request, organization.id
96-
)
95+
query_kwargs["environment_id"] = get_environment_id(request, organization.id)
9796
except Environment.DoesNotExist:
9897
raise ResourceDoesNotExist
9998

0 commit comments

Comments
 (0)