From 6250d9f7e75731b1df04fba6f4ee5e825dd31874 Mon Sep 17 00:00:00 2001 From: Akita Noek Date: Fri, 22 Apr 2016 12:09:19 -0400 Subject: [PATCH] Optimized RBAC visible_roles query --- awx/main/models/rbac.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/awx/main/models/rbac.py b/awx/main/models/rbac.py index 64e748a20a..3ee63c8497 100644 --- a/awx/main/models/rbac.py +++ b/awx/main/models/rbac.py @@ -348,7 +348,22 @@ class Role(models.Model): @staticmethod def visible_roles(user): - return Role.objects.filter(Q(descendents__in=user.roles.filter()) | Q(ancestors__in=user.roles.filter())) + sql_params = { + 'ancestors_table': Role.ancestors.through._meta.db_table, + 'parents_table': Role.parents.through._meta.db_table, + 'roles_table': Role._meta.db_table, + 'ids': ','.join(str(x) for x in user.roles.values_list('id', flat=True)) + } + qs = Role.objects.extra( + where = [''' + %(roles_table)s.id IN ( + SELECT descendent_id FROM %(ancestors_table)s WHERE ancestor_id IN (%(ids)s) + UNION + SELECT ancestor_id FROM %(ancestors_table)s WHERE descendent_id IN (%(ids)s) + ) + ''' % sql_params] + ) + return qs @staticmethod def singleton(name):