Je veux obtenir une liste de tous les utilisateurs Django avec un groupe d'autorisations spécifique, quelque chose comme ceci:
user_dict = {
'queryset': User.objects.filter(permisson='blogger')
}
Je ne peux pas savoir comment faire cela. Comment les groupes d'autorisations sont-ils enregistrés dans le modèle utilisateur?
Si vous souhaitez obtenir la liste des utilisateurs avec autorisation, regardez cette variante:
from Django.contrib.auth.models import User, Permission
from Django.db.models import Q
perm = Permission.objects.get(codename='blogger')
users = User.objects.filter(Q(groups__permissions=perm) | Q(user_permissions=perm)).distinct()
Ce serait le plus facile
from Django.contrib.auth import models
group = models.Group.objects.get(name='blogger')
users = group.user_set.all()
Je pense que pour les autorisations de groupe, les autorisations sont stockées contre des groupes, puis les utilisateurs sont liés à des groupes. Vous pouvez donc simplement résoudre la relation utilisateur-groupe.
par exemple.
518$ python manage.py Shell
(InteractiveConsole)
>>> from Django.contrib.auth.models import User, Group
>>> User.objects.filter(groups__name='monkeys')
[<User: cms>, <User: dewey>]
Sur la base de la réponse de @ Glader, cette fonction la résume en une seule requête et a été modifiée pour obtenir les superutilisateurs (comme par définition, ils ont tous les permanents):
from Django.contrib.auth.models import User
from Django.db.models import Q
def users_with_perm(perm_name):
return User.objects.filter(
Q(is_superuser=True) |
Q(user_permissions__codename=perm_name) |
Q(groups__permissions__codename=perm_name)).distinct()
# Example:
queryset = users_with_perm('blogger')
N'oubliez pas que spécifier le nom de code de permission n'est pas suffisant car différentes applications peuvent réutiliser le même nom de code. Il faut obtenir l’objet permission pour interroger correctement les utilisateurs:
def get_permission_object(permission_str):
app_label, codename = permission_str.split('.')
return Permission.objects.filter(content_type__app_label=app_label, codename=codename).first()
def get_users_with_permission(permission_str, include_su=True):
permission_obj = get_permission_object(permission_str)
q = Q(groups__permissions=permission_obj) | Q(user_permissions=permission_obj)
if include_su:
q |= Q(is_superuser=True)
return User.objects.filter(q).distinct()
Code avec importations: https://github.com/Dmitri-Sintsov/Django-jinja-knockout/blob/master/Django_jinja_knockout/models.py
Les groupes d'utilisateurs sont nombreux (vous voyez, rien d'inhabituel, juste des modèles Django ...), donc la réponse par cms est correcte. De plus, cela fonctionne dans les deux sens: en ayant un groupe, vous pouvez lister tous les utilisateurs en inspectant l'attribut user_set
.
Sur la base de la réponse de @ Augusto, j'ai effectué les opérations suivantes avec un gestionnaire de modèles et en utilisant la bibliothèque authtools. C'est en querysets.py
:
from Django.db.models import Q
from authtools.models import UserManager as AuthUserManager
class UserManager(AuthUserManager):
def get_users_with_perm(self, perm_name):
return self.filter(
Q(user_permissions__codename=perm_name) |
Q(groups__permissions__codename=perm_name)).distinct()
Et puis dans models.py
:
from Django.db import models
from authtools.models import AbstractEmailUser
from .querysets import UserManager
class User(AbstractEmailUser):
objects = UserManager()
Essaye ça:
User.objects.filter(groups__permissions = Permission.objects.get(codename='blogger'))
$ python manage.py Shell <<'EOF'
> from Django.contrib.auth.models import User
> User.objects.filter(groups__name='blogger')
> EOF
...
(InteractiveConsole)
>>> >>> [<User: foo>, <User: bar>, <User: baz>, '...(remaining elements truncated)...']
(simplifié à partir de la réponse de cms, que je ne peux pas éditer)