40 lines
1.7 KiB
Python
40 lines
1.7 KiB
Python
from rest_framework.permissions import BasePermission
|
|
from rest_framework.request import Request
|
|
from rest_framework.views import APIView
|
|
|
|
|
|
class PodeGerenciarPermissoes(BasePermission):
|
|
"""Só usuários vinculados a um perfil com gerencia_permissoes=True.
|
|
|
|
Equivalente ao antigo gate de `gerenciaPermissoes` em access.js/profiles.js
|
|
no frontend — agora reforçado no servidor, não só escondendo o link.
|
|
"""
|
|
|
|
message = "Você não tem permissão para gerenciar perfis/usuários."
|
|
|
|
def has_permission(self, request: Request, view: APIView) -> bool:
|
|
usuario = request.user
|
|
return bool(usuario and usuario.is_authenticated and usuario.gerencia_permissoes())
|
|
|
|
|
|
class PermissaoApp(BasePermission):
|
|
"""Genérica e reutilizável: exige `permissoes[module_key].apps[app_key] = True` em
|
|
algum perfil vinculado ao usuário (via `Usuario.permissao_app`).
|
|
|
|
Pensada pra qualquer módulo que precise da mesma distinção "visualizar" vs.
|
|
"editar" que Links & Ferramentas usa (ver `catalogo.MODULE_APPS["links-ferramentas"]`)
|
|
— outros módulos com a mesma necessidade reaproveitam esta classe, só trocando
|
|
module_key/app_key na hora de instanciar em `get_permissions()`, sem precisar de
|
|
uma subclasse nova por módulo.
|
|
"""
|
|
|
|
def __init__(self, module_key: str, app_key: str, message: str | None = None) -> None:
|
|
self.module_key = module_key
|
|
self.app_key = app_key
|
|
if message:
|
|
self.message = message
|
|
|
|
def has_permission(self, request: Request, view: APIView) -> bool:
|
|
usuario = request.user
|
|
return bool(usuario and usuario.is_authenticated and usuario.permissao_app(self.module_key, self.app_key))
|