mirror of
https://github.com/ansible/awx.git
synced 2026-05-13 20:37:39 -02:30
intermediary state, not yet known to be working
This commit is contained in:
@@ -331,11 +331,12 @@ class BaseSerializer(serializers.ModelSerializer):
|
|||||||
}
|
}
|
||||||
if len(roles) > 0:
|
if len(roles) > 0:
|
||||||
summary_fields['object_roles'] = roles
|
summary_fields['object_roles'] = roles
|
||||||
view = self.context.get('view', None)
|
if hasattr(self, 'show_capabilities'):
|
||||||
if view and view.request and view.request.user:
|
view = self.context.get('view', None)
|
||||||
user_capabilities = get_user_capabilities(view.request.user, obj)
|
if view and view.request and view.request.user:
|
||||||
if user_capabilities:
|
user_capabilities = get_user_capabilities(view.request.user, obj, self.show_capabilities)
|
||||||
summary_fields['user_capabilities'] = user_capabilities
|
if user_capabilities:
|
||||||
|
summary_fields['user_capabilities'] = user_capabilities
|
||||||
|
|
||||||
return summary_fields
|
return summary_fields
|
||||||
|
|
||||||
@@ -502,6 +503,7 @@ class BaseFactSerializer(BaseSerializer):
|
|||||||
return ret
|
return ret
|
||||||
|
|
||||||
class UnifiedJobTemplateSerializer(BaseSerializer):
|
class UnifiedJobTemplateSerializer(BaseSerializer):
|
||||||
|
show_capabilities = ['start', 'delete']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = UnifiedJobTemplate
|
model = UnifiedJobTemplate
|
||||||
@@ -683,6 +685,7 @@ class UserSerializer(BaseSerializer):
|
|||||||
ldap_dn = serializers.CharField(source='profile.ldap_dn', read_only=True)
|
ldap_dn = serializers.CharField(source='profile.ldap_dn', read_only=True)
|
||||||
external_account = serializers.SerializerMethodField(help_text='Set if the account is managed by an external service')
|
external_account = serializers.SerializerMethodField(help_text='Set if the account is managed by an external service')
|
||||||
is_system_auditor = serializers.BooleanField(default=False)
|
is_system_auditor = serializers.BooleanField(default=False)
|
||||||
|
show_capabilities = ['edit', 'delete']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
@@ -808,6 +811,7 @@ class UserSerializer(BaseSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class OrganizationSerializer(BaseSerializer):
|
class OrganizationSerializer(BaseSerializer):
|
||||||
|
show_capabilities = ['edit', 'delete']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Organization
|
model = Organization
|
||||||
@@ -892,6 +896,7 @@ class ProjectSerializer(UnifiedJobTemplateSerializer, ProjectOptionsSerializer):
|
|||||||
status = serializers.ChoiceField(choices=Project.PROJECT_STATUS_CHOICES, read_only=True)
|
status = serializers.ChoiceField(choices=Project.PROJECT_STATUS_CHOICES, read_only=True)
|
||||||
last_update_failed = serializers.BooleanField(read_only=True)
|
last_update_failed = serializers.BooleanField(read_only=True)
|
||||||
last_updated = serializers.DateTimeField(read_only=True)
|
last_updated = serializers.DateTimeField(read_only=True)
|
||||||
|
show_capabilities = ['start', 'schedule', 'edit', 'delete']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Project
|
model = Project
|
||||||
@@ -1007,6 +1012,7 @@ class BaseSerializerWithVariables(BaseSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class InventorySerializer(BaseSerializerWithVariables):
|
class InventorySerializer(BaseSerializerWithVariables):
|
||||||
|
show_capabilities = ['edit', 'delete']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Inventory
|
model = Inventory
|
||||||
@@ -1057,6 +1063,7 @@ class InventoryDetailSerializer(InventorySerializer):
|
|||||||
|
|
||||||
|
|
||||||
class InventoryScriptSerializer(InventorySerializer):
|
class InventoryScriptSerializer(InventorySerializer):
|
||||||
|
show_capabilities = ['edit', 'delete']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
fields = ()
|
fields = ()
|
||||||
@@ -1458,6 +1465,7 @@ class InventoryUpdateCancelSerializer(InventoryUpdateSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class TeamSerializer(BaseSerializer):
|
class TeamSerializer(BaseSerializer):
|
||||||
|
show_capabilities = ['edit', 'delete']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Team
|
model = Team
|
||||||
@@ -1543,6 +1551,10 @@ class ResourceAccessListElementSerializer(UserSerializer):
|
|||||||
ret = super(ResourceAccessListElementSerializer, self).to_representation(user)
|
ret = super(ResourceAccessListElementSerializer, self).to_representation(user)
|
||||||
object_id = self.context['view'].object_id
|
object_id = self.context['view'].object_id
|
||||||
obj = self.context['view'].resource_model.objects.get(pk=object_id)
|
obj = self.context['view'].resource_model.objects.get(pk=object_id)
|
||||||
|
if self.context['view'].request is not None:
|
||||||
|
requesting_user = self.context['view'].request.user
|
||||||
|
else:
|
||||||
|
requesting_user = None
|
||||||
|
|
||||||
if 'summary_fields' not in ret:
|
if 'summary_fields' not in ret:
|
||||||
ret['summary_fields'] = {}
|
ret['summary_fields'] = {}
|
||||||
@@ -1553,6 +1565,12 @@ class ResourceAccessListElementSerializer(UserSerializer):
|
|||||||
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'] = reverse_gfk(role.content_object)
|
role_dict['related'] = reverse_gfk(role.content_object)
|
||||||
|
# Special implementation of unattach user capabilities to show/hide X in UI
|
||||||
|
role_dict['user_capabilities'] = {
|
||||||
|
'unattach': requesting_user.can_access(
|
||||||
|
type(role.content_object), 'unattach', role.content_object,
|
||||||
|
role, 'roles', data)
|
||||||
|
}
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
return { 'role': role_dict, 'descendant_roles': get_roles_on_resource(obj, role)}
|
return { 'role': role_dict, 'descendant_roles': get_roles_on_resource(obj, role)}
|
||||||
@@ -1579,8 +1597,6 @@ class ResourceAccessListElementSerializer(UserSerializer):
|
|||||||
team_content_type = ContentType.objects.get_for_model(Team)
|
team_content_type = ContentType.objects.get_for_model(Team)
|
||||||
content_type = ContentType.objects.get_for_model(obj)
|
content_type = ContentType.objects.get_for_model(obj)
|
||||||
|
|
||||||
|
|
||||||
content_type = ContentType.objects.get_for_model(obj)
|
|
||||||
direct_permissive_role_ids = Role.objects.filter(content_type=content_type, object_id=obj.id).values_list('id', flat=True)
|
direct_permissive_role_ids = Role.objects.filter(content_type=content_type, object_id=obj.id).values_list('id', flat=True)
|
||||||
all_permissive_role_ids = Role.objects.filter(content_type=content_type, object_id=obj.id).values_list('ancestors__id', flat=True)
|
all_permissive_role_ids = Role.objects.filter(content_type=content_type, object_id=obj.id).values_list('ancestors__id', flat=True)
|
||||||
|
|
||||||
@@ -1625,6 +1641,7 @@ class ResourceAccessListElementSerializer(UserSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class CredentialSerializer(BaseSerializer):
|
class CredentialSerializer(BaseSerializer):
|
||||||
|
show_capabilities = ['edit', 'delete']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Credential
|
model = Credential
|
||||||
@@ -1829,6 +1846,7 @@ class JobOptionsSerializer(BaseSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class JobTemplateSerializer(UnifiedJobTemplateSerializer, JobOptionsSerializer):
|
class JobTemplateSerializer(UnifiedJobTemplateSerializer, JobOptionsSerializer):
|
||||||
|
show_capabilities = ['start', 'schedule', 'copy', 'edit', 'delete']
|
||||||
|
|
||||||
status = serializers.ChoiceField(choices=JobTemplate.JOB_TEMPLATE_STATUS_CHOICES, read_only=True, required=False)
|
status = serializers.ChoiceField(choices=JobTemplate.JOB_TEMPLATE_STATUS_CHOICES, read_only=True, required=False)
|
||||||
|
|
||||||
@@ -2134,6 +2152,7 @@ class AdHocCommandRelaunchSerializer(AdHocCommandSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class SystemJobTemplateSerializer(UnifiedJobTemplateSerializer):
|
class SystemJobTemplateSerializer(UnifiedJobTemplateSerializer):
|
||||||
|
show_capabilities = ['start', 'schedule', 'edit']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = SystemJobTemplate
|
model = SystemJobTemplate
|
||||||
@@ -2411,6 +2430,7 @@ class JobLaunchSerializer(BaseSerializer):
|
|||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
class NotificationTemplateSerializer(BaseSerializer):
|
class NotificationTemplateSerializer(BaseSerializer):
|
||||||
|
show_capabilities = ['edit', 'delete']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = NotificationTemplate
|
model = NotificationTemplate
|
||||||
|
|||||||
@@ -219,19 +219,19 @@ class BaseAccess(object):
|
|||||||
elif "features" not in validation_info:
|
elif "features" not in validation_info:
|
||||||
raise LicenseForbids("Features not found in active license.")
|
raise LicenseForbids("Features not found in active license.")
|
||||||
|
|
||||||
def get_user_capabilities(self, obj):
|
def get_user_capabilities(self, obj, method_list=['edit', 'delete']):
|
||||||
user_capabilities = {}
|
user_capabilities = {}
|
||||||
|
|
||||||
if hasattr(obj, 'get_can_edit'):
|
# if hasattr(obj, 'get_can_edit'):
|
||||||
user_capabilities['change'] = obj.get_can_edit(self.user)
|
# user_capabilities['change'] = obj.get_can_edit(self.user)
|
||||||
elif hasattr(obj, 'can_edit'):
|
# elif hasattr(obj, 'can_edit'):
|
||||||
user_capabilities['change'] = obj.can_edit
|
# user_capabilities['change'] = obj.can_edit
|
||||||
|
|
||||||
if isinstance(obj, JobTemplate):
|
if isinstance(obj, JobTemplate):
|
||||||
user_capabilities['copy'] = self.user.can_access(type(obj), 'add', { 'reference_obj': obj })
|
user_capabilities['copy'] = self.user.can_access(type(obj), 'add', { 'reference_obj': obj })
|
||||||
print(type(obj))
|
print(type(obj))
|
||||||
|
|
||||||
for method in ['change', 'delete', 'start']:
|
for method in method_list:
|
||||||
try:
|
try:
|
||||||
if isinstance(obj, Group) and method is 'start' and obj.inventory_source:
|
if isinstance(obj, Group) and method is 'start' and obj.inventory_source:
|
||||||
obj = obj.inventory_source
|
obj = obj.inventory_source
|
||||||
|
|||||||
@@ -105,9 +105,6 @@ class ProjectOptions(models.Model):
|
|||||||
on_delete=models.SET_NULL,
|
on_delete=models.SET_NULL,
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_can_edit(self, user):
|
|
||||||
return user in self.admin_role
|
|
||||||
|
|
||||||
def clean_scm_type(self):
|
def clean_scm_type(self):
|
||||||
return self.scm_type or ''
|
return self.scm_type or ''
|
||||||
|
|
||||||
@@ -328,6 +325,9 @@ class Project(UnifiedJobTemplate, ProjectOptions, ResourceMixin):
|
|||||||
kwargs['scm_delete_on_update'] = True
|
kwargs['scm_delete_on_update'] = True
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
|
def get_can_edit(self, user):
|
||||||
|
return user in self.admin_role
|
||||||
|
|
||||||
def create_project_update(self, **kwargs):
|
def create_project_update(self, **kwargs):
|
||||||
return self.create_unified_job(**kwargs)
|
return self.create_unified_job(**kwargs)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user