Я хочу иметь простой способ проверить, является ли кто-то владельцем или администратором post
, proposal
и т. д., которые он пытается редактировать\удалять.
Итак, каждый раз, когда я использую разрешение IsAuthenticated
, а в методе ModelViewSet
я получаю экземпляр и проверяю, является ли instance.author
или иногда instance.owner
пользователем, который его запросил (request.user == instance.owner
для некоторых объектов это request.user == instance.author
).
Вопрос
Главный вопрос: как я могу создать класс разрешений, который может проверять этот вид владения с динамическим именем атрибута пользователя в экземпляре?
Одно из моих решений (думаю, не самое лучшее)
Я создал функцию, которая принимает имя экземпляра атрибута пользователя и возвращает класс разрешений:
def is_owner_or_admin_permission_factory(owner_prop_name):
class IsOwnerOrAdmin(BasePermission):
def has_permission(self, request, view, *args, **kwargs):
instance = view.get_object()
try:
owner = getattr(instance, owner_prop_name)
except AttributeError:
return False
return (
request.user and request.user.id and (owner == request.user or request.user.is_staff)
)
return IsOwnerOrAdmin