Как создать рабочие пространства и управлять ими для всех пользователей в Django?

У меня есть полная система входа и регистрации в моем Django приложении, которая позволяет мне регистрировать пользователей, входить в систему, выходить из системы, менять пароли, сбрасывать пароли, приглашать пользователей. У меня есть вся базовая функциональность.

Теперь я хочу иметь рабочие пространства для пользователей, в соответствии со следующими пунктами:

  • У каждого рабочего пространства будет свой администратор.
  • Администраторы рабочих пространств могут только добавлять/удалять (регистрировать/удалять) пользователей в свои собственные рабочие пространства.
  • Пользователи могут реагировать (входить) только в те рабочие пространства, в которые они были добавлены.
  • Суперпользователь (главный администратор) может управлять всеми рабочими пространствами, всеми админами рабочих пространств и всеми пользователями.

Как этого добиться? Можно сказать, что это похоже на Slack. Мне просто нужно руководство/дорожная карта, и я реализую это сам.

Я уже создал Workspace Модель, которая выглядит следующим образом:

class Workspace(models.Model):
    name = models.CharField(max_length=254)
    created_at = models.DateTimeField(auto_now_add=True)

    def make_admin(self, user):
        user.is_workspace_admin = True
        user.save()

    def remove_admin(self, user):
        user.is_workspace_admin = False
        user.save()

и моя User модель имеет следующие два атрибута помимо других полей Django по умолчанию:

class User(AbstractBaseUser, PermissionsMixin):
    is_workspace_admin = models.BooleanField(default=True)
    workspaces = models.ManyToManyField(Workspace)

Является ли этот подход правильным? Если нет, пожалуйста, направьте меня на правильный путь. BTW, используя этот подход, я могу добавить/назначить рабочие пространства любому пользователю, но как я смогу управлять пользователями, входящими в свои собственные рабочие пространства и реагирующими только на свои рабочие пространства, к которым они были назначены. А также администраторы рабочих пространств, контролирующие пользователей своих рабочих пространств и т.д.?

Я знаю об использовании групп. Итак, допустим, я создаю все соответствующие разрешения (Можете ли вы также рассказать мне, как создать разрешения?), чтобы добавить пользователя рабочего пространства, удалить пользователя рабочего пространства, сделать пользователя рабочего пространства администратором рабочего пространства, удалить администратора рабочего пространства из администрирования рабочего пространства и т.д. и создать различные группы и добавить соответствующие разрешения в каждой группе. Предположим, мои группы выглядят как manage_workspace_a для управления (добавления/удаления) группами пользователей рабочего пространства, manage_workspace_admins для управления (добавления/удаления) администраторами рабочего пространства, и разрешения по умолчанию, которые Django предоставляет для каждой модели.

Итак, как я смогу иметь функциональность, что когда "User A", который имеет is_superuser=True, делает is_workspace_admin=True из "User B", то "User B" должен автоматически получить все права администратора рабочего пространства. Что-то вроде этого:

workspace_user = User.objects.get(email="some-email-address")

if request.user.is_superuser:
    wordspace_user.permissions.add([Workspace Admin Permissions])

Может ли кто-нибудь объяснить весь процесс с небольшим примером кода?

Это очень длинный вопрос, состоящий из нескольких частей, но, надеюсь, я смогу указать вам правильное направление

  1. Я бы предложил добавить еще одно поле Many-to-Many в вашу модель User, которое обрабатывает статус администратора. На данный момент у вас он установлен на булевский флаг - таким образом, администратор может либо управлять всеми рабочими пространствами, либо ни одним.

  2. Лично я бы изменил статус M2M и поместил users и administrators на рабочее пространство, а не на модель пользователя. Это не проблематично иметь на модели пользователя, но я чувствую, что имеет больше смысла проверять, что пользователь находится в списке разрешенных пользователей/админов рабочего пространства, а не рабочее пространство находится в списке рабочих пространств пользователя и рабочих пространств администратора.

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

    def make_admin(self, user):
         self.administrators.add(user)
    
  4. Что касается того, как вы управляете самим рабочим пространством, вы можете просто поместить ORM фильтры в самое начало ваших соответствующих представлений:

    def workspace_view(request, workspace_id):
       workspace = get_object_or_404(Workspace, workspace_id)
       if request.user not in workspace.users:
           return redirect(...)
    
       ...the rest of your view
    

    Имейте в виду, что это не позволяет администраторам входить в , если они не входят в группу - вам нужно либо добавить их в users, либо добавить другое условие для проверки, входят ли они в users.administrators

  5. Если вы хотите получить обзор всех рабочих пространств в виде некоего индекса/домашней страницы, вы просто используете аксессор m2m reverse, который зависит от вашего обратного имени (или

    по умолчанию):/relation/_set

    def workspaces(request):
        workspaces = request.user.workspaces.all()
    
  6. Вы определенно можете использовать встроенную систему разрешений Django, я бы направил вас к документации, потому что это длинная тема:

    https://docs.djangoproject.com/en/4.0/topics/auth/default/#permissions-and-authorization

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