Skip to content

Commit 0365345

Browse files
authored
fix(wizard) Fix possibly unbound variable in setup wizard (#59934)
There have been a few UnboundLocalError events captured which wouldn't happen with this approach. Fixes SENTRY-180Q
1 parent 79c6ee3 commit 0365345

File tree

1 file changed

+36
-36
lines changed

1 file changed

+36
-36
lines changed

src/sentry/web/frontend/setup_wizard.py

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from sentry.services.hybrid_cloud.project.service import project_service
2323
from sentry.services.hybrid_cloud.project_key.model import ProjectKeyRole
2424
from sentry.services.hybrid_cloud.project_key.service import project_key_service
25+
from sentry.services.hybrid_cloud.user.model import RpcUser
2526
from sentry.utils.http import absolute_uri
2627
from sentry.utils.security.orgauthtoken_token import (
2728
SystemUrlPrefixMissingException,
@@ -75,58 +76,57 @@ def get(self, request: HttpRequest, wizard_hash) -> HttpResponse:
7576
# responses, but project names/slugs aren't unique across regions which could confuse some users.
7677
# Wizard should display region beside project/orgs or have a step to ask which region.
7778

78-
region_data_map = defaultdict(lambda: defaultdict(list))
7979
# {'us': {'org_ids': [...], 'projects': [...], 'keys': [...]}}
80+
region_data_map = defaultdict(lambda: defaultdict(list))
8081

82+
org_mappings_map = {}
8183
for mapping in org_mappings:
8284
region_data_map[mapping.region_name]["org_ids"].append(mapping.organization_id)
85+
status = OrganizationStatus(mapping.status)
86+
serialized_mapping = {
87+
"id": mapping.organization_id,
88+
"name": mapping.name,
89+
"slug": mapping.slug,
90+
"region": mapping.region_name,
91+
"status": {"id": status.name.lower(), "name": status.label},
92+
}
93+
org_mappings_map[mapping.organization_id] = serialized_mapping
8394

8495
for region_name, region_data in region_data_map.items():
8596
org_ids = region_data["org_ids"]
86-
region_data["projects"] = project_service.get_many_by_organizations(
97+
projects = project_service.get_many_by_organizations(
8798
region_name=region_name, organization_ids=org_ids
8899
)
100+
region_data["projects"] = projects
89101

102+
keys_map = defaultdict(list)
90103
for region_name, region_data in region_data_map.items():
91104
project_ids = [rpc_project.id for rpc_project in region_data["projects"]]
92-
region_data["keys"] = project_key_service.get_project_keys_by_region(
105+
keys = project_key_service.get_project_keys_by_region(
93106
region_name=region_name,
94107
project_ids=project_ids,
95108
role=ProjectKeyRole.store,
96109
)
97-
98-
org_mappings_map = {}
99-
for mapping in org_mappings:
100-
status = OrganizationStatus(mapping.status)
101-
serialized_mapping = {
102-
"id": mapping.organization_id,
103-
"name": mapping.name,
104-
"slug": mapping.slug,
105-
"region": mapping.region_name,
106-
"status": {"id": status.name.lower(), "name": status.label},
107-
}
108-
org_mappings_map[mapping.organization_id] = serialized_mapping
109-
110-
keys_map = defaultdict(list)
111-
for key in region_data["keys"]:
112-
serialized_key = {
113-
"dsn": {"public": key.dsn_public},
114-
"isActive": key.is_active,
115-
}
116-
keys_map[key.project_id].append(serialized_key)
110+
region_data["keys"] = keys
111+
for key in region_data["keys"]:
112+
serialized_key = {
113+
"dsn": {"public": key.dsn_public},
114+
"isActive": key.is_active,
115+
}
116+
keys_map[key.project_id].append(serialized_key)
117117

118118
filled_projects = []
119-
120-
for project in region_data["projects"]:
121-
enriched_project = {
122-
"slug": project.slug,
123-
"id": project.id,
124-
"status": STATUS_LABELS.get(project.status, "unknown"),
125-
}
126-
# The wizard only reads the a few fields so serializing the mapping should work fine
127-
enriched_project["organization"] = org_mappings_map[project.organization_id]
128-
enriched_project["keys"] = keys_map[project.id]
129-
filled_projects.append(enriched_project)
119+
for region_name, region_data in region_data_map.items():
120+
for project in region_data["projects"]:
121+
enriched_project = {
122+
"slug": project.slug,
123+
"id": project.id,
124+
"status": STATUS_LABELS.get(project.status, "unknown"),
125+
}
126+
# The wizard only reads the a few fields so serializing the mapping should work fine
127+
enriched_project["organization"] = org_mappings_map[project.organization_id]
128+
enriched_project["keys"] = keys_map[project.id]
129+
filled_projects.append(enriched_project)
130130

131131
# Fetching or creating a token
132132
serialized_token = get_token(org_mappings, request.user)
@@ -140,7 +140,7 @@ def get(self, request: HttpRequest, wizard_hash) -> HttpResponse:
140140
return render_to_response("sentry/setup-wizard.html", context, request)
141141

142142

143-
def get_token(mappings: List[OrganizationMapping], user: User):
143+
def get_token(mappings: List[OrganizationMapping], user: RpcUser):
144144
can_use_org_tokens = len(mappings) == 1
145145

146146
# If only one org, try to generate an org auth token
@@ -164,7 +164,7 @@ def get_token(mappings: List[OrganizationMapping], user: User):
164164
return serialize(token)
165165

166166

167-
def get_org_token(mapping: OrganizationMapping, user: User):
167+
def get_org_token(mapping: OrganizationMapping, user: User | RpcUser):
168168
try:
169169
token_str = generate_token(
170170
mapping.slug, generate_region_url(region_name=mapping.region_name)

0 commit comments

Comments
 (0)