Skip to content

Commit bd4fedf

Browse files
committed
feat: add function to retrieve role assignments in scope
1 parent 6ed26f6 commit bd4fedf

3 files changed

Lines changed: 47 additions & 4 deletions

File tree

openedx_authz/api/roles.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,29 @@ def get_role_definitions_in_scope(scope: ScopeData) -> list[RoleData]:
163163
]
164164

165165

166+
def get_role_assignments_in_scope(
167+
scope: ScopeData
168+
) -> list[RoleAssignmentData]:
169+
"""Get all the role assignments in a specific scope.
170+
171+
Args:
172+
scope: The scope to filter role assignments (e.g., 'library:123' or '*' for global).
173+
"""
174+
enforcer.load_policy()
175+
filtered_policy = enforcer.get_filtered_grouping_policy(
176+
PolicyIndex.SCOPE.value, scope.scope_id
177+
)
178+
179+
return [
180+
RoleAssignmentData(
181+
subject=SubjectData(subject_id=policy[GroupingPolicyIndex.SUBJECT.value]),
182+
role=RoleData(role_id=policy[GroupingPolicyIndex.ROLE.value]),
183+
scope=scope,
184+
)
185+
for policy in filtered_policy
186+
]
187+
188+
166189
def get_all_roles_names() -> list[str]:
167190
"""Get all the available roles names in the current environment.
168191

openedx_authz/rest_api/v1/serializers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ class RemoveUserFromRoleWithScopeSerializer(RoleMixin, ScopeMixin): # pylint: d
4343
user = serializers.CharField(max_length=255)
4444

4545

46-
class ListUsersInRoleWithScopeSerializer(RoleMixin, ScopeMixin): # pylint: disable=abstract-method
46+
class ListUsersInRoleWithScopeSerializer(ScopeMixin): # pylint: disable=abstract-method
4747
"""Serializer for listing users in a role with a scope."""
4848

49+
role = serializers.CharField(max_length=255, required=False)
50+
4951

5052
class ListRolesWithScopeSerializer(ScopeMixin): # pylint: disable=abstract-method
5153
"""Serializer for listing roles with a scope."""

openedx_authz/rest_api/v1/views.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import logging
99

1010
import edx_api_doc_tools as apidocs
11-
from common.djangoapps.student.models.user import get_user_by_username_or_email
1211
from django.contrib.auth import get_user_model
1312
from django.http import HttpRequest
1413
from rest_framework import status
@@ -18,7 +17,7 @@
1817

1918
from openedx_authz.api.data import ActionData, ScopeData, UserData
2019
from openedx_authz.api.permissions import has_permission
21-
from openedx_authz.api.roles import get_role_definitions_in_scope
20+
from openedx_authz.api.roles import get_role_definitions_in_scope, get_role_assignments_in_scope
2221
from openedx_authz.api.users import (
2322
assign_role_to_user_in_scope,
2423
get_user_role_assignments_for_role_in_scope,
@@ -35,6 +34,11 @@
3534
RemoveUserFromRoleWithScopeSerializer,
3635
)
3736

37+
try:
38+
from common.djangoapps.student.models.user import get_user_by_username_or_email
39+
except ImportError:
40+
get_user_by_username_or_email = None
41+
3842
logger = logging.getLogger(__name__)
3943

4044
User = get_user_model()
@@ -110,10 +114,24 @@ def get(self, request: HttpRequest) -> Response:
110114
serializer = ListUsersInRoleWithScopeSerializer(data=request.query_params)
111115
serializer.is_valid(raise_exception=True)
112116

113-
role_name = serializer.validated_data["role"]
117+
role_name = serializer.validated_data.get("role")
114118
scope = serializer.validated_data["scope"]
115119

116120
response_data = []
121+
122+
# TODO: Should this be another endpoint?
123+
if not role_name:
124+
role_assignments = get_role_assignments_in_scope(ScopeData(name=scope))
125+
for role_assignment in role_assignments:
126+
response_data.append(
127+
{
128+
"role": role_assignment.role.name,
129+
# TODO: Include users by role
130+
"users": [],
131+
}
132+
)
133+
return Response(response_data, status=status.HTTP_200_OK)
134+
117135
role_assignments = get_user_role_assignments_for_role_in_scope(role_name, scope)
118136
for assignment in role_assignments:
119137
# TODO: Should we get all users at once instead of one by one?

0 commit comments

Comments
 (0)