Skip to content

Commit 5cfc6c8

Browse files
authored
feat: implement org retrieval for user roles in authz compatibility layer (#38216)
1 parent 76fdce3 commit 5cfc6c8

6 files changed

Lines changed: 60 additions & 10 deletions

File tree

common/djangoapps/student/roles.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -533,9 +533,13 @@ def _authz_get_orgs_for_user(self, user) -> list[str]:
533533
Returns a list of org short names for the user with given role.
534534
AuthZ compatibility layer
535535
"""
536-
# TODO: This will be implemented on Milestone 1
537-
# of the Authz for Course Authoring project
538-
return []
536+
role = get_authz_role_from_legacy_role(self._role_name)
537+
assignments = authz_api.get_user_role_assignments_filtered(
538+
user_external_key=user.username,
539+
role_external_key=role,
540+
)
541+
orgs = {assignment.scope.org for assignment in assignments if assignment.scope.org is not None}
542+
return list(orgs)
539543

540544
def _legacy_get_orgs_for_user(self, user) -> list[str]:
541545
"""

common/djangoapps/student/tests/test_roles.py

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
Tests of student.roles
33
"""
44

5-
65
from unittest.mock import patch
76

87
import ddt
@@ -11,7 +10,8 @@
1110
from edx_toggles.toggles.testutils import override_waffle_flag
1211
from opaque_keys.edx.keys import CourseKey
1312
from opaque_keys.edx.locator import LibraryLocator
14-
from openedx_authz.api.data import ContentLibraryData, RoleAssignmentData, RoleData, UserData
13+
from openedx_authz.api.data import ContentLibraryData, CourseOverviewData, RoleAssignmentData, RoleData, UserData
14+
from openedx_authz.constants.roles import COURSE_ADMIN, COURSE_STAFF
1515
from openedx_authz.engine.enforcer import AuthzEnforcer
1616

1717
from common.djangoapps.student.admin import CourseAccessRoleHistoryAdmin
@@ -239,9 +239,51 @@ def test_get_orgs_for_user(self):
239239
role_second_org.add_users(self.student)
240240
assert len(role.get_orgs_for_user(self.student)) == 2
241241

242+
@override_waffle_flag(AUTHZ_COURSE_AUTHORING_FLAG, active=True)
243+
def test_get_orgs_for_user_authz(self):
244+
"""
245+
Test get_orgs_for_user using AuthZ compatibility layer
246+
"""
247+
role = CourseStaffRole(self.course_key)
248+
249+
other_org = "MIT"
250+
other_course_key = CourseKey.from_string(f"course-v1:{other_org}+Javascript+2026_T1")
251+
another_course_key = CourseKey.from_string(f"course-v1:{other_org}+Python+2026_T1")
252+
253+
staff_authz_role = RoleData(external_key=COURSE_STAFF)
254+
instructor_authz_role = RoleData(external_key=COURSE_ADMIN)
255+
256+
assignments = [
257+
RoleAssignmentData(
258+
subject=UserData(external_key=self.student.username),
259+
roles=[staff_authz_role],
260+
scope=CourseOverviewData(external_key=str(self.course_key)),
261+
),
262+
RoleAssignmentData(
263+
subject=UserData(external_key=self.student.username),
264+
roles=[staff_authz_role],
265+
scope=CourseOverviewData(external_key=str(other_course_key)),
266+
),
267+
RoleAssignmentData(
268+
subject=UserData(external_key=self.student.username),
269+
roles=[staff_authz_role],
270+
scope=CourseOverviewData(external_key=str(another_course_key)),
271+
),
272+
# Non-matching role should be ignored
273+
RoleAssignmentData(
274+
subject=UserData(external_key=self.student.username),
275+
roles=[instructor_authz_role],
276+
scope=CourseOverviewData(external_key=str(self.course_key)),
277+
),
278+
]
279+
280+
with patch("openedx_authz.api.users.get_user_role_assignments_filtered", return_value=assignments):
281+
result = role.get_orgs_for_user(self.student)
282+
self.assertCountEqual(result, [self.course_key.org, other_org])
283+
242284
def test_get_authz_compat_course_access_roles_for_user(self):
243285
"""
244-
Thest that get_authz_compat_course_access_roles_for_user doesn't crash when the user
286+
Test that get_authz_compat_course_access_roles_for_user doesn't crash when the user
245287
has Libraries V2 or other non-course roles in their assignments.
246288
"""
247289
lib_assignment = RoleAssignmentData(

requirements/edx/base.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ edx-opaque-keys[django]==3.1.0
514514
edx-organizations==7.3.0
515515
# via
516516
# -r requirements/edx/kernel.in
517+
# openedx-authz
517518
# openedx-core
518519
edx-proctoring==5.2.0
519520
# via -r requirements/edx/kernel.in
@@ -823,7 +824,7 @@ openedx-atlas==0.7.0
823824
# enterprise-integrated-channels
824825
# openedx-authz
825826
# openedx-forum
826-
openedx-authz==1.0.0
827+
openedx-authz==1.2.0
827828
# via -r requirements/edx/kernel.in
828829
openedx-calc==5.0.0
829830
# via

requirements/edx/development.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,7 @@ edx-organizations==7.3.0
806806
# via
807807
# -r requirements/edx/doc.txt
808808
# -r requirements/edx/testing.txt
809+
# openedx-authz
809810
# openedx-core
810811
edx-proctoring==5.2.0
811812
# via
@@ -1373,7 +1374,7 @@ openedx-atlas==0.7.0
13731374
# enterprise-integrated-channels
13741375
# openedx-authz
13751376
# openedx-forum
1376-
openedx-authz==1.0.0
1377+
openedx-authz==1.2.0
13771378
# via
13781379
# -r requirements/edx/doc.txt
13791380
# -r requirements/edx/testing.txt

requirements/edx/doc.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,7 @@ edx-opaque-keys[django]==3.1.0
605605
edx-organizations==7.3.0
606606
# via
607607
# -r requirements/edx/base.txt
608+
# openedx-authz
608609
# openedx-core
609610
edx-proctoring==5.2.0
610611
# via -r requirements/edx/base.txt
@@ -1001,7 +1002,7 @@ openedx-atlas==0.7.0
10011002
# enterprise-integrated-channels
10021003
# openedx-authz
10031004
# openedx-forum
1004-
openedx-authz==1.0.0
1005+
openedx-authz==1.2.0
10051006
# via -r requirements/edx/base.txt
10061007
openedx-calc==5.0.0
10071008
# via

requirements/edx/testing.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,7 @@ edx-opaque-keys[django]==3.1.0
627627
edx-organizations==7.3.0
628628
# via
629629
# -r requirements/edx/base.txt
630+
# openedx-authz
630631
# openedx-core
631632
edx-proctoring==5.2.0
632633
# via -r requirements/edx/base.txt
@@ -1048,7 +1049,7 @@ openedx-atlas==0.7.0
10481049
# enterprise-integrated-channels
10491050
# openedx-authz
10501051
# openedx-forum
1051-
openedx-authz==1.0.0
1052+
openedx-authz==1.2.0
10521053
# via -r requirements/edx/base.txt
10531054
openedx-calc==5.0.0
10541055
# via

0 commit comments

Comments
 (0)