AC-505 Update inventory sources list and related permissions checks.

This commit is contained in:
Chris Church
2013-10-08 00:37:19 -04:00
parent ea9e73726b
commit a9b84d4a5c
5 changed files with 28 additions and 12 deletions

View File

@@ -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.

View File

@@ -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',

View File

@@ -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,))

View File

@@ -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):

View File

@@ -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();