sgmp/solicitacoes/decorators.py

84 lines
2.9 KiB
Python
Raw Normal View History

2026-03-09 18:46:01 +00:00
# /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