Skip to content

Commit

Permalink
Add resource and ansible_id to serializers (#15020)
Browse files Browse the repository at this point in the history
  • Loading branch information
AlanCoding authored Mar 27, 2024
1 parent b44bb98 commit f48b2d1
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 1 deletion.
1 change: 1 addition & 0 deletions awx/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@
'webhook_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud', 'credential_type_id'),
'approved_or_denied_by': ('id', 'username', 'first_name', 'last_name'),
'credential_type': DEFAULT_SUMMARY_FIELDS,
'resource': ('ansible_id', 'resource_type'),
}


Expand Down
7 changes: 6 additions & 1 deletion awx/main/access.py
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,10 @@ class UserAccess(BaseAccess):
"""

model = User
prefetch_related = ('profile',)
prefetch_related = (
'profile',
'resource',
)

def filtered_queryset(self):
if settings.ORG_ADMINS_CAN_SEE_ALL_USERS and (self.user.admin_of_organizations.exists() or self.user.auditor_of_organizations.exists()):
Expand Down Expand Up @@ -835,6 +838,7 @@ class OrganizationAccess(NotificationAttachMixin, BaseAccess):
prefetch_related = (
'created_by',
'modified_by',
'resource', # dab_resource_registry
)
# organization admin_role is not a parent of organization auditor_role
notification_attach_roles = ['admin_role', 'auditor_role']
Expand Down Expand Up @@ -1303,6 +1307,7 @@ class TeamAccess(BaseAccess):
'created_by',
'modified_by',
'organization',
'resource', # dab_resource_registry
)

def filtered_queryset(self):
Expand Down
3 changes: 3 additions & 0 deletions awx/main/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
from django.db import connection
from django.db.models.signals import pre_delete # noqa

# django-ansible-base
from ansible_base.resource_registry.fields import AnsibleResourceField
from ansible_base.lib.utils.models import prevent_search

# AWX
Expand Down Expand Up @@ -99,6 +101,7 @@
User.add_to_class('get_queryset', get_user_queryset)
User.add_to_class('can_access', check_user_access)
User.add_to_class('can_access_with_errors', check_user_access_with_errors)
User.add_to_class('resource', AnsibleResourceField(primary_key_field="id"))


def convert_jsonfields():
Expand Down
4 changes: 4 additions & 0 deletions awx/main/models/organization.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from django.utils.timezone import now as tz_now
from django.utils.translation import gettext_lazy as _

# django-ansible-base
from ansible_base.resource_registry.fields import AnsibleResourceField

# AWX
from awx.api.versioning import reverse
Expand Down Expand Up @@ -103,6 +105,7 @@ class Meta:
approval_role = ImplicitRoleField(
parent_role='admin_role',
)
resource = AnsibleResourceField(primary_key_field="id")

def get_absolute_url(self, request=None):
return reverse('api:organization_detail', kwargs={'pk': self.pk}, request=request)
Expand Down Expand Up @@ -151,6 +154,7 @@ class Meta:
read_role = ImplicitRoleField(
parent_role=['organization.auditor_role', 'member_role'],
)
resource = AnsibleResourceField(primary_key_field="id")

def get_absolute_url(self, request=None):
return reverse('api:team_detail', kwargs={'pk': self.pk}, request=request)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import pytest

from ansible_base.resource_registry.models import Resource

from awx.api.versioning import reverse


def assert_has_resource(list_response, obj=None):
data = list_response.data
assert 'resource' in data['results'][0]['summary_fields']
resource_data = data['results'][0]['summary_fields']['resource']
assert resource_data['ansible_id']
resource = Resource.objects.filter(ansible_id=resource_data['ansible_id']).first()
assert resource
assert resource.content_object
if obj:
objects = [Resource.objects.get(ansible_id=entry['summary_fields']['resource']['ansible_id']).content_object for entry in data['results']]
assert obj in objects


@pytest.mark.django_db
def test_organization_ansible_id(organization, admin_user, get):
url = reverse('api:organization_list')
response = get(url=url, user=admin_user, expect=200)
assert_has_resource(response, obj=organization)


@pytest.mark.django_db
def test_team_ansible_id(team, admin_user, get):
url = reverse('api:team_list')
response = get(url=url, user=admin_user, expect=200)
assert_has_resource(response, obj=team)


@pytest.mark.django_db
def test_user_ansible_id(rando, admin_user, get):
url = reverse('api:user_list')
response = get(url=url, user=admin_user, expect=200)
assert_has_resource(response, obj=rando)

0 comments on commit f48b2d1

Please sign in to comment.