Skip to content

Commit 34f1a79

Browse files
committed
Debug the assign and unassign views
1 parent de7e9e9 commit 34f1a79

File tree

3 files changed

+37
-17
lines changed

3 files changed

+37
-17
lines changed

ansible_base/rbac/service_api/serializers.py

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.apps import apps
22
from rest_framework import serializers
33

4-
from ..models import DABContentType, DABPermission, RoleTeamAssignment, RoleUserAssignment
4+
from ..models import DABContentType, DABPermission, RoleDefinition, RoleTeamAssignment, RoleUserAssignment
55
from ..remote import RemoteObject
66

77

@@ -21,13 +21,27 @@ class Meta:
2121
fields = ['api_slug', 'codename', 'content_type', 'name']
2222

2323

24+
class ActorAnsibleIDField(serializers.Field):
25+
def to_representation(self, actor):
26+
return str(actor.resource.ansible_id)
27+
28+
def to_internal_value(self, data):
29+
resource_cls = apps.get_model('dab_resource_registry', 'Resource')
30+
try:
31+
resource = resource_cls.objects.get(ansible_id=data)
32+
except resource_cls.DoesNotExist:
33+
raise serializers.ValidationError(f"No {self.source} found with ansible_id={data}")
34+
35+
return resource.content_object
36+
37+
2438
assignment_common_fields = ('created', 'created_by_ansible_id', 'object_id', 'object_ansible_id', 'content_type', 'role_definition')
2539

2640

2741
class BaseAssignmentSerializer(serializers.ModelSerializer):
2842
content_type = serializers.SlugRelatedField(read_only=True, slug_field='api_slug')
29-
role_definition = serializers.SlugRelatedField(read_only=True, slug_field='name')
30-
created_by_ansible_id = serializers.SerializerMethodField()
43+
role_definition = serializers.SlugRelatedField(slug_field='name', queryset=RoleDefinition.objects.all())
44+
created_by_ansible_id = ActorAnsibleIDField(source='created_by', required=False)
3145
object_ansible_id = serializers.SerializerMethodField()
3246
# TODO: use the from_service to control what we sync back to
3347
from_service = serializers.CharField(write_only=True)
@@ -44,35 +58,25 @@ def get_object_ansible_id(self, obj):
4458
return None
4559

4660
def find_existing_assignment(self, queryset):
47-
actor_ansible_id = self.validated_data[f'{self.actor_field}_ansible_id']
61+
actor = self.validated_data[self.actor_field]
4862
object_id = self.validated_data['object_id']
4963
role_definition = self.validated_data['role_definition']
50-
51-
resource_cls = apps.get_model('dab_resource_registry', 'Resource')
52-
actor_resource = resource_cls.objects.get(ansible_id=actor_ansible_id)
53-
actor = actor_resource.content_object
5464
return queryset.filter(object_id=object_id, role_definition=role_definition, **{self.actor_field: actor}).first()
5565

5666

5767
class RoleUserAssignmentSerializer(BaseAssignmentSerializer):
58-
user_ansible_id = serializers.SerializerMethodField()
68+
user_ansible_id = ActorAnsibleIDField(source='user', required=True)
5969
actor_field = 'user'
6070

6171
class Meta:
6272
model = RoleUserAssignment
6373
fields = assignment_common_fields + ('user_ansible_id',)
6474

65-
def get_user_ansible_id(self, obj):
66-
return str(obj.user.resource.ansible_id)
67-
6875

6976
class RoleTeamAssignmentSerializer(BaseAssignmentSerializer):
70-
user_ansible_id = serializers.SerializerMethodField()
77+
team_ansible_id = ActorAnsibleIDField(source='team', required=True)
7178
actor_field = 'team'
7279

7380
class Meta:
7481
model = RoleTeamAssignment
7582
fields = assignment_common_fields + ('team_ansible_id',)
76-
77-
def get_team_ansible_id(self, obj):
78-
return str(obj.team.resource.ansible_id)

ansible_base/rest_filters/rest_framework/ansible_id_backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,4 @@ def filter_queryset(self, request, queryset, view):
135135
query |= q
136136
queryset = queryset.filter(query)
137137

138-
return super().filter_queryset(request, queryset, view)
138+
return queryset

test_app/tests/rbac/remote/test_service_api.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,19 @@ def test_list_role_user_assignments(admin_api_client, rando, inv_rd, inventory):
116116
assert int(from_api['object_id']) == inventory.id
117117
assert from_api['user_ansible_id'] == str(rando.resource.ansible_id)
118118
assert from_api['content_type'] == 'aap.inventory'
119+
120+
121+
@pytest.mark.django_db
122+
def test_apply_role_assignment(admin_api_client, rando, inv_rd, inventory):
123+
url = get_relative_url('serviceuserassignment-assign')
124+
125+
data = {"role_definition": inv_rd.name, "user_ansible_id": str(rando.resource.ansible_id), "object_id": inventory.pk}
126+
127+
assert not rando.has_obj_perm(inventory, 'change')
128+
response = admin_api_client.post(url, data=data)
129+
assert response.status_code == 201, response.data
130+
assert not rando.has_obj_perm(inventory, 'change')
131+
132+
# Second try, response code indicates assignment already exists
133+
response = admin_api_client.post(url, data=data)
134+
assert response.status_code == 409, response.data

0 commit comments

Comments
 (0)