2013-04-02 00:04:27 +04:00
# Copyright (c) 2013 AnsibleWorks, Inc.
2013-03-24 02:43:11 +04:00
#
# This file is part of Ansible Commander
#
# Ansible Commander is free software: you can redistribute it and/or modify
2013-04-02 00:04:27 +04:00
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
2013-03-24 02:43:11 +04:00
#
2013-04-02 00:04:27 +04:00
# This program is distributed in the hope that it will be useful,
2013-03-24 02:43:11 +04:00
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2013-04-02 00:04:27 +04:00
# GNU Affero General Public License for more details.
2013-03-24 02:43:11 +04:00
#
2013-04-02 00:04:27 +04:00
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2013-03-24 02:43:11 +04:00
2013-03-20 06:26:35 +04:00
from django . http import HttpResponse
from django . views . decorators . csrf import csrf_exempt
from lib . main . models import *
2013-03-22 19:35:26 +04:00
from django . contrib . auth . models import User
2013-03-20 06:26:35 +04:00
from lib . main . serializers import *
2013-03-21 08:34:59 +04:00
from lib . main . rbac import *
2013-03-21 22:20:59 +04:00
from django . core . exceptions import PermissionDenied
2013-03-20 06:26:35 +04:00
from rest_framework import mixins
from rest_framework import generics
from rest_framework import permissions
2013-03-22 17:50:42 +04:00
from rest_framework . response import Response
from rest_framework import status
2013-03-21 18:25:49 +04:00
import exceptions
2013-03-21 22:20:59 +04:00
import datetime
2013-03-27 06:24:03 +04:00
from base_views import *
2013-03-21 22:20:59 +04:00
class OrganizationsList ( BaseList ) :
2013-03-20 06:26:35 +04:00
model = Organization
serializer_class = OrganizationSerializer
permission_classes = ( CustomRbac , )
2013-03-21 23:43:35 +04:00
# I can see the organizations if:
# I am a superuser
2013-04-02 22:59:58 +04:00
# I am an admin of the organization
2013-03-21 23:43:35 +04:00
# I am a member of the organization
2013-04-02 22:59:58 +04:00
2013-03-21 22:20:59 +04:00
def _get_queryset ( self ) :
2013-03-23 23:34:16 +04:00
''' I can see organizations when I am a superuser, or I am an admin or user in that organization '''
base = Organization . objects
2013-03-21 07:14:09 +04:00
if self . request . user . is_superuser :
2013-03-23 23:34:16 +04:00
return base . all ( )
return base . filter (
2013-03-22 19:35:26 +04:00
admins__in = [ self . request . user ]
2013-03-23 23:34:16 +04:00
) . distinct ( ) | base . filter (
2013-03-22 19:35:26 +04:00
users__in = [ self . request . user ]
2013-03-21 22:20:59 +04:00
) . distinct ( )
class OrganizationsDetail ( BaseDetail ) :
2013-03-21 18:25:49 +04:00
2013-03-20 06:26:35 +04:00
model = Organization
serializer_class = OrganizationSerializer
permission_classes = ( CustomRbac , )
2013-03-24 00:50:25 +04:00
class OrganizationsAuditTrailList ( BaseSubList ) :
2013-03-21 23:43:35 +04:00
model = AuditTrail
serializer_class = AuditTrailSerializer
permission_classes = ( CustomRbac , )
2013-03-24 00:50:25 +04:00
parent_model = Organization
relationship = ' audit_trail '
postable = False
def _get_queryset ( self ) :
''' to list tags in the organization, I must be a superuser or org admin '''
organization = Organization . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not ( self . request . user . is_superuser or self . request . user in organization . admins . all ( ) ) :
# FIXME: use: organization.can_user_administrate(self.request.user)
raise PermissionDenied ( )
2013-03-24 01:07:24 +04:00
return AuditTrail . objects . filter ( organization_by_audit_trail__in = [ organization ] )
2013-03-24 00:50:25 +04:00
2013-03-21 23:43:35 +04:00
2013-03-24 00:03:17 +04:00
class OrganizationsUsersList ( BaseSubList ) :
2013-04-02 22:59:58 +04:00
2013-03-21 23:43:35 +04:00
model = User
serializer_class = UserSerializer
permission_classes = ( CustomRbac , )
2013-03-24 00:03:17 +04:00
parent_model = Organization
relationship = ' users '
2013-03-24 00:50:25 +04:00
postable = True
2013-03-27 02:26:40 +04:00
inject_primary_key_on_post_as = ' organization '
2013-03-24 00:03:17 +04:00
2013-03-21 23:43:35 +04:00
def _get_queryset ( self ) :
2013-03-23 23:34:16 +04:00
''' to list users in the organization, I must be a superuser or org admin '''
organization = Organization . objects . get ( pk = self . kwargs [ ' pk ' ] )
2013-03-23 23:43:59 +04:00
if not self . request . user . is_superuser and not self . request . user in organization . admins . all ( ) :
2013-03-23 23:34:16 +04:00
raise PermissionDenied ( )
return User . objects . filter ( organizations__in = [ organization ] )
2013-03-21 23:11:47 +04:00
2013-03-24 00:03:17 +04:00
class OrganizationsAdminsList ( BaseSubList ) :
2013-04-02 22:59:58 +04:00
2013-03-21 23:43:35 +04:00
model = User
serializer_class = UserSerializer
permission_classes = ( CustomRbac , )
2013-03-24 00:03:17 +04:00
parent_model = Organization
relationship = ' admins '
2013-03-24 00:50:25 +04:00
postable = True
2013-03-27 02:26:40 +04:00
inject_primary_key_on_post_as = ' organization '
2013-03-21 23:43:35 +04:00
def _get_queryset ( self ) :
2013-03-23 23:34:16 +04:00
''' to list admins in the organization, I must be a superuser or org admin '''
organization = Organization . objects . get ( pk = self . kwargs [ ' pk ' ] )
2013-03-23 23:43:59 +04:00
if not self . request . user . is_superuser and not self . request . user in organization . admins . all ( ) :
2013-03-23 23:34:16 +04:00
raise PermissionDenied ( )
2013-03-23 23:43:59 +04:00
return User . objects . filter ( admin_of_organizations__in = [ organization ] )
2013-03-21 23:11:47 +04:00
2013-03-23 00:52:44 +04:00
class OrganizationsProjectsList ( BaseSubList ) :
2013-04-02 22:59:58 +04:00
2013-03-22 01:38:53 +04:00
model = Project
serializer_class = ProjectSerializer
permission_classes = ( CustomRbac , )
2013-03-23 02:16:40 +04:00
parent_model = Organization # for sub list
relationship = ' projects ' # " "
2013-03-24 00:50:25 +04:00
postable = True
2013-03-27 02:26:40 +04:00
inject_primary_key_on_post_as = ' organization '
2013-04-02 22:59:58 +04:00
2013-03-21 23:43:35 +04:00
def _get_queryset ( self ) :
2013-03-23 23:34:16 +04:00
''' to list projects in the organization, I must be a superuser or org admin '''
organization = Organization . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not ( self . request . user . is_superuser or self . request . user in organization . admins . all ( ) ) :
raise PermissionDenied ( )
return Project . objects . filter ( organizations__in = [ organization ] )
2013-03-21 23:11:47 +04:00
2013-03-24 00:34:52 +04:00
class OrganizationsTagsList ( BaseSubList ) :
2013-04-02 22:59:58 +04:00
2013-03-24 00:03:17 +04:00
model = Tag
serializer_class = TagSerializer
permission_classes = ( CustomRbac , )
parent_model = Organization # for sub list
relationship = ' tags ' # " "
2013-03-24 00:50:25 +04:00
postable = True
2013-03-27 02:26:40 +04:00
inject_primary_key_on_post_as = ' organization '
2013-03-24 00:03:17 +04:00
def _get_queryset ( self ) :
''' to list tags in the organization, I must be a superuser or org admin '''
organization = Organization . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not ( self . request . user . is_superuser or self . request . user in organization . admins . all ( ) ) :
# FIXME: use: organization.can_user_administrate(self.request.user)
raise PermissionDenied ( )
return Tag . objects . filter ( organization_by_tag__in = [ organization ] )
2013-03-21 23:11:47 +04:00
2013-04-02 01:44:06 +04:00
class OrganizationsTeamsList ( BaseSubList ) :
2013-04-02 22:59:58 +04:00
2013-04-02 01:44:06 +04:00
model = Team
serializer_class = TeamSerializer
permission_classes = ( CustomRbac , )
parent_model = Organization
relationship = ' teams '
postable = True
inject_primary_key_on_post_as = ' organization '
severable = False
def _get_queryset ( self ) :
''' to list users in the organization, I must be a superuser or org admin '''
organization = Organization . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not self . request . user . is_superuser and not self . request . user in organization . admins . all ( ) :
raise PermissionDenied ( )
return Team . objects . filter ( organization = organization )
2013-04-01 06:18:39 +04:00
class TeamsList ( BaseList ) :
model = Team
serializer_class = TeamSerializer
permission_classes = ( CustomRbac , )
# I can see a team if:
# I am a superuser
# I am an admin of the organization that the team is
# I am on that team
2013-04-02 22:59:58 +04:00
2013-04-01 06:18:39 +04:00
def _get_queryset ( self ) :
''' I can see organizations when I am a superuser, or I am an admin or user in that organization '''
base = Team . objects
if self . request . user . is_superuser :
return base . all ( )
return base . filter (
admins__in = [ self . request . user ]
) . distinct ( ) | base . filter (
users__in = [ self . request . user ]
) . distinct ( )
class TeamsDetail ( BaseDetail ) :
model = Team
serializer_class = TeamSerializer
permission_classes = ( CustomRbac , )
2013-04-02 02:19:37 +04:00
class TeamsUsersList ( BaseSubList ) :
2013-04-02 22:59:58 +04:00
2013-04-02 02:19:37 +04:00
model = User
serializer_class = UserSerializer
permission_classes = ( CustomRbac , )
parent_model = Team
relationship = ' users '
postable = True
inject_primary_key_on_post_as = ' team '
severable = True
def _get_queryset ( self ) :
# FIXME: audit all BaseSubLists to check for permissions on the original object too
' team members can see the whole team, as can org admins or superusers '
team = Team . objects . get ( pk = self . kwargs [ ' pk ' ] )
base = team . users . all ( )
if self . request . user . is_superuser or self . request . user in team . organization . admins . all ( ) :
return base
if self . request . user in team . users . all ( ) :
return base
raise PermissionDenied ( )
2013-04-04 20:38:41 +04:00
class TeamsCredentialsList ( BaseSubList ) :
model = Credential
serializer_class = CredentialSerializer
permission_classes = ( CustomRbac , )
parent_model = Team
relationship = ' credentials '
postable = True
inject_primary_key_on_post_as = ' team '
def _get_queryset ( self ) :
team = Team . objects . get ( pk = self . kwargs [ ' pk ' ] )
2013-04-04 23:50:56 +04:00
if not Team . can_user_administrate ( self . request . user , team ) :
if not ( self . request . user . is_superuser or self . request . user in team . users . all ( ) ) :
raise PermissionDenied ( )
2013-04-04 20:38:41 +04:00
project_credentials = Credential . objects . filter (
2013-04-04 23:50:56 +04:00
team = team
2013-04-04 20:38:41 +04:00
)
2013-04-04 23:50:56 +04:00
return project_credentials . distinct ( )
2013-04-04 20:38:41 +04:00
2013-04-01 04:02:56 +04:00
class ProjectsList ( BaseList ) :
model = Project
serializer_class = ProjectSerializer
permission_classes = ( CustomRbac , )
# I can see a project if
# I am a superuser
# I am an admin of the organization that contains the project
# I am a member of a team that also contains the project
2013-04-02 22:59:58 +04:00
2013-04-01 04:02:56 +04:00
def _get_queryset ( self ) :
''' I can see organizations when I am a superuser, or I am an admin or user in that organization '''
base = Project . objects
if self . request . user . is_superuser :
return base . all ( )
my_teams = Team . objects . filter ( users__in = [ self . request . user ] )
my_orgs = Organization . objects . filter ( admins__in = [ self . request . user ] )
return base . filter (
teams__in = my_teams
) . distinct ( ) | base . filter (
organizations__in = my_orgs
) . distinct ( )
2013-03-22 01:38:53 +04:00
class ProjectsDetail ( BaseDetail ) :
model = Project
serializer_class = ProjectSerializer
permission_classes = ( CustomRbac , )
2013-04-01 06:04:52 +04:00
class ProjectsOrganizationsList ( BaseSubList ) :
model = Organization
serializer_class = OrganizationSerializer
permission_classes = ( CustomRbac , )
parent_model = Project
relationship = ' organizations '
postable = False
def _get_queryset ( self ) :
project = Project . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not self . request . user . is_superuser :
raise PermissionDenied ( )
return Organization . objects . filter ( projects__in = [ project ] )
2013-03-24 00:03:17 +04:00
class TagsDetail ( BaseDetail ) :
model = Tag
serializer_class = TagSerializer
permission_classes = ( CustomRbac , )
2013-03-22 01:38:53 +04:00
2013-03-24 20:36:42 +04:00
class UsersList ( BaseList ) :
2013-03-21 23:11:47 +04:00
2013-03-24 20:36:42 +04:00
model = User
serializer_class = UserSerializer
permission_classes = ( CustomRbac , )
2013-03-24 21:31:46 +04:00
def post ( self , request , * args , * * kwargs ) :
password = request . DATA . get ( ' password ' , None )
result = super ( UsersList , self ) . post ( request , * args , * * kwargs )
if password :
pk = result . data [ ' id ' ]
user = User . objects . get ( pk = pk )
user . set_password ( password )
user . save ( )
2013-04-02 22:59:58 +04:00
return result
2013-03-24 21:31:46 +04:00
2013-03-24 20:36:42 +04:00
def _get_queryset ( self ) :
''' I can see user records when I ' m a superuser, I ' m that user, I ' m their org admin, or I ' m on a team with that user '''
base = User . objects
if self . request . user . is_superuser :
return base . all ( )
2013-04-02 22:59:58 +04:00
mine = base . filter ( pk = self . request . user . pk ) . distinct ( )
admin_of = base . filter ( organizations__in = self . request . user . admin_of_organizations . all ( ) ) . distinct ( )
2013-03-24 21:31:46 +04:00
same_team = base . filter ( teams__in = self . request . user . teams . all ( ) ) . distinct ( )
return mine | admin_of | same_team
2013-03-24 20:36:42 +04:00
2013-03-24 22:23:37 +04:00
class UsersMeList ( BaseList ) :
model = User
serializer_class = UserSerializer
permission_classes = ( CustomRbac , )
def post ( self , request , * args , * * kwargs ) :
raise PermissionDenied ( )
def _get_queryset ( self ) :
''' a quick way to find my user record '''
return User . objects . filter ( pk = self . request . user . pk )
2013-03-24 23:00:01 +04:00
class UsersTeamsList ( BaseSubList ) :
model = Team
serializer_class = TeamSerializer
permission_classes = ( CustomRbac , )
parent_model = User
relationship = ' teams '
postable = False
def _get_queryset ( self ) :
user = User . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not UserHelper . can_user_administrate ( self . request . user , user ) :
raise PermissionDenied ( )
return Team . objects . filter ( users__in = [ user ] )
2013-04-02 03:43:14 +04:00
class UsersProjectsList ( BaseSubList ) :
model = Project
serializer_class = ProjectSerializer
permission_classes = ( CustomRbac , )
parent_model = User
relationship = ' teams '
postable = False
def _get_queryset ( self ) :
user = User . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not UserHelper . can_user_administrate ( self . request . user , user ) :
raise PermissionDenied ( )
teams = user . teams . all ( )
return Project . objects . filter ( teams__in = teams )
2013-04-02 04:38:03 +04:00
class UsersCredentialsList ( BaseSubList ) :
model = Credential
serializer_class = CredentialSerializer
permission_classes = ( CustomRbac , )
parent_model = User
relationship = ' credentials '
postable = True
inject_primary_key_on_post_as = ' user '
def _get_queryset ( self ) :
user = User . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not UserHelper . can_user_administrate ( self . request . user , user ) :
raise PermissionDenied ( )
project_credentials = Credential . objects . filter (
2013-04-04 22:41:31 +04:00
team__users__in = [ user ]
2013-04-02 04:38:03 +04:00
)
return user . credentials . distinct ( ) | project_credentials . distinct ( )
2013-03-24 23:00:01 +04:00
class UsersOrganizationsList ( BaseSubList ) :
model = Organization
serializer_class = OrganizationSerializer
permission_classes = ( CustomRbac , )
parent_model = User
relationship = ' organizations '
postable = False
2013-04-02 22:59:58 +04:00
2013-03-24 23:00:01 +04:00
def _get_queryset ( self ) :
user = User . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not UserHelper . can_user_administrate ( self . request . user , user ) :
raise PermissionDenied ( )
return Organization . objects . filter ( users__in = [ user ] )
class UsersAdminOrganizationsList ( BaseSubList ) :
model = Organization
serializer_class = OrganizationSerializer
permission_classes = ( CustomRbac , )
parent_model = User
relationship = ' admin_of_organizations '
postable = False
def _get_queryset ( self ) :
user = User . objects . get ( pk = self . kwargs [ ' pk ' ] )
if not UserHelper . can_user_administrate ( self . request . user , user ) :
raise PermissionDenied ( )
return Organization . objects . filter ( admins__in = [ user ] )
2013-03-24 20:36:42 +04:00
class UsersDetail ( BaseDetail ) :
model = User
serializer_class = UserSerializer
permission_classes = ( CustomRbac , )
def put_filter ( self , request , * args , * * kwargs ) :
2013-04-02 22:59:58 +04:00
''' make sure non-read-only fields that can only be edited by admins, are only edited by admins '''
2013-03-24 20:36:42 +04:00
obj = User . objects . get ( pk = kwargs [ ' pk ' ] )
if EditHelper . illegal_changes ( request , obj , UserHelper ) :
raise PermissionDenied ( )
if ' password ' in request . DATA :
obj . set_password ( request . DATA [ ' password ' ] )
obj . save ( )
request . DATA . pop ( ' password ' )
2013-03-26 00:41:21 +04:00
2013-04-02 22:59:58 +04:00
class CredentialsDetail ( BaseDetail ) :
model = Credential
serializer_class = CredentialSerializer
permission_classes = ( CustomRbac , )
2013-03-26 00:41:21 +04:00
class InventoryList ( BaseList ) :
model = Inventory
serializer_class = InventorySerializer
permission_classes = ( CustomRbac , )
2013-03-27 02:18:05 +04:00
def _filter_queryset ( self , base ) :
2013-03-26 00:41:21 +04:00
if self . request . user . is_superuser :
return base . all ( )
admin_of = base . filter ( organization__admins__in = [ self . request . user ] ) . distinct ( )
2013-03-26 01:36:51 +04:00
has_user_perms = base . filter (
2013-03-26 00:41:21 +04:00
permissions__user__in = [ self . request . user ] ,
permissions__permission_type__in = PERMISSION_TYPES_ALLOWING_INVENTORY_READ ,
) . distinct ( )
2013-03-26 01:36:51 +04:00
has_team_perms = base . filter (
permissions__team__in = self . request . user . teams . all ( ) ,
permissions__permission_type__in = PERMISSION_TYPES_ALLOWING_INVENTORY_READ ,
) . distinct ( )
return admin_of | has_user_perms | has_team_perms
2013-03-26 00:41:21 +04:00
2013-03-27 02:18:05 +04:00
def _get_queryset ( self ) :
''' I can see inventory when I ' m a superuser, an org admin of the inventory, or I have permissions on it '''
base = Inventory . objects
return self . _filter_queryset ( base )
2013-03-26 00:41:21 +04:00
class InventoryDetail ( BaseDetail ) :
model = Inventory
serializer_class = InventorySerializer
permission_classes = ( CustomRbac , )
2013-03-26 22:44:12 +04:00
class HostsList ( BaseList ) :
model = Host
serializer_class = HostSerializer
permission_classes = ( CustomRbac , )
def _get_queryset ( self ) :
2013-04-02 22:59:58 +04:00
'''
2013-03-26 22:44:12 +04:00
I can see hosts when :
2013-04-02 22:59:58 +04:00
I ' m a superuser,
2013-03-26 22:44:12 +04:00
or an organization admin of an inventory they are in
or when I have allowing read permissions via a user or team on an inventory they are in
'''
base = Host . objects
if self . request . user . is_superuser :
return base . all ( )
admin_of = base . filter ( inventory__organization__admins__in = [ self . request . user ] ) . distinct ( )
has_user_perms = base . filter (
inventory__permissions__user__in = [ self . request . user ] ,
inventory__permissions__permission_type__in = PERMISSION_TYPES_ALLOWING_INVENTORY_READ ,
) . distinct ( )
has_team_perms = base . filter (
inventory__permissions__team__in = self . request . user . teams . all ( ) ,
inventory__permissions__permission_type__in = PERMISSION_TYPES_ALLOWING_INVENTORY_READ ,
) . distinct ( )
return admin_of | has_user_perms | has_team_perms
class HostsDetail ( BaseDetail ) :
model = Host
serializer_class = HostSerializer
permission_classes = ( CustomRbac , )
2013-03-27 02:18:05 +04:00
class InventoryHostsList ( BaseSubList ) :
model = Host
serializer_class = HostSerializer
permission_classes = ( CustomRbac , )
# to allow the sub-aspect listing
parent_model = Inventory
relationship = ' hosts '
# to allow posting to this resource to create resources
postable = True
# FIXME: go back and add these to other SubLists
inject_primary_key_on_post_as = ' inventory '
2013-03-28 02:54:30 +04:00
severable = False
2013-03-27 02:18:05 +04:00
def _get_queryset ( self ) :
2013-03-28 02:54:30 +04:00
inventory = Inventory . objects . get ( pk = self . kwargs [ ' pk ' ] )
base = inventory . hosts
# FIXME: verify that you can can_read permission on the inventory is required
return base . all ( )
2013-03-27 02:18:05 +04:00
2013-03-27 00:57:08 +04:00
class GroupsList ( BaseList ) :
model = Group
serializer_class = GroupSerializer
permission_classes = ( CustomRbac , )
def _get_queryset ( self ) :
'''
I can see groups when :
I ' m a superuser,
or an organization admin of an inventory they are in
or when I have allowing read permissions via a user or team on an inventory they are in
'''
base = Groups . objects
if self . request . user . is_superuser :
return base . all ( )
admin_of = base . filter ( inventory__organization__admins__in = [ self . request . user ] ) . distinct ( )
2013-03-28 02:17:21 +04:00
has_user_perms = base . filter (
inventory__permissions__user__in = [ self . request . user ] ,
inventory__permissions__permission_type__in = PERMISSION_TYPES_ALLOWING_INVENTORY_READ ,
) . distinct ( )
has_team_perms = base . filter (
inventory__permissions__team__in = self . request . user . teams . all ( ) ,
inventory__permissions__permission_type__in = PERMISSION_TYPES_ALLOWING_INVENTORY_READ ,
) . distinct ( )
return admin_of | has_user_perms | has_team_perms
class GroupsChildrenList ( BaseSubList ) :
model = Group
serializer_class = GroupSerializer
permission_classes = ( CustomRbac , )
parent_model = Group
relationship = ' children '
postable = True
inject_primary_key_on_post_as = ' parent '
def _get_queryset ( self ) :
# FIXME: this is the mostly the same as GroupsList, share code similar to how done with Host and Group objects.
2013-04-02 22:59:58 +04:00
2013-03-28 02:17:21 +04:00
parent = Group . objects . get ( pk = self . kwargs [ ' pk ' ] )
# FIXME: verify read permissions on this object are still required at a higher level
base = parent . children
if self . request . user . is_superuser :
return base . all ( )
admin_of = base . filter ( inventory__organization__admins__in = [ self . request . user ] ) . distinct ( )
2013-03-27 00:57:08 +04:00
has_user_perms = base . filter (
inventory__permissions__user__in = [ self . request . user ] ,
inventory__permissions__permission_type__in = PERMISSION_TYPES_ALLOWING_INVENTORY_READ ,
) . distinct ( )
has_team_perms = base . filter (
inventory__permissions__team__in = self . request . user . teams . all ( ) ,
inventory__permissions__permission_type__in = PERMISSION_TYPES_ALLOWING_INVENTORY_READ ,
) . distinct ( )
return admin_of | has_user_perms | has_team_perms
class GroupsDetail ( BaseDetail ) :
model = Group
serializer_class = GroupSerializer
permission_classes = ( CustomRbac , )
2013-03-27 03:21:18 +04:00
class InventoryGroupsList ( BaseSubList ) :
model = Group
serializer_class = GroupSerializer
permission_classes = ( CustomRbac , )
# to allow the sub-aspect listing
parent_model = Inventory
relationship = ' groups '
# to allow posting to this resource to create resources
postable = True
# FIXME: go back and add these to other SubLists
inject_primary_key_on_post_as = ' inventory '
2013-03-28 02:54:30 +04:00
severable = False
2013-03-27 03:21:18 +04:00
def _get_queryset ( self ) :
2013-03-28 02:54:30 +04:00
# FIXME: share code with inventory filter queryset methods (make that a classmethod)
inventory = Inventory . objects . get ( pk = self . kwargs [ ' pk ' ] )
base = inventory . groups
# FIXME: verify that you can can_read permission on the inventory is required
return base
2013-03-27 03:21:18 +04:00
2013-03-27 06:24:03 +04:00
class GroupsVariableDetail ( VariableBaseDetail ) :
model = VariableData
serializer_class = VariableDataSerializer
permission_classes = ( CustomRbac , )
parent_model = Group
reverse_relationship = ' variable_data '
relationship = ' group '
class HostsVariableDetail ( VariableBaseDetail ) :
model = VariableData
serializer_class = VariableDataSerializer
permission_classes = ( CustomRbac , )
parent_model = Host
reverse_relationship = ' variable_data '
relationship = ' host '
class VariableDetail ( BaseDetail ) :
model = VariableData
serializer_class = VariableDataSerializer
permission_classes = ( CustomRbac , )
def put ( self , request , * args , * * kwargs ) :
raise PermissionDenied ( )
2013-03-26 22:44:12 +04:00