Форма Django для создания пользователей с разными разрешениями

Я работаю над системой Django, в которой есть четыре уровня пользователей: 1. Базовый (только доступ) 2. Администратор (может обновлять/изменять/удалять) 3. Привратник (может создавать только пользователей-администраторов, не может обновлять/изменять/удалять ) 4. Разработчик (настоящий суперпользователь)

Я думаю, что у меня есть разрешения, несколько выясненные:

    from django.conf import settings
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)
from django.core.validators import RegexValidator
from django.db import models
from django.db.models.signals import post_save


class CustomUserManager(BaseUserManager):
    """Customer User."""

    def create_user(self, email, password=None):
        """Creates and saves a user."""
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_admin(self, email):
        """Creates and saves an admin user with a temporary password."""
        user = self.create_user(
            email,
            password=BaseUserManager.make_random_password(self, 12)
        )
        user.is_admin = True
        user.save(using=self.db)
        return user


    def create_gatekeeper(self, email, password):
        """Creates and saves a gatekeeper."""
        user = self.create_user(
            email,
            password=password,
        )
        user.is_admin = True
        user.is_gatekeeper = True
        user.save(using=self.db)
        return user

    def create_superuser(self, email, password):
        """Creates and saves a superuser."""
        user = self.create_user(
            email,
            password=password,
        )
        user.is_admin = True
        user.is_gatekeeper = True
        user.is_developer = True
        user.save(using=self._db)
        return user


class CustomUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_gatekeeper = models.BooleanField(default=False)
    is_developer = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    # def __str__(self):
    #     return self.email

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        # Does the user have a specific permission?
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        # "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    class Meta:
        db_table = 'customuser'
        verbose_name = 'CustomUser'

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

а) форма, в которой разработчики могут создавать привратников б) форма, в которой привратники могут создавать администраторов

Поскольку наш административный сайт необходимо будет сильно настроить, мы не будем использовать Django Admin и, вероятно, будем создавать собственные функции. Как мне вызвать что-то вроде create_gatekeeper внутри формы Django? Было бы лучше создать подкласс страниц администратора Django и настроить их?


person MVM    schedule 24.07.2018    source источник


Ответы (1)


Вероятно, вам следует работать с группами и добавлять разрешения для этих групп;;; но в 3 ваших актерах вы можете использовать встроенные атрибуты django из пользовательских моделей...

Пользователь: вы, обычный пользователь, просто создаете класс User с чем-то еще, например is_something...

Администратор Вы можете использовать атрибут is_staff, который исходит из пользовательских моделей, и разрешить вашему пользователю доступ к администратору django...

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

Дело в гейткипере, так что если вы начнете создавать флаги как is_admin, is_gatekeeper и т. д... вы начнете обрабатывать несколько атрибутов, и это плохая идея, поэтому, когда вы работаете с группами, вы можете создавать группы пользователей, разработчиков Группа (поскольку они являются суперадминистратором, вам не нужно этого делать), Группа администраторов (добавьте каждое разрешение, которое вы хотите дать этой группе [например, модели блога, которые вы можете дать ему в блоге add_blog, change_blog и delete_blog, но вы можете добавить твой кастом тоже]) как и в других группах...

Eg.

# List of my Permissions that i want to add to my groups
PERMISSIONS = {
    STUDENT : ['add_student', 'change_student',
                  'delete_student', 'editpreview_student'],
    PROJECT: ['add_project', 'change_project', 'delete_project', 'editpreview_project'],

}

# Creating 2 Groups
grupo_admin, created = Group.objects.get_or_create(name='admin') 
grupo_teachers, created = Group.objects.get_or_create(name='teacher')    


for func_perm in PERMISSIONS [STUDENT]:
    perm = Permission.objects.get(codename=func_perm)
    grupo_admin.permissions.add(perm) # Adding Student Permission to my Admin Group
    grupo_teachers.permissions.add(perm)  # Adding Student Permission to my Teachers Group
for func_perm in PERMISSOES[PROJECT]:
    perm = Permission.objects.get(codename=func_perm)
    grupo_admin.permissions.add(perm) # Adding Project Permission only to my Admin Group

В ваших представлениях вы можете проверить такое разрешение

@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
    # ...

И ваш HTML вы можете проверить вот так

{% if perms.student.change_student %}
  <li>
    <a href="/admin/student/student/">
      <i class="fa fa-graduation-cap" aria-hidden="true"></i> 
      <span>Students</span>
    </a>
   </li>  
{% endif %}    
person Diego Vinícius    schedule 24.07.2018