# Controle de acesso a rotas sensíveis com base em ConfiguracaoSGMP e UsuarioSistema. from __future__ import annotations from functools import wraps from django.contrib import messages from django.http import HttpRequest from django.shortcuts import redirect from .models import ConfiguracaoSGMP, UsuarioSistema def get_perfis_gerenciar_permissoes() -> list[str]: """Retorna os códigos de perfil autorizados a acessar /permissoes/ (config Admin).""" cfg = ConfiguracaoSGMP.load() perfis = cfg.perfis_gerenciar_permissoes if not perfis: return [UsuarioSistema.Perfil.ADMIN] return list(perfis) def usuario_pode_gerenciar_permissoes(usuario: UsuarioSistema | None) -> bool: if not usuario or not usuario.ativo: return False perfis = get_perfis_gerenciar_permissoes() return any(usuario.tem_perfil(p) for p in perfis) def requer_acesso_gerenciar_permissoes(view_func): """ Exige login, UsuarioSistema ativo e perfil permitido pela ConfiguracaoSGMP. """ @wraps(view_func) def wrapper(request: HttpRequest, *args, **kwargs): if not request.user.is_authenticated: messages.error(request, "Você precisa estar autenticado.") return redirect("solicitacoes:login") try: usuario = UsuarioSistema.objects.get( matricula=request.user.username, ativo=True, ) except UsuarioSistema.DoesNotExist: messages.error(request, "Usuário não encontrado no sistema.") return redirect("solicitacoes:login") if not usuario_pode_gerenciar_permissoes(usuario): messages.error( request, "Você não tem permissão para acessar o gerenciamento de permissões.", ) return redirect("solicitacoes:dashboard") request.usuario_sistema = usuario return view_func(request, *args, **kwargs) return wrapper