Разрешения панели администратора Django: запретить группе пользователей добавлять новых пользователей

#python #django

#python #джанго

Вопрос:

Я хочу ограничить панель администратора моих рабочих пользователей — например, не хочу, чтобы они создавали пользователей или удаляли определенные типы моделей.

Вот некоторый код, models.py который настраивает моего пользовательского пользователя, и post_save сигнал для добавления пользователей.

Обратите внимание, что я установил default_permissions = () так, чтобы пользователи не запускались с какими-либо разрешениями, но затем я предоставляю им разрешения группы, в name=workers которую НЕ входят myapp.myuser_add , поэтому они не должны иметь возможности добавлять новых пользователей при входе в консоль администратора.

 # models.py
from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser, PermissionsMixin, Group
)
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def apply_worker_group(sender, instance=None, created=False, **kwargs):
    if instance.is_worker:
        try:
            worker_group = Group.objects.get(name='workers') 
            if instance not in worker_group.user_set.all():
                instance.groups.add(worker_group)
                instance.save()
        except Group.DoesNotExist:
            pass

class MyUser(AbstractBaseUser, PermissionsMixin):
    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_worker = models.BooleanField(default=False)

    # ... skipping a bunch of stuff

    class Meta:
        default_permissions = () # (!) ALL USERS HAVE NO PERMS TO START

    @property
    def is_staff(self):
        # so workers can log into the admin panel
        return self.is_admin or self.is_worker
  

Затем в моем admin.py :

 # admin.py
from django.contrib.auth.admin import UserAdmin
from django.contrib import admin
from myapp.models import MyUser

class MyUserAdmin(UserAdmin):
    pass

class MyAdminSite(admin.AdminSite):
    pass

admin_site = MyAdminSite(name='myadmin')
admin_site.register(MyUser, MyUserAdmin)
  

Но когда я создаю пользователя под своей учетной записью суперпользователя is_worker=True , я все равно могу войти с этим созданным пользователем в панель администратора и создать больше пользователей! А это совсем не то, чего я хочу.

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