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))