Skip to content

Commit aede0dc

Browse files
committed
squash!: Filter for active users only
1 parent ce614a5 commit aede0dc

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

openedx_authz/api/users.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,17 @@ def get_visible_user_role_assignments_filtered_by_current_user(
204204
user_external_key=allowed_for_user_external_key,
205205
assignments=user_role_assignments,
206206
)
207+
208+
# Only include assignments whose subject corresponds to an active user,
209+
# consistent with get_superadmin_assignments which filters by is_active=True.
210+
active_usernames = set(
211+
User.objects.filter(
212+
username__in=[a.subject.username for a in user_role_assignments],
213+
is_active=True,
214+
).values_list("username", flat=True)
215+
)
216+
user_role_assignments = [a for a in user_role_assignments if a.subject.username in active_usernames]
217+
207218
if orgs:
208219
# Filter by orgs
209220
user_role_assignments = [a for a in user_role_assignments if getattr(a.scope, "org", None) in orgs]

openedx_authz/tests/api/test_users.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
get_user_role_assignments,
1515
get_user_role_assignments_for_role_in_scope,
1616
get_user_role_assignments_in_scope,
17+
get_visible_user_role_assignments_filtered_by_current_user,
1718
is_user_allowed,
1819
unassign_all_roles_from_user,
1920
unassign_role_from_user,
@@ -570,3 +571,48 @@ def test_validate_users_user_does_not_exist_handling(self, mock_get_user):
570571

571572
self.assertEqual(valid_users, [])
572573
self.assertEqual(invalid_users, ["nonexistent_user"])
574+
575+
576+
class TestGetVisibleUserRoleAssignmentsFilteredByCurrentUserActiveFilter(UserAssignmentsSetupMixin):
577+
"""Test that get_visible_user_role_assignments_filtered_by_current_user excludes inactive users."""
578+
579+
def test_active_user_assignments_are_returned(self):
580+
"""Test that assignments for an active user are returned."""
581+
User = get_user_model()
582+
User.objects.create_user(username="alice", email="[email protected]", is_active=True)
583+
584+
assignments = get_visible_user_role_assignments_filtered_by_current_user(
585+
user_external_key="alice",
586+
)
587+
588+
usernames = {a.subject.username for a in assignments}
589+
self.assertIn("alice", usernames)
590+
591+
def test_inactive_user_assignments_are_excluded(self):
592+
"""Test that assignments for an inactive user are filtered out."""
593+
User = get_user_model()
594+
User.objects.create_user(username="alice", email="[email protected]", is_active=False)
595+
596+
assignments = get_visible_user_role_assignments_filtered_by_current_user(
597+
user_external_key="alice",
598+
)
599+
600+
self.assertEqual(assignments, [])
601+
602+
def test_mixed_active_inactive_subjects_in_assignments(self):
603+
"""Test that only active users' assignments are returned when multiple subjects exist."""
604+
User = get_user_model()
605+
# eve has roles in lib:Org2:physics_401, lib:Org2:chemistry_501, lib:Org2:biology_601
606+
# grace has a role in lib:Org1:math_advanced
607+
User.objects.create_user(username="eve", email="[email protected]", is_active=True)
608+
User.objects.create_user(username="grace", email="[email protected]", is_active=False)
609+
610+
eve_assignments = get_visible_user_role_assignments_filtered_by_current_user(
611+
user_external_key="eve",
612+
)
613+
grace_assignments = get_visible_user_role_assignments_filtered_by_current_user(
614+
user_external_key="grace",
615+
)
616+
617+
self.assertGreater(len(eve_assignments), 0)
618+
self.assertEqual(grace_assignments, [])

0 commit comments

Comments
 (0)