Предоставление пользователю доступа к некоторой части проекта в зависимости от его роли - Django

Я только что закончил кодирование приложения django, которое помогает музыкальным продюсерам координировать проекты, и я пытаюсь решить небольшую проблему, с которой я столкнулся.

В данном проекте пользователи имеют определенные роли (звукооператор, барабанщик, менеджер по производству и т.д.). В зависимости от их роли, я хочу, чтобы они могли видеть только некоторую информацию о проекте.

Например, менеджер по производству должен иметь возможность видеть бюджет проекта, но ударника нет

Как я могу это сделать? Я думал использовать группы, но пока не уверен как.

Предполагается, что вы будете менять разрешения для этих ролей для каждого проекта? Я бы создал сквозную таблицу для ProjectRole с набором полей, которые включают булевы для того, что вы хотите ограничить.

Такие поля как: проект, роль, view_budget, view_members, admin_project

У вас также будет таблица UserRole, которая сопоставляет пользователей с ролями проекта. Таким образом, можно легко запросить разрешение на основе проекта для любого пользователя. Все зависит от того, будете ли вы иметь фиксированные разрешения для каждого проекта, или они будут меняться. Например, может ли менеджер по производству видеть бюджет для каждого проекта, для каждого проекта, в котором он является менеджером по производству, или только для этого одного проекта, но, возможно, другой проект не позволяет менеджеру по производству видеть бюджет.

Сначала решите, где вы хотите назначить разрешения (роль, роль & проект). Если только на роль, то вы можете использовать встроенные разрешения Django и последующий запрос, чтобы убедиться, что они также находятся в проекте.

Предоставьте конкретные сведения о ваших требованиях, и тогда будет легче предложить подходящую модель структуры.

Во-первых, вам придется назначить разные роли разным пользователям (это можно сделать вручную, в панели администратора или даже вычислительным путем).

Чтобы создать группу, вы можете попробовать что-то вроде этого, где ударник может быть любой ролью, которую вы хотите:

from django.contrib.auth.models import Group doctor_group, created = Group.objects.get_or_create(name='drummer')

Далее вы можете добавить, установить, удалить или очистить полномочия пользователя. Например, если бы я хотел назначить пользователю b роль барабанщика, я бы использовал что-то вроде этого: doctor_group.permissions.set([permission_list])

Вот полный список функций разрешения:

doctor_group.permissions.set([permission_list])
doctor_group.permissions.add(permission, permission, ...)
doctor_group.permissions.remove(permission, permission, ...)
doctor_group.permissions.clear()

Вы также можете добавлять пользователей в группы, используя этот синтаксис, в зависимости от того, как настроены ваши модели. user.groups.add(doctor_group)

Наконец, вы можете проверить, состоит ли конкретный пользователь в группе, используя метод .exists() и аутентификацию пользователя.

Должно работать что-то вроде этого:

def is_drummer(user):
    return user.groups.filter(name='drummer').exists()

from django.contrib.auth.decorators import user_passes_test
@user_passes_test(is_drummer)
def my_view(request):
    pass

Вы можете узнать больше о конкретных группах и ролях Django здесь.

Вернуться на верх