Role and Permission in Django DRF
I am implementing permission-roles in Django using DRF but not sure where i got stuck here
Here are models:
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"
)
here is 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)
here is 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
Assume that i already have all setup correctly. but for some reason i can not get this test pass: i keep getting 403 forbidden.
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)
I have been stuck for almost 2 days but still not sure what did i do wrong to make this simple test case pass. Any suggestion will highly appreciate. Thank you