mirror of
https://github.com/ansible/awx.git
synced 2026-05-19 23:07:42 -02:30
Merge pull request #1353 from anoek/rbac
Made reverse_gfk implementation suck a whole lot less
This commit is contained in:
@@ -38,7 +38,7 @@ from polymorphic import PolymorphicModel
|
|||||||
from awx.main.constants import SCHEDULEABLE_PROVIDERS
|
from awx.main.constants import SCHEDULEABLE_PROVIDERS
|
||||||
from awx.main.models import * # noqa
|
from awx.main.models import * # noqa
|
||||||
from awx.main.fields import ImplicitRoleField
|
from awx.main.fields import ImplicitRoleField
|
||||||
from awx.main.utils import get_type_for_model, get_model_for_type, build_url, timestamp_apiformat
|
from awx.main.utils import get_type_for_model, get_model_for_type, build_url, timestamp_apiformat, camelcase_to_underscore
|
||||||
from awx.main.redact import REPLACE_STR
|
from awx.main.redact import REPLACE_STR
|
||||||
from awx.main.conf import tower_settings
|
from awx.main.conf import tower_settings
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ SUMMARIZABLE_FK_FIELDS = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def reverseGenericForeignKey(content_object):
|
def reverse_gfk(content_object):
|
||||||
'''
|
'''
|
||||||
Computes a reverse for a GenericForeignKey field.
|
Computes a reverse for a GenericForeignKey field.
|
||||||
|
|
||||||
@@ -101,35 +101,12 @@ def reverseGenericForeignKey(content_object):
|
|||||||
for example
|
for example
|
||||||
{ 'organization': '/api/v1/organizations/1/' }
|
{ 'organization': '/api/v1/organizations/1/' }
|
||||||
'''
|
'''
|
||||||
|
if content_object is None or not hasattr(content_object, 'get_absolute_url'):
|
||||||
|
return {}
|
||||||
|
|
||||||
ret = {}
|
return {
|
||||||
if type(content_object) is Organization:
|
camelcase_to_underscore(content_object.__class__.__name__): content_object.get_absolute_url()
|
||||||
ret['organization'] = reverse('api:organization_detail', args=(content_object.pk,))
|
}
|
||||||
if type(content_object) is User:
|
|
||||||
ret['user'] = reverse('api:user_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is Team:
|
|
||||||
ret['team'] = reverse('api:team_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is Project:
|
|
||||||
ret['project'] = reverse('api:project_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is Inventory:
|
|
||||||
ret['inventory'] = reverse('api:inventory_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is Host:
|
|
||||||
ret['host'] = reverse('api:host_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is Group:
|
|
||||||
ret['group'] = reverse('api:group_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is InventorySource:
|
|
||||||
ret['inventory_source'] = reverse('api:inventory_source_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is Credential:
|
|
||||||
ret['credential'] = reverse('api:credential_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is JobTemplate:
|
|
||||||
ret['job_template'] = reverse('api:job_template_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is Role:
|
|
||||||
ret['role'] = reverse('api:role_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is Job:
|
|
||||||
ret['job'] = reverse('api:job_detail', args=(content_object.pk,))
|
|
||||||
if type(content_object) is JobEvent:
|
|
||||||
ret['job_event'] = reverse('api:job_event_detail', args=(content_object.pk,))
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
class BaseSerializerMetaclass(serializers.SerializerMetaclass):
|
class BaseSerializerMetaclass(serializers.SerializerMetaclass):
|
||||||
@@ -1498,7 +1475,7 @@ class RoleSerializer(BaseSerializer):
|
|||||||
ret['teams'] = reverse('api:role_teams_list', args=(obj.pk,))
|
ret['teams'] = reverse('api:role_teams_list', args=(obj.pk,))
|
||||||
try:
|
try:
|
||||||
if obj.content_object:
|
if obj.content_object:
|
||||||
ret.update(reverseGenericForeignKey(obj.content_object))
|
ret.update(reverse_gfk(obj.content_object))
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
# AttributeError's happen if our content_object is pointing at
|
# AttributeError's happen if our content_object is pointing at
|
||||||
# a model that no longer exists. This is dirty data and ideally
|
# a model that no longer exists. This is dirty data and ideally
|
||||||
@@ -1524,7 +1501,7 @@ class ResourceAccessListElementSerializer(UserSerializer):
|
|||||||
try:
|
try:
|
||||||
role_dict['resource_name'] = role.content_object.name
|
role_dict['resource_name'] = role.content_object.name
|
||||||
role_dict['resource_type'] = role.content_type.name
|
role_dict['resource_type'] = role.content_type.name
|
||||||
role_dict['related'] = reverseGenericForeignKey(role.content_object)
|
role_dict['related'] = reverse_gfk(role.content_object)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
@@ -729,7 +729,7 @@ class OrganizationActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(OrganizationActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
class OrganizationNotifiersList(SubListCreateAttachDetachAPIView):
|
class OrganizationNotifiersList(SubListCreateAttachDetachAPIView):
|
||||||
|
|
||||||
@@ -807,7 +807,7 @@ class TeamRolesList(SubListCreateAttachDetachAPIView):
|
|||||||
if not sub_id:
|
if not sub_id:
|
||||||
data = dict(msg='Role "id" field is missing')
|
data = dict(msg='Role "id" field is missing')
|
||||||
return Response(data, status=status.HTTP_400_BAD_REQUEST)
|
return Response(data, status=status.HTTP_400_BAD_REQUEST)
|
||||||
return super(type(self), self).post(request, *args, **kwargs)
|
return super(TeamRolesList, self).post(request, *args, **kwargs)
|
||||||
|
|
||||||
class TeamProjectsList(SubListAPIView):
|
class TeamProjectsList(SubListAPIView):
|
||||||
|
|
||||||
@@ -854,7 +854,7 @@ class TeamActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(TeamActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
parent = self.get_parent_object()
|
parent = self.get_parent_object()
|
||||||
@@ -949,7 +949,7 @@ class ProjectActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(ProjectActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
parent = self.get_parent_object()
|
parent = self.get_parent_object()
|
||||||
@@ -1166,7 +1166,7 @@ class UserActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(UserActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
parent = self.get_parent_object()
|
parent = self.get_parent_object()
|
||||||
@@ -1236,7 +1236,7 @@ class CredentialActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(CredentialActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
class CredentialAccessList(ResourceAccessList):
|
class CredentialAccessList(ResourceAccessList):
|
||||||
|
|
||||||
@@ -1300,7 +1300,7 @@ class InventoryActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(InventoryActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
parent = self.get_parent_object()
|
parent = self.get_parent_object()
|
||||||
@@ -1420,7 +1420,7 @@ class HostActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(HostActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
parent = self.get_parent_object()
|
parent = self.get_parent_object()
|
||||||
@@ -1623,7 +1623,7 @@ class GroupActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(GroupActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
parent = self.get_parent_object()
|
parent = self.get_parent_object()
|
||||||
@@ -1874,7 +1874,7 @@ class InventorySourceActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(InventorySourceActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
class InventorySourceNotifiersAnyList(SubListCreateAttachDetachAPIView):
|
class InventorySourceNotifiersAnyList(SubListCreateAttachDetachAPIView):
|
||||||
|
|
||||||
@@ -2138,7 +2138,7 @@ class JobTemplateActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(JobTemplateActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
class JobTemplateNotifiersAnyList(SubListCreateAttachDetachAPIView):
|
class JobTemplateNotifiersAnyList(SubListCreateAttachDetachAPIView):
|
||||||
|
|
||||||
@@ -2458,7 +2458,7 @@ class JobActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(JobActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
class JobStart(GenericAPIView):
|
class JobStart(GenericAPIView):
|
||||||
|
|
||||||
@@ -3072,7 +3072,7 @@ class AdHocCommandActivityStreamList(SubListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(AdHocCommandActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class SystemJobList(ListCreateAPIView):
|
class SystemJobList(ListCreateAPIView):
|
||||||
@@ -3283,7 +3283,7 @@ class ActivityStreamList(SimpleListAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(ActivityStreamList, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class ActivityStreamDetail(RetrieveAPIView):
|
class ActivityStreamDetail(RetrieveAPIView):
|
||||||
@@ -3300,7 +3300,7 @@ class ActivityStreamDetail(RetrieveAPIView):
|
|||||||
'the activity stream.')
|
'the activity stream.')
|
||||||
|
|
||||||
# Okay, let it through.
|
# Okay, let it through.
|
||||||
return super(type(self), self).get(request, *args, **kwargs)
|
return super(ActivityStreamDetail, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
class SettingsList(ListCreateAPIView):
|
class SettingsList(ListCreateAPIView):
|
||||||
|
|
||||||
@@ -3408,7 +3408,7 @@ class RoleUsersList(SubListCreateAttachDetachAPIView):
|
|||||||
if not sub_id:
|
if not sub_id:
|
||||||
data = dict(msg='Role "id" field is missing')
|
data = dict(msg='Role "id" field is missing')
|
||||||
return Response(data, status=status.HTTP_400_BAD_REQUEST)
|
return Response(data, status=status.HTTP_400_BAD_REQUEST)
|
||||||
return super(type(self), self).post(request, *args, **kwargs)
|
return super(RoleUsersList, self).post(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class RoleTeamsList(ListAPIView):
|
class RoleTeamsList(ListAPIView):
|
||||||
|
|||||||
Reference in New Issue
Block a user