# /SGMP_PROD/solicitacoes/decorators.py from functools import wraps from django.contrib import messages from django.shortcuts import redirect from .models import UsuarioSistema def requer_perfil(*perfis_permitidos): """ Decorador que verifica se o usuário possui um dos perfis permitidos. Uso: @requer_perfil(UsuarioSistema.Perfil.GESTOR, UsuarioSistema.Perfil.GG) def minha_view(request): ... """ def decorator(view_func): @wraps(view_func) def wrapper(request, *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") # Aceita se o usuário possuir pelo menos um dos perfis permitidos, # considerando perfil principal e perfis extras. if not any(usuario.tem_perfil(p) for p in perfis_permitidos): messages.error( request, f"Você não tem permissão para acessar esta funcionalidade. " f"Perfil necessário: {', '.join([p.label for p in perfis_permitidos])}" ) return redirect("solicitacoes:dashboard") # Injeta o usuario no request para uso na view request.usuario_sistema = usuario return view_func(request, *args, **kwargs) return wrapper return decorator def pode_criar_solicitacao(view_func): """ Decorador que verifica se o usuário pode criar solicitações. Por padrão, apenas GESTOR pode criar. """ @wraps(view_func) def wrapper(request, *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 usuario.perfil != UsuarioSistema.Perfil.GESTOR: messages.error( request, "Apenas gestores podem criar solicitações." ) return redirect("solicitacoes:dashboard") request.usuario_sistema = usuario return view_func(request, *args, **kwargs) return wrapper