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