Роль и разрешения в Django DRF
Я реализую роли разрешений в Django, используя DRF, но не уверен, где я здесь застрял
Вот модели:
class User():
class Staff()
user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="staffs")
business = models.ForeignKey(
"Business", on_delete=models.CASCADE, related_name="staffs"
)
role = models.PositiveSmallIntegerField (superadmin, admin, regular)
class Business()
name = models.CharField(max_length=150)
class BusinessGallery()
business = models.ForeignKey(
Business, on_delete=models.CASCADE, related_name="gallery"
)
вот BusinessViewSet
class BusinessViewSet(
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.CreateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet):
serializer_class = BusinessSerializer
def get_permissions(self):
action_permissions = {
"retrieve": [IsSuperAdmin | IsAdmin | IsRegular],
"list": [IsSuperAdmin | IsAdmin],
"partial_update": [IsAdmin | IsSuperAdmin],
"create": [IsAuthenticated],
"destroy": [IsSuperAdmin],
}
self.permission_classes = action_permissions.get(self.action, [IsSuperAdmin])
return super().get_permissions()
def get_queryset(self):
return Business.objects.filter(staffs__user=self.request.user)
вот permissions.py
class RolePermission(BasePermission):
required_role = None
def has_permission(self, request, view):
user = request.user
if not user or not user.is_authenticated:
return False
def has_object_permission(self, request, view, obj):
if not request.user or not request.user.is_authenticated:
return False
business = self.get_business_from_object(obj)
if not business:
return False
return request.user.staffs.filter(
business=business, role=self.required_role
).exists()
def get_business_from_object(self, obj):
if isinstance(obj, Business):
return obj
if hasattr(obj, "business"):
return obj.business
return None
class IsSuperAdmin(RolePermission):
required_role = ROLE_SUPER_ADMIN
class IsAdmin(RolePermission):
required_role = ROLE_ADMIN
class IsRegular(RolePermission):
required_role = ROLE_REGULAR
деленья
деленья
Предположим, что у меня уже все настроено правильно. но по какой-то причине я не могу пройти этот тест: я продолжаю получать 403 запрещенных сообщения.
def test_super_admin_can_retrieve_business(self):
self.client.force_authenticate(user=self.super_admin_user)
response = self.client.get(f"/businesses/{self.business.id}/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["name"], self.business.name)
Я застрял почти на 2 дня, но все еще не уверен, что я сделал не так, чтобы этот простой тестовый пример прошел успешно. Буду признателен за любое предложение. Спасибо
Я думаю, вы забыли явный оператор return.
В противном случае DRF сочтет это ложным
Должно быть:
class RolePermission(BasePermission):
required_role = None
def has_permission(self, request, view):
user = request.user
if not user or not user.is_authenticated:
return False
return True
^^^^^^^^^^^