Skip to content

Commit 6e6e69e

Browse files
authored
chore(hybrid-cloud): Add using to various transaction.atomic blocks (#54465)
1 parent 7e76393 commit 6e6e69e

File tree

3 files changed

+39
-37
lines changed

3 files changed

+39
-37
lines changed

src/sentry/api/endpoints/organization_member/__init__.py

+11-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from typing import Collection, List, Tuple
44

5-
from django.db import transaction
5+
from django.db import router, transaction
66
from rest_framework import status
77
from rest_framework.request import Request
88

@@ -22,7 +22,6 @@ class InvalidTeam(SentryAPIException):
2222
message = "The team slug does not match a team in the organization"
2323

2424

25-
@transaction.atomic
2625
def save_team_assignments(
2726
organization_member: OrganizationMember,
2827
teams: List[Team] | None,
@@ -46,13 +45,16 @@ def save_team_assignments(
4645

4746
new_assignments = [(team, team_role_map.get(team.slug, None)) for team in target_teams]
4847

49-
OrganizationMemberTeam.objects.filter(organizationmember=organization_member).delete()
50-
OrganizationMemberTeam.objects.bulk_create(
51-
[
52-
OrganizationMemberTeam(organizationmember=organization_member, team=team, role=role)
53-
for team, role in new_assignments
54-
]
55-
)
48+
with transaction.atomic(router.db_for_write(OrganizationMemberTeam)):
49+
OrganizationMemberTeam.objects.filter(organizationmember=organization_member).delete()
50+
OrganizationMemberTeam.objects.bulk_create(
51+
[
52+
OrganizationMemberTeam(
53+
organizationmember=organization_member, team=team, role=role
54+
)
55+
for team, role in new_assignments
56+
]
57+
)
5658

5759

5860
def can_set_team_role(access: Access, team: Team, new_role: TeamRole) -> bool:

src/sentry/auth/helper.py

+20-20
Original file line numberDiff line numberDiff line change
@@ -967,31 +967,31 @@ def disable_2fa_required(self) -> None:
967967
)
968968

969969

970-
@transaction.atomic
971970
def EnablePartnerSSO(provider_key, sentry_org, provider_config):
972971
"""
973972
Simplified abstraction from AuthHelper for enabling an SSO AuthProvider for a Sentry organization.
974973
Fires appropriate Audit Log and signal emitter for SSO Enabled
975974
"""
976-
provider_model = AuthProvider.objects.create(
977-
organization_id=sentry_org.id, provider=provider_key, config=provider_config
978-
)
979-
980-
# TODO: Analytics requires a user id
981-
# At provisioning time, no user is available so we cannot provide any user
982-
# sso_enabled.send_robust(
983-
# organization=sentry_org,
984-
# provider=provider_key,
985-
# sender="EnablePartnerSSO",
986-
# )
987-
988-
AuditLogEntry.objects.create(
989-
organization_id=sentry_org.id,
990-
actor_label=f"partner_provisioning_api:{provider_key}",
991-
target_object=provider_model.id,
992-
event=audit_log.get_event_id("SSO_ENABLE"),
993-
data=provider_model.get_audit_log_data(),
994-
)
975+
with transaction.atomic(router.db_for_write(AuthProvider)):
976+
provider_model = AuthProvider.objects.create(
977+
organization_id=sentry_org.id, provider=provider_key, config=provider_config
978+
)
979+
980+
# TODO: Analytics requires a user id
981+
# At provisioning time, no user is available so we cannot provide any user
982+
# sso_enabled.send_robust(
983+
# organization=sentry_org,
984+
# provider=provider_key,
985+
# sender="EnablePartnerSSO",
986+
# )
987+
988+
AuditLogEntry.objects.create(
989+
organization_id=sentry_org.id,
990+
actor_label=f"partner_provisioning_api:{provider_key}",
991+
target_object=provider_model.id,
992+
event=audit_log.get_event_id("SSO_ENABLE"),
993+
data=provider_model.get_audit_log_data(),
994+
)
995995

996996

997997
CHANNEL_PROVIDER_MAP = {ChannelName.FLY_IO.value: FlyOAuth2Provider}

src/sentry/web/frontend/accounts.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,6 @@ def confirm_email(request, user_id, hash):
227227
@csrf_protect
228228
@never_cache
229229
@signed_auth_required
230-
@transaction.atomic
231230
def email_unsubscribe_project(request, project_id):
232231
# For now we only support getting here from the signed link.
233232
if not request.user_from_signed_request:
@@ -239,13 +238,14 @@ def email_unsubscribe_project(request, project_id):
239238

240239
if request.method == "POST":
241240
if "cancel" not in request.POST:
242-
NotificationSetting.objects.update_settings(
243-
ExternalProviders.EMAIL,
244-
NotificationSettingTypes.ISSUE_ALERTS,
245-
NotificationSettingOptionValues.NEVER,
246-
user_id=request.user.id,
247-
project=project,
248-
)
241+
with transaction.atomic(router.db_for_write(NotificationSetting)):
242+
NotificationSetting.objects.update_settings(
243+
ExternalProviders.EMAIL,
244+
NotificationSettingTypes.ISSUE_ALERTS,
245+
NotificationSettingOptionValues.NEVER,
246+
user_id=request.user.id,
247+
project=project,
248+
)
249249
return HttpResponseRedirect(auth.get_login_url())
250250

251251
context = csrf(request)

0 commit comments

Comments
 (0)