Ограничение действия пользователей django

Как можно ограничить действия обычного пользователя?

У меня при регистрации пользователя сразу определяется is_staff True или False. И нужно прописать ограничения (типа, можно смотреть определенный список, изменить его) если is_staff == False. Как лучше это сделать? Прописать разрешения отдельным файлом и использовать ее или сразу же на нужном файле?

Сейчас у мен код такой:

views.py

 from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.response import Response
from rest_framework.authtoken.models import Token
from rest_framework import status
from django.contrib.auth.models import User
from rest_framework.generics import CreateAPIView
from rest_framework.permissions import IsAuthenticated
from .serializers import UserRegisterSerializer
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from .permissions import ActivePermissions


class CustomAuthToken(ObtainAuthToken):

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({
            'token': token.key,
            'user_id': user.pk,
            'email': user.email
        })

class RegisterUserView(CreateAPIView, PermissionRequiredMixin):
    queryset = User.objects.all()  # add to queryset
    serializer_class = UserRegisterSerializer  # add serializer UserRegisterSerializer
    # permission_classes = [IsAuthenticated]  # add permission classes
    def post(self, request, *args, **kwargs):  #create method to create new user
        serializer = UserRegisterSerializer(data=request.data)  # add UserRegisterSerializer
        data = {}  # create list data

        if request.user.is_staff == True: #это то, что я пробую делать
            permission_classes = [IsAuthenticated, ActivePermissions]
        else:
            permission_classes = [IsAuthenticated]

            # Data Validity Check
        if serializer.is_valid():
            serializer.save()
            data['response'] = True
            return Response(data, status=status.HTTP_200_OK)
        else:
            data = serializer.errors
            return Response(data)

serislizersd.py

from rest_framework import serializers
from django.contrib.auth.models import User

class UserRegisterSerializer(serializers.ModelSerializer):
    password2 = serializers.CharField()  # Поле для повторения пароля

    # Настройка полей
    class Meta:
        model = User
        fields = ['email', 'username', 'password', 'password2', 'is_staff']

    # Метод для сохранения нового пользователя
    def create(self, *args, **kwargs):
        user = User(
            email=self.validated_data['email'],
            username=self.validated_data['username'],
            is_staff=self.validated_data['is_staff'],
        )
        password = self.validated_data['password']
        password2 = self.validated_data['password2']

        if password != password2:
            raise serializers.ValidationError({password: "Пароль не совпадает"})
        user.set_password(password)  # Сохраняем пароль
        user.save()
        return user

models/py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)


class MyUserManager(BaseUserManager):
    # Создаём метод для создания пользователя
    def _create_user(self, email, username, password, is_staff):
        if not email:
            raise ValueError("Вы не ввели Email")
        if not username:
            raise ValueError("Вы не ввели Логин")

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

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

        return user


class User(AbstractBaseUser):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(max_length=100, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)


    objects = MyUserManager()

    def __str__(self):
        return self.username

permissions.py

from rest_framework import permissions
from django.contrib.auth.models import Permission, User
from django.contrib.contenttypes.models import ContentType
from Personel.models import Division

class ActivePermissions(permissions.BasePermission):
    # Permissions for users

    def has_permission(self, request, view):
        content_type = ContentType.objects.get_for_model(Division)
        permission = Permission.objects.get(
            codename='change_blogpost',
            content_type=content_type,
        )
        if request.user.is_staff == False:
            request.user.permissions.add(permission)
Вернуться на верх