Skip to content

Commit 6b2efe3

Browse files
authored
AAP-50879 Add data, remove dups, RBAC access list serializer (ansible#815)
two things from the UI - access list was showing duplicates - add `first_name` and `last_name` to the user-oriented serializer, because they are standard Django User fields and will be presented directly in the UI for the access list
1 parent c3e3a95 commit 6b2efe3

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

ansible_base/rbac/api/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ class UserAccessListMixin(AccessListMixin, serializers.ModelSerializer):
328328
object_role_assignments = serializers.SerializerMethodField()
329329
url = serializers.SerializerMethodField()
330330
related = serializers.SerializerMethodField('_get_related')
331-
_expected_fields = ['id', 'url', 'related', 'username', 'is_superuser', 'object_role_assignments']
331+
_expected_fields = ['id', 'url', 'related', 'username', 'is_superuser', 'first_name', 'last_name', 'object_role_assignments']
332332

333333

334334
class TeamAccessListMixin(AccessListMixin, AbstractCommonModelSerializer):

ansible_base/rbac/api/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ def get_queryset(self):
334334
actor_qs = actor_cls.objects.filter(role_assignments__in=assignment_qs)
335335
if actor_cls._meta.model_name == 'user':
336336
actor_qs |= actor_cls.objects.filter(is_superuser=True)
337-
return actor_qs
337+
return actor_qs.distinct()
338338

339339
def get_serializer(self, *args, **kwargs):
340340
"""Awkwardly override this method, because eda-server uses a custom base viewset class.

test_app/tests/rbac/api/test_access_lists.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
def test_user_access_list(admin_api_client, inv_rd, org_inv_rd, inventory, member_rd):
1111
url = get_relative_url('role-user-access', kwargs={'pk': inventory.pk, 'model_name': 'aap.inventory'})
1212

13-
u1 = User.objects.create(username='direct-inv-access')
13+
u1 = User.objects.create(username='direct-inv-access', first_name='user', last_name='one')
1414
inv_rd.give_permission(u1, inventory)
1515

1616
u2 = User.objects.create(username='org-level-access')
@@ -33,6 +33,9 @@ def test_user_access_list(admin_api_client, inv_rd, org_inv_rd, inventory, membe
3333
assert detail_resp.status_code == 200, detail_resp.data
3434
# This should have the same entries in a list view as the access list had in the assignments list
3535
assert detail_resp.data['count'] == len(user_detail['object_role_assignments'])
36+
if user_detail['username'] == u1.username:
37+
assert user_detail['first_name'] == 'user'
38+
assert user_detail['last_name'] == 'one'
3639

3740
assert u1.username in user_data
3841
assert len(user_data[u1.username]) == 1
@@ -112,3 +115,26 @@ def test_intermediary_role_display(admin_api_client, inventory, organization, me
112115
intermediary_names = [entry['role_definition']['name'] for entry in intermediary]
113116
assert org_admin_inv_rd.name in intermediary_names
114117
assert org_view_inv_rd.name in intermediary_names
118+
119+
120+
@pytest.mark.django_db
121+
def test_no_duplicates(rando, inv_rd, inventory, org_inv_rd, admin_api_client):
122+
inv_rd.give_permission(rando, inventory)
123+
org_inv_rd.give_permission(rando, inventory.organization)
124+
125+
# the admin user themselves will show up, so filter superusers out
126+
url = get_relative_url('role-user-access', kwargs={'pk': inventory.pk, 'model_name': 'aap.inventory'}) + '?is_superuser=false'
127+
response = admin_api_client.get(url)
128+
assert response.status_code == 200, response.data
129+
assert response.data['count'] == 1, response.data
130+
131+
132+
@pytest.mark.django_db
133+
def test_no_duplicates_team(team, inv_rd, inventory, org_inv_rd, admin_api_client):
134+
inv_rd.give_permission(team, inventory)
135+
org_inv_rd.give_permission(team, inventory.organization)
136+
137+
url = get_relative_url('role-team-access', kwargs={'pk': inventory.pk, 'model_name': 'aap.inventory'})
138+
response = admin_api_client.get(url)
139+
assert response.status_code == 200, response.data
140+
assert response.data['count'] == 1, response.data

0 commit comments

Comments
 (0)