Skip to content

Commit 1732b83

Browse files
committed
Fix bugs from integrated testing
1 parent c830250 commit 1732b83

File tree

4 files changed

+44
-9
lines changed

4 files changed

+44
-9
lines changed

ansible_base/rbac/api/serializers.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -247,14 +247,13 @@ class RoleMetadataSerializer(serializers.Serializer):
247247
allowed_permissions = serializers.DictField(help_text=_('A List of permissions allowed for a role definition, given its content type.'))
248248

249249

250-
class AccessListMixin(AbstractCommonModelSerializer):
251-
role_assignments = serializers.SerializerMethodField()
250+
class AccessListMixin:
252251

253252
@staticmethod
254253
def summarize_role_definition(role_definition):
255254
return {"name": role_definition.name, "url": get_url_for_object(role_definition)}
256255

257-
def get_role_assignments(self, actor):
256+
def get_object_role_assignments(self, actor):
258257
obj = self.context.get("related_object")
259258
permission = self.context.get("permission")
260259
ct = self.context.get("content_type")
@@ -292,9 +291,13 @@ def get_role_assignments(self, actor):
292291
return assignment_list
293292

294293

295-
class UserAccessListMixin(AccessListMixin):
296-
_expected_fields = ['username', 'role_assignments']
294+
class UserAccessListMixin(AccessListMixin, serializers.ModelSerializer):
295+
"controller uses auth.User model so this needs to be as compatible as possible, thus ModelSerializer"
296+
object_role_assignments = serializers.SerializerMethodField()
297+
_expected_fields = ['id', 'username', 'summary_fields', 'object_role_assignments']
297298

298299

299-
class TeamAccessListMixin(AccessListMixin):
300-
_expected_fields = ['name', 'organization', 'role_assignments']
300+
301+
class TeamAccessListMixin(AccessListMixin, AbstractCommonModelSerializer):
302+
object_role_assignments = serializers.SerializerMethodField()
303+
_expected_fields = ['id', 'name', 'organization', 'summary_fields', 'object_role_assignments']

ansible_base/rbac/api/views.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,24 @@ def get_queryset(self):
294294
actor_qs |= actor_qs.filter(is_superuser=True)
295295
return actor_qs
296296

297+
def get_serializer(self, *args, **kwargs):
298+
"""Awkwardly override this method, because eda-server uses a custom base viewset class.
299+
300+
Due to how that is structured, you can not go without defining the model unless overwriting this.
301+
And we, here, can not give a serializer class at import time because the user model is unknown.
302+
So this is the same as the DRF method.
303+
"""
304+
serializer_class = self.get_serializer_class()
305+
kwargs.setdefault('context', self.get_serializer_context())
306+
return serializer_class(*args, **kwargs)
307+
297308
def get_serializer_class(self):
298309
actor_cls = self.get_actor_model()
299310

300311
class DynamicActorSerializer(self.serializer_mixin):
301312
class Meta:
302313
model = actor_cls
303-
fields = self.serializer_mixin.Meta.fields + self.serializer_mixin._expected_fields
314+
fields = self.serializer_mixin._expected_fields
304315

305316
return DynamicActorSerializer
306317

ansible_base/rbac/service_api/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class BaseAssignmentSerializer(serializers.ModelSerializer):
6868
role_definition = serializers.SlugRelatedField(slug_field='name', queryset=RoleDefinition.objects.all())
6969
created_by_ansible_id = ActorAnsibleIDField(source='created_by', required=False)
7070
object_ansible_id = ObjectIDAnsibleIDField(source='object_id', required=False, allow_null=True)
71-
object_id = serializers.CharField(allow_blank=True)
71+
object_id = serializers.CharField(allow_blank=True, required=False)
7272
from_service = serializers.CharField(write_only=True)
7373

7474
def to_representation(self, instance):

test_app/tests/rbac/remote/test_service_api.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,24 @@ def test_filter_assignment_list(admin_api_client, rando, inv_rd, view_inv_rd, or
163163
)
164164
assert response.status_code == 200, response.data
165165
assert response.data['count'] == 2
166+
167+
168+
@pytest.mark.django_db
169+
def test_unassign_endpoint(rando, org_inv_rd, inventory, admin_api_client):
170+
org_inv_rd.give_permission(rando, inventory.organization)
171+
assert rando.has_obj_perm(inventory, 'change')
172+
173+
url = get_relative_url('serviceuserassignment-unassign')
174+
data = {
175+
"role_definition": org_inv_rd.name,
176+
"user_ansible_id": str(rando.resource.ansible_id),
177+
"object_ansible_id": str(inventory.organization.resource.ansible_id)
178+
}
179+
response = admin_api_client.post(url, data)
180+
assert response.status_code == 204, response.data
181+
assert not rando.has_obj_perm(inventory, 'change')
182+
183+
# second gets a 200 code
184+
response = admin_api_client.post(url, data)
185+
assert response.status_code == 200, response.data
186+
assert not rando.has_obj_perm(inventory, 'change')

0 commit comments

Comments
 (0)