mirror of
https://github.com/ansible/awx.git
synced 2026-02-24 22:46:01 -03:30
Single permission query optimization
This commit is contained in:
@@ -29,15 +29,23 @@ class ResourceMixin(models.Model):
|
|||||||
`myresource.get_permissions(user)`.
|
`myresource.get_permissions(user)`.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
perm_clause = ''
|
aggregate_where_clause = ''
|
||||||
aggregates = ''
|
aggregates = ''
|
||||||
for perm in permissions:
|
group_clause = ''
|
||||||
if not perm_clause:
|
where_clause = ''
|
||||||
perm_clause = 'WHERE '
|
|
||||||
else:
|
if len(permissions) > 1:
|
||||||
perm_clause += ' AND '
|
group_clause = 'GROUP BY %s.resource_id' % RolePermission._meta.db_table
|
||||||
perm_clause += '"%s" = %d' % (perm, int(permissions[perm]))
|
for perm in permissions:
|
||||||
aggregates += ', MAX("%s") as "%s"' % (perm, perm)
|
if not aggregate_where_clause:
|
||||||
|
aggregate_where_clause = 'WHERE '
|
||||||
|
else:
|
||||||
|
aggregate_where_clause += ' AND '
|
||||||
|
aggregate_where_clause += '"%s" = %d' % (perm, int(permissions[perm]))
|
||||||
|
aggregates += ', MAX("%s") as "%s"' % (perm, perm)
|
||||||
|
if len(permissions) == 1:
|
||||||
|
perm = list(permissions.keys())[0]
|
||||||
|
where_clause = 'AND "%s" = %d' % (perm, int(permissions[perm]))
|
||||||
|
|
||||||
return cls.objects.extra(
|
return cls.objects.extra(
|
||||||
where=[
|
where=[
|
||||||
@@ -51,24 +59,28 @@ class ResourceMixin(models.Model):
|
|||||||
LEFT JOIN %(rbac_permission)s
|
LEFT JOIN %(rbac_permission)s
|
||||||
ON (%(rbac_permission)s.role_id = %(rbac_role_hierachy)s.role_id)
|
ON (%(rbac_permission)s.role_id = %(rbac_role_hierachy)s.role_id)
|
||||||
WHERE %(rbac_role)s_members.user_id=%(user_id)d
|
WHERE %(rbac_role)s_members.user_id=%(user_id)d
|
||||||
GROUP BY %(rbac_permission)s.resource_id
|
%(where_clause)s
|
||||||
|
%(group_clause)s
|
||||||
) summarized_permissions
|
) summarized_permissions
|
||||||
%(perm_clause)s
|
%(aggregate_where_clause)s
|
||||||
)
|
)
|
||||||
'''
|
'''
|
||||||
%
|
%
|
||||||
{
|
{
|
||||||
'table_name': cls._meta.db_table,
|
'table_name' : cls._meta.db_table,
|
||||||
'aggregates': aggregates,
|
'aggregates' : aggregates,
|
||||||
'user_id': user.id,
|
'user_id' : user.id,
|
||||||
'perm_clause': perm_clause,
|
'aggregate_where_clause' : aggregate_where_clause,
|
||||||
'rbac_role': Role._meta.db_table,
|
'group_clause' : group_clause,
|
||||||
'rbac_permission': RolePermission._meta.db_table,
|
'where_clause' : where_clause,
|
||||||
'rbac_role_hierachy': RoleHierarchy._meta.db_table
|
'rbac_role' : Role._meta.db_table,
|
||||||
|
'rbac_permission' : RolePermission._meta.db_table,
|
||||||
|
'rbac_role_hierachy' : RoleHierarchy._meta.db_table
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_permissions(self, user):
|
def get_permissions(self, user):
|
||||||
'''
|
'''
|
||||||
Returns a dict (or None) of the permissions a user has for a given
|
Returns a dict (or None) of the permissions a user has for a given
|
||||||
|
|||||||
Reference in New Issue
Block a user