Skip to content

Commit 10b7c53

Browse files
refactor: index users to avoid additional queries & improve inline comments
1 parent e4b50c3 commit 10b7c53

1 file changed

Lines changed: 15 additions & 3 deletions

File tree

openedx_authz/engine/utils.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,10 @@ def migrate_authz_to_legacy_course_roles(
317317
"""
318318
_validate_migration_input(course_id_list, org_id)
319319

320-
# CourseOverviewData and OrgCourseOverviewGlobData share the same namespace,
321-
# so filtering by CourseOverviewData captures both course-level and org-level glob assignments.
320+
# CourseOverviewData and OrgCourseOverviewGlobData share the same NAMESPACE ("course-v1"),
321+
# and get_all_role_assignments_per_scope_type matches by NAMESPACE. Passing CourseOverviewData
322+
# therefore captures both course-level and org-level glob assignments. The exact scope type
323+
# is narrowed per-assignment via isinstance checks in the loop below.
322324
role_assignments = get_all_role_assignments_per_scope_type(scope_type=CourseOverviewData)
323325

324326
# Two cases here:
@@ -343,6 +345,14 @@ def migrate_authz_to_legacy_course_roles(
343345
roles_with_no_errors = []
344346
unassignments = defaultdict(list)
345347

348+
user_external_keys = {assignment.subject.external_key for assignment in role_assignments}
349+
users_by_username = {
350+
subject.user.username: subject.user
351+
for subject in user_subject_model.objects.filter(
352+
user__username__in=user_external_keys
353+
).select_related("user")
354+
}
355+
346356
for role_assignment in role_assignments:
347357

348358
# Per valid role assignment, create corresponding CourseAccessRole entry
@@ -353,7 +363,7 @@ def migrate_authz_to_legacy_course_roles(
353363
scope_external_key = role_assignment.scope.external_key
354364

355365
course_access_role_kwargs = {
356-
"user": user_subject_model.objects.get(user__username=user_external_key).user,
366+
"user": users_by_username[user_external_key],
357367
"role": COURSE_ROLE_EQUIVALENCES[role_external_key],
358368
}
359369

@@ -363,6 +373,8 @@ def migrate_authz_to_legacy_course_roles(
363373
elif isinstance(role_assignment.scope, OrgCourseOverviewGlobData):
364374
course_access_role_kwargs["org"] = role_assignment.scope.org
365375
else:
376+
# This would only happen for course roles assigned instance-wide
377+
# which is not yet supported
366378
logger.error(
367379
f"Unexpected scope type: {type(role_assignment.scope)} for RoleAssignment with "
368380
f"scope: {scope_external_key}, user: {user_external_key} and role: {role_external_key}, skipping."

0 commit comments

Comments
 (0)