From e3a731bb9e2c076e6604df029d66ce4e87e9805a Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Thu, 30 Nov 2017 12:22:26 -0500 Subject: [PATCH] apply listview optimizations to detail view --- awx/api/generics.py | 12 +++++++++--- awx/main/access.py | 11 ++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/awx/api/generics.py b/awx/api/generics.py index dfd0f30e6a..73c8ddd1db 100644 --- a/awx/api/generics.py +++ b/awx/api/generics.py @@ -30,6 +30,7 @@ from rest_framework import views # AWX from awx.api.filters import FieldLookupBackend from awx.main.models import * # noqa +from awx.main.access import access_registry from awx.main.utils import * # noqa from awx.main.utils.db import get_all_field_names from awx.api.serializers import ResourceAccessListElementSerializer @@ -273,12 +274,17 @@ class GenericAPIView(generics.GenericAPIView, APIView): return serializer def get_queryset(self): - #if hasattr(self.request.user, 'get_queryset'): - # return self.request.user.get_queryset(self.model) if self.queryset is not None: return self.queryset._clone() elif self.model is not None: - return self.model._default_manager.all() + qs = self.model._default_manager + if self.model in access_registry: + access_class = access_registry[self.model] + if access_class.select_related: + qs = qs.select_related(*access_class.select_related) + if access_class.prefetch_related: + qs = qs.prefetch_related(*access_class.prefetch_related) + return qs else: return super(GenericAPIView, self).get_queryset() diff --git a/awx/main/access.py b/awx/main/access.py index 563888fdcc..3630bde216 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -946,7 +946,8 @@ class CredentialAccess(BaseAccess): model = Credential select_related = ('created_by', 'modified_by',) prefetch_related = ('admin_role', 'use_role', 'read_role', - 'admin_role__parents', 'admin_role__members',) + 'admin_role__parents', 'admin_role__members', + 'credential_type', 'organization') def filtered_queryset(self): return self.model.accessible_objects(self.user, 'read_role') @@ -1147,7 +1148,11 @@ class JobTemplateAccess(BaseAccess): model = JobTemplate select_related = ('created_by', 'modified_by', 'inventory', 'project', 'next_schedule',) - prefetch_related = ('credentials__credential_type',) + prefetch_related = ( + 'instance_groups', + 'credentials__credential_type', + Prefetch('labels', queryset=Label.objects.all().order_by('name')), + ) def filtered_queryset(self): return self.model.accessible_objects(self.user, 'read_role') @@ -1309,7 +1314,7 @@ class JobAccess(BaseAccess): model = Job select_related = ('created_by', 'modified_by', 'job_template', 'inventory', - 'project', 'job_template',) + 'project', 'project_update',) prefetch_related = ( 'unified_job_template', 'instance_group',