Специфические разрешения пользователей в Django

Мне нужно сделать только TL и HR разрешения на одобрение для отпуска. как этого добиться в Django Rest framework? Поскольку я новичок, я нахожу этот сценарий сложным. Помогите мне, технари

Это моя модель User

class User(AbstractBaseUser):
    email = models.EmailField(max_length=255, unique=True)
    username = models.CharField(max_length=150, unique=True)
    name = models.CharField(max_length=150, blank=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_HR = models.BooleanField(default=False)
    is_TL = models.BooleanField(default=False)
    updated_at = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(auto_now_add=True)

Это мое заявление об уходе образец.

class Leave(models.Model):
    leave_type = models.CharField(max_length=50)
    employee = models.ForeignKey(UserDetails, on_delete=models.CASCADE)
    manager = models.CharField(max_length=50)
    applied_on = DateTimeField(auto_now_add=True)
    from_date = DateField()
    to_date = DateField()
    number_of_days = IntegerField()
    purpose = models.CharField(max_length=100)
    status = models.CharField(max_length=50, choices=( ('Pending', 'Pending'),
                                                      ('Approved', 'Approved'),
                                                      ('Rejected', 'Rejected')
        
    ),default='Pending')
    waiting_approval = models.BooleanField(default=True)
    TL_approved = models.BooleanField(default=False)
    TL_rejected = models.BooleanField(default=False)
    
    def approve(self):
        self.manager_approved = not self.manager_approved
        self.manager_rejected = not self.manager_rejected

Это мои взгляды

class LeaveManagerApproveView(APIView):
    def post(self, request):
        leave_id = request.data.get('leave_id')
        leave = Leave.objects.get(id=leave_id)

        leave.waiting_approval = False
        leave.manager_approved = True
        leave.status = 'Approved'
        leave.save()
        return Response({'successMessage': 'Leave Approved Successfully'})

По моему мнению, мне нужно, чтобы только Hr или TL одобрили или отклонили его? Как это сделать?

У меня нет большого опыта в этом, но для меня это выглядит так, что вы можете добавить класс разрешения к вашему APIView, который вы хотите ограничить, примерно так:

class LeaveManagerApproveView(APIView):
    permission_classes = [LeaveManagerApprovePermission]

    def post(self, request):
        ...

Используя собственное пользовательское разрешение, например, так:

from rest_framework import permissions


class LeaveManagerApprovePermission(permissions.BasePermission):
    message = 'Approving leave not allowed.'

    def has_permission(self, request, view):
        return request.user.is_HR or request.user.is_TL

Возможно, вам нужно добавить проверку на аутентификацию, так как я не знаю, как он ведет себя, если пользователь не вошел в систему. Вы можете добавить IsAuthenticated как класс разрешения в представление (как первый в списке), это должно работать, если разрешения проверяются лениво одно за другим по порядку. Или вы можете добавить проверку для request.user.is_authenticated к вашему пользовательскому разрешению, например:

...
return request.user.is_authenticated and (request.user.is_HR or request.user.is_TL)
...

В любом случае вам следует проверить все варианты, чтобы убедиться, что он работает так, как вы хотите. А еще лучше написать для него тест, чтобы убедиться, что к нему могут обращаться (и только) члены HR и/или TL.

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

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