В Django guardian как определить, какая группа предоставила пользователю права доступа к экземпляру объекта?
Я пытаюсь установить разрешения на уровне объекта, используя Django guardian и группы; где я даю разрешения группам - не пользователям - и добавляю/удаляю пользователей из групп по мере необходимости.
Когда пользователь имеет разрешение на взаимодействие с экземпляром объекта - потому что он входит в группу, имеющую необходимые разрешения - как я могу определить, какая из групп пользователя дала ему это разрешение?
В качестве примера, основываясь на примере в django-guardian-docs, в идеале должно быть что-то вроде:
>>> joe.has_perm_from_groups('sites.change_site', site)
[site_owners_group]
Django guardian имеет ярлык под названием get_groups_with_perms(obj)
, который Returns queryset of all Group objects with any object permissions for the given obj
. https://django-guardian.readthedocs.io/en/stable/api/guardian.shortcuts.html#get-groups-with-perms
В Django есть метод queryset под названием intersection
, который returns the shared elements of two or more QuerySets
https://docs.djangoproject.com/en/3.2/ref/models/querysets/#intersection
Используя эти две функции, я могу найти группы, в которых состоит пользователь и которые также имеют разрешения на объект. Затем я использую цикл for для определения группы с разрешением. Если разрешение есть у двух групп, я не знаю, как выяснить, какая из них дала пользователю разрешение, поэтому возвращается первая найденная группа
# Find the union of groups
groups = user.groups.all().intersection(get_groups_with_perms(obj))
# Check if any group has the permission, and return if True
for group in groups:
if 'change_site' in get_perms(group, obj):
return group
return None