Специфические разрешения пользователей в 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.
Я взял примеры из документации и немного изменил их, чтобы они соответствовали вашему случаю использования.