84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
# /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
|
|
|