From fa08c8d4bb47cf7d6183dd41885c1d33fbb4b999 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Wed, 31 Aug 2016 16:53:47 -0400 Subject: [PATCH] wrap up some more implementation, and get caching seriously working --- awx/api/serializers.py | 1 - awx/api/views.py | 5 ++--- awx/main/access.py | 20 +++++++++++--------- awx/main/models/projects.py | 3 --- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 2982fe4012..1e499b5b37 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2153,7 +2153,6 @@ class AdHocCommandRelaunchSerializer(AdHocCommandSerializer): class SystemJobTemplateSerializer(UnifiedJobTemplateSerializer): - show_capabilities = ['start', 'schedule', 'edit'] class Meta: model = SystemJobTemplate diff --git a/awx/api/views.py b/awx/api/views.py index ee317285e1..7c9c8673c9 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -1528,10 +1528,9 @@ class InventoryList(ListCreateAPIView): readable_ids = [obj.id for obj in page] editable_ids = Inventory.accessible_objects(request.user, 'admin_role').filter(pk__in=readable_ids).values_list('pk', flat=True) for obj in page: + obj.capabilities_cache = {'edit': False, 'adhoc': False} if obj.pk in editable_ids: - obj.can_edit = True - else: - obj.can_edit = False + obj.capabilities_cache['edit'] = True if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) diff --git a/awx/main/access.py b/awx/main/access.py index 68565db802..9ff3564ff8 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -219,18 +219,18 @@ class BaseAccess(object): elif "features" not in validation_info: raise LicenseForbids("Features not found in active license.") - def get_user_capabilities(self, obj, method_list=['edit', 'delete']): + def get_user_capabilities(self, obj, method_list): user_capabilities = {} - # TODO: pull data from the custom cache, which won't be exactly like this - # if hasattr(obj, 'get_can_edit'): - # user_capabilities['change'] = obj.get_can_edit(self.user) - # elif hasattr(obj, 'can_edit'): - # user_capabilities['change'] = obj.can_edit - - for display_method in ['edit', 'delete', 'start', 'schedule', 'copy']: + for display_method in ['edit', 'delete', 'start', 'schedule', 'copy', 'adhoc']: # Custom ordering of methods used so we can reuse earlier calcs if display_method not in method_list: + print ' Programming error: declared unavailable method' + continue + + # Grab the answer from the cache, if available + if hasattr(obj, 'capabilities_cache') and display_method in obj.capabilities_cache: + user_capabilities[display_method] = obj.capabilities_cache[display_method] continue # Aliases for going form UI language to API language @@ -245,6 +245,8 @@ class BaseAccess(object): elif display_method == 'delete' and not isinstance(obj, (User, UnifiedJob)): user_capabilities['delete'] = user_capabilities['edit'] continue + elif display_method == 'adhoc': + method = 'run_ad_hoc_commands' else: method = display_method @@ -268,7 +270,7 @@ class BaseAccess(object): try: if method in ['change']: # 3 args user_capabilities[display_method] = self.user.can_access(type(obj), method, obj, data) - elif method in ['delete', 'start']: # 2 args + elif method in ['delete', 'start', 'adhoc']: # 2 args user_capabilities[display_method] = self.user.can_access(type(obj), method, obj) elif method in ['add']: # 2 args with data user_capabilities[display_method] = self.user.can_access(type(obj), method, data) diff --git a/awx/main/models/projects.py b/awx/main/models/projects.py index a07e1f24ed..93c4a42e36 100644 --- a/awx/main/models/projects.py +++ b/awx/main/models/projects.py @@ -325,9 +325,6 @@ class Project(UnifiedJobTemplate, ProjectOptions, ResourceMixin): kwargs['scm_delete_on_update'] = True return kwargs - def get_can_edit(self, user): - return user in self.admin_role - def create_project_update(self, **kwargs): return self.create_unified_job(**kwargs)