portal_publico/portal_api/permissions.py

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