I want to retrieve all permission for user as list of premission id's but:
user.get_all_permissions()
give me list of permission names. How to do it?
I want to retrieve all permission for user as list of premission id's but:
user.get_all_permissions()
give me list of permission names. How to do it?
to get all the permissions of a given user, also the permissions associated with a group this user is part of:
from django.contrib.auth.models import Permission
def get_user_permissions(user):
if user.is_superuser:
return Permission.objects.all()
return user.user_permissions.all() | Permission.objects.filter(group__user=user)
The key is get the permission objects like this:
from django.contrib.auth.models import Permission
permissions = Permission.objects.filter(user=user)
and there you can access the id
property like this:
permissions[0].id
If you want the list (id, permission_name)
do the following:
perm_tuple = [(x.id, x.name) for x in Permission.objects.filter(user=user)]
Hope it helps!
If you are using Django 3.0+, user.get_user_permissions()
gives the codename of all the permissions.
More information here: https://docs.djangoproject.com/en/3.0/ref/contrib/auth/#django.contrib.auth.models.User.get_user_permissions
we can get user permission from user objects directly into a list like this
perm_list = user_obj.user_permissions.all().values_list('codename', flat=True)
Try this....
This is an routine to query for the Permission objects returned by user.get_all_permissions()
in a single query.
from functools import reduce
from operator import or_
from django.db.models import Q
from django.contrib.auth.models import Permission
def get_user_permission_objects(user):
user_permission_strings = user.get_all_permissions()
if len(user_permission_strings) > 0:
perm_comps = [perm_string.split('.', 1) for perm_string in user_permission_strings]
q_query = reduce(
or_,
[Q(content_type__app_label=app_label) & Q(codename=codename) for app_label, codename in perm_comps]
)
return Permission.objects.filter(q_query)
else:
return Permission.objects.none()
Alternatively, querying Permission directly:
from django.db.models import Q
from django.contrib.auth.models import Permission
def get_user_permission_objects(user):
if user.is_superuser:
return Permission.objects.all()
else:
return Permission.objects.filter(Q(user=user) | Q(group__user=user)).distinct()
from django.contrib.auth.models import Permission
permissions = Permission.objects.filter(user=user)
permissions[0].id
Returns the set of permission strings the user_obj has, including both user permissions and group permissions. Returns an empty set if is_anonymous or is_active is False.
user_permissions_list = request.user.get_all_permissions()
Returns the set of permission strings the user_obj has from the permissions of the groups they belong. Returns an empty set if is_anonymous or is_active is False.
request.user.get_group_permissions()
Returns the set of permission strings the user_obj has from their own user permissions. Returns an empty set if is_anonymous or is_active is False.
request.user.get_user_permissions()
Unfortunately these built in method give me duplicate queries.
Or you can use your own filter from permission tables to get all permissions of current user
user_permissions_list = list(Permission.objects.filter(Q(user=request.user) | Q(group__user=request.user)).values_list('codename', flat=True))