mirror of
https://github.com/ansible/awx.git
synced 2026-03-05 02:31:03 -03:30
AC-505 Update inventory sources list and related permissions checks.
This commit is contained in:
@@ -430,7 +430,7 @@ class GroupAccess(BaseAccess):
|
|||||||
|
|
||||||
class InventorySourceAccess(BaseAccess):
|
class InventorySourceAccess(BaseAccess):
|
||||||
'''
|
'''
|
||||||
I can see inventory sources whenever I can see their group.
|
I can see inventory sources whenever I can see their group or inventory.
|
||||||
I can change inventory sources whenever I can change their group.
|
I can change inventory sources whenever I can change their group.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
@@ -439,11 +439,17 @@ class InventorySourceAccess(BaseAccess):
|
|||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(active=True).distinct()
|
qs = self.model.objects.filter(active=True).distinct()
|
||||||
qs = qs.select_related('created_by', 'group')
|
qs = qs.select_related('created_by', 'group')
|
||||||
groups_qs = self.user.get_queryset(Group)
|
inventories_qs = self.user.get_queryset(Inventory)
|
||||||
return qs.filter(group__in=groups_qs)
|
return qs.filter(Q(inventory__in=inventories_qs) |
|
||||||
|
Q(group__inventory__in=inventories_qs))
|
||||||
|
|
||||||
def can_read(self, obj):
|
def can_read(self, obj):
|
||||||
return obj and self.user.can_access(Group, 'read', obj.group)
|
if obj and obj.group:
|
||||||
|
return self.user.can_access(Group, 'read', obj.group)
|
||||||
|
elif obj and obj.inventory:
|
||||||
|
return self.user.can_access(Inventory, 'read', obj.inventory)
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
def can_add(self, data):
|
def can_add(self, data):
|
||||||
# Automatically created from group or management command.
|
# Automatically created from group or management command.
|
||||||
|
|||||||
@@ -537,6 +537,7 @@ class InventorySource(PrimordialModel):
|
|||||||
related_name='inventory_sources',
|
related_name='inventory_sources',
|
||||||
null=True,
|
null=True,
|
||||||
default=None,
|
default=None,
|
||||||
|
editable=False,
|
||||||
)
|
)
|
||||||
group = AutoOneToOneField(
|
group = AutoOneToOneField(
|
||||||
'Group',
|
'Group',
|
||||||
|
|||||||
@@ -43,10 +43,13 @@ SUMMARIZABLE_FK_FIELDS = {
|
|||||||
'user': ('username', 'first_name', 'last_name'),
|
'user': ('username', 'first_name', 'last_name'),
|
||||||
'team': DEFAULT_SUMMARY_FIELDS,
|
'team': DEFAULT_SUMMARY_FIELDS,
|
||||||
'inventory': DEFAULT_SUMMARY_FIELDS + ('has_active_failures',
|
'inventory': DEFAULT_SUMMARY_FIELDS + ('has_active_failures',
|
||||||
'hosts_with_active_failures'),
|
'hosts_with_active_failures',
|
||||||
'host': DEFAULT_SUMMARY_FIELDS + ('has_active_failures',),
|
'has_inventory_sources'),
|
||||||
|
'host': DEFAULT_SUMMARY_FIELDS + ('has_active_failures',
|
||||||
|
'has_inventory_sources'),
|
||||||
'group': DEFAULT_SUMMARY_FIELDS + ('has_active_failures',
|
'group': DEFAULT_SUMMARY_FIELDS + ('has_active_failures',
|
||||||
'hosts_with_active_failures'),
|
'hosts_with_active_failures',
|
||||||
|
'has_inventory_sources'),
|
||||||
'project': DEFAULT_SUMMARY_FIELDS + ('status',),
|
'project': DEFAULT_SUMMARY_FIELDS + ('status',),
|
||||||
'credential': DEFAULT_SUMMARY_FIELDS,
|
'credential': DEFAULT_SUMMARY_FIELDS,
|
||||||
'permission': DEFAULT_SUMMARY_FIELDS,
|
'permission': DEFAULT_SUMMARY_FIELDS,
|
||||||
@@ -539,7 +542,8 @@ class GroupSerializer(BaseSerializerWithVariables):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = Group
|
model = Group
|
||||||
fields = BASE_FIELDS + ('inventory', 'variables', 'has_active_failures',
|
fields = BASE_FIELDS + ('inventory', 'variables', 'has_active_failures',
|
||||||
'hosts_with_active_failures')
|
'hosts_with_active_failures',
|
||||||
|
'has_inventory_sources')
|
||||||
|
|
||||||
def get_related(self, obj):
|
def get_related(self, obj):
|
||||||
if obj is None:
|
if obj is None:
|
||||||
@@ -621,7 +625,7 @@ class InventorySourceSerializer(BaseSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = InventorySource
|
model = InventorySource
|
||||||
fields = ('id', 'url', 'related', 'summary_fields', 'created',
|
fields = ('id', 'url', 'related', 'summary_fields', 'created',
|
||||||
'modified', 'group', 'source', 'source_path',
|
'modified', 'inventory', 'group', 'source', 'source_path',
|
||||||
'source_vars', 'source_username', 'source_password',
|
'source_vars', 'source_username', 'source_password',
|
||||||
'source_regions', 'source_tags', 'overwrite',
|
'source_regions', 'source_tags', 'overwrite',
|
||||||
'overwrite_vars', 'update_on_launch', 'update_interval',
|
'overwrite_vars', 'update_on_launch', 'update_interval',
|
||||||
@@ -655,12 +659,15 @@ class InventorySourceSerializer(BaseSerializer):
|
|||||||
return {}
|
return {}
|
||||||
res = super(InventorySourceSerializer, self).get_related(obj)
|
res = super(InventorySourceSerializer, self).get_related(obj)
|
||||||
res.update(dict(
|
res.update(dict(
|
||||||
group = reverse('main:group_detail', args=(obj.group.pk,)),
|
|
||||||
update = reverse('main:inventory_source_update_view', args=(obj.pk,)),
|
update = reverse('main:inventory_source_update_view', args=(obj.pk,)),
|
||||||
inventory_updates = reverse('main:inventory_source_updates_list', args=(obj.pk,)),
|
inventory_updates = reverse('main:inventory_source_updates_list', args=(obj.pk,)),
|
||||||
#hosts = reverse('main:inventory_source_hosts_list', args=(obj.pk,)),
|
#hosts = reverse('main:inventory_source_hosts_list', args=(obj.pk,)),
|
||||||
#groups = reverse('main:inventory_source_groups_list', args=(obj.pk,)),
|
#groups = reverse('main:inventory_source_groups_list', args=(obj.pk,)),
|
||||||
))
|
))
|
||||||
|
if obj.inventory:
|
||||||
|
res['inventory'] = reverse('main:inventory_detail', args=(obj.inventory.pk,))
|
||||||
|
if obj.group:
|
||||||
|
res['group'] = reverse('main:group_detail', args=(obj.group.pk,))
|
||||||
if obj.current_update:
|
if obj.current_update:
|
||||||
res['current_update'] = reverse('main:inventory_update_detail',
|
res['current_update'] = reverse('main:inventory_update_detail',
|
||||||
args=(obj.current_update.pk,))
|
args=(obj.current_update.pk,))
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import sys
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
|
from django.db.models import Q
|
||||||
from django.shortcuts import get_object_or_404, render_to_response
|
from django.shortcuts import get_object_or_404, render_to_response
|
||||||
from django.template import RequestContext
|
from django.template import RequestContext
|
||||||
from django.utils.datastructures import SortedDict
|
from django.utils.datastructures import SortedDict
|
||||||
@@ -713,7 +714,8 @@ class InventoryInventorySourcesList(SubListAPIView):
|
|||||||
parent = self.get_parent_object()
|
parent = self.get_parent_object()
|
||||||
self.check_parent_access(parent)
|
self.check_parent_access(parent)
|
||||||
qs = self.request.user.get_queryset(self.model)
|
qs = self.request.user.get_queryset(self.model)
|
||||||
return qs.filter(group__inventory__pk=parent.pk)
|
return qs.filter(Q(inventory__pk=parent.pk) |
|
||||||
|
Q(group__inventory__pk=parent.pk))
|
||||||
|
|
||||||
class InventorySourceDetail(RetrieveUpdateAPIView):
|
class InventorySourceDetail(RetrieveUpdateAPIView):
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
|
|||||||
var view = GenerateList;
|
var view = GenerateList;
|
||||||
var list = InventorySummary;
|
var list = InventorySummary;
|
||||||
var scope = view.inject(InventorySummary, { mode: 'summary', id: 'tree-form', breadCrumbs: false });
|
var scope = view.inject(InventorySummary, { mode: 'summary', id: 'tree-form', breadCrumbs: false });
|
||||||
var defaultUrl = GetBasePath('inventory') + scope['inventory_id'] + '/inventory_sources/';
|
var defaultUrl = GetBasePath('inventory') + scope['inventory_id'] + '/inventory_sources/?group__isnull=false';
|
||||||
|
|
||||||
if (scope.PostRefreshRemove) {
|
if (scope.PostRefreshRemove) {
|
||||||
scope.PostRefreshRemove();
|
scope.PostRefreshRemove();
|
||||||
|
|||||||
Reference in New Issue
Block a user