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

Context

у нас есть три типа пользователей: owner, host и admin.

У owner есть property, которым host управляет

а host должен иметь возможность создавать и/или обновлять expenses к некоторым property связанным с собой

Я уже создал несколько фильтров для метода GET, но не смог понять, как проверить пользователя перед POST или PATCH...

любая помощь будет оценена по достоинству

Коды

здесь модель расходов:

class Expenses(models.Model):
    """Model for property expenses
    """

    property = models.ForeignKey('property.Property', on_delete=models.CASCADE)
    register_date = models.DateField()
    expense_date = models.DateField(blank=True, null=True)
    reason = models.CharField(blank=True, max_length=1024)
    description = models.CharField(blank=True, max_length=1024)
    supplier = models.CharField(blank=True, max_length=1024)
    value = models.DecimalField(decimal_places=2, max_digits=50, default=0)
    refund = models.DateField(blank=True, null=True)
    statement_image = models.ForeignKey(FileItem, on_delete=models.CASCADE)
    maintenance_image = models.ForeignKey(FileItem, on_delete=models.CASCADE)
    owner_approval = models.BooleanField(blank=True, null=True)

    class Meta:
        verbose_name_plural = "Expenses"

    def __str__(self):
        return f"Expense id: {self.id}"

Serializer:

class ExpensesSerializer(serializers.ModelSerializer):

    statement_photo = f_serializers.FileItemSerializer(required=False)
    maintenance_photo = f_serializers.FileItemSerializer(required=False)

    class Meta:
        model = models.Expenses
        exclude = []

    def to_representation(self, instance):
        representation = super().to_representation(instance)
        print(instance.refund)
        if instance.refund is None:  # condition
            representation['refund'] = "Pending"
            return representation
        return representation

ViewSet

class ExpensesViewSet(viewsets.ModelViewSet):
    queryset = models.Expenses.objects.all()
    serializer_class = serializers.ExpensesSerializer
    http_method_names = ['get', 'post', 'patch']
    permission_classes = (IsHost | IsAdmin | IsOwner,)

    def get_queryset(self):
        user = self.request.user
        property_id = self.request.query_params.get('property_id')
        register_date = self.request.query_params.get('register_date')
        refund = self.request.query_params.get('refund')
        expense_status = self.request.query_params.get('expense_status')

        if property_id:
            self.queryset = self.queryset.filter(property=property_id)
        if register_date:
            self.queryset = self.queryset.filter(register_date=register_date)
        if refund:
            self.queryset = self.queryset.filter(refund=refund)
        if expense_status:
            self.queryset = self.queryset.filter(expense_status=expense_status)

        if 'Host' in user.roles:
            return self.queryset.filter(property__host__user=user.id)
        return self.queryset
Вернуться на верх