Files
controles/controllers/usuario_controller.py
Mateus Tavares 2b1668206d - inits centralizados, READMEs atualizados
- padronizando o nome de get_db_connection e session para get_db_session, para não confundir com session do Flask ou sessoes web

- corrigindo potenciais erros

-- has_permission nao consegue com lazy load carregar permission depois de load_user fechar a conexao, entao joinedLoad com Permission antes de fechar

-- db.rollback não existe caso db = get_db_session() apareça muito depois dentro do try, padronizando antes de try

--- comparar role por nivel (Role.SECRETARIO_GERAL) e nao por nome ("Secretario Geral")

- unificacao de get_otp_qr_code

- mudança de nowutc() para now(UTC) conforme novo padrão
2026-02-20 17:19:15 -03:00

184 lines
5.7 KiB
Python

from flask import Blueprint, request, render_template, redirect, url_for, flash, jsonify
from functions.database import get_db_session, Usuario, Role, Setor
from functions.decorators import require_login
from flask_login import current_user
import pyotp
usuario_bp = Blueprint('usuario', __name__)
@usuario_bp.route("/usuarios/novo", methods=["GET", "POST"])
@require_login
def novo():
"""Cria um novo usuário"""
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
email = request.form.get("email")
role_id = request.form.get("role_id")
setor_id = request.form.get("setor_id")
# Verificar se usuário já existe
db = get_db_session()
try:
if db.query(Usuario).filter_by(username=username).first():
flash('Nome de usuário já existe.', 'danger')
return render_template("novo_usuario.html")
novo_usuario = Usuario(
username=username,
email=email,
role_id=role_id,
setor_id=setor_id
)
novo_usuario.set_password(password)
novo_usuario.otp_secret = pyotp.random_base32()
db.add(novo_usuario)
db.commit()
flash('Usuário cadastrado com sucesso!', 'success')
return redirect(url_for('usuario.listar'))
except Exception as e:
db.rollback()
print(f"Erro ao cadastrar usuário: {e}")
flash('Erro ao cadastrar usuário', 'danger')
return render_template("novo_usuario.html")
finally:
db.close()
db = get_db_session()
try:
roles = db.query(Role).order_by(Role.nome).all()
setores = db.query(Setor).order_by(Setor.nome).all()
return render_template("novo_usuario.html", roles=roles, setores=setores)
finally:
db.close()
@usuario_bp.route('/usuarios/<int:user_id>/toggle_status', methods=['POST'])
@require_login
def toggle_status(user_id):
"""Ativa/desativa um usuário"""
if not current_user.is_admin:
return jsonify({
'success': False,
'error': 'Você não tem permissão para alterar o status de usuários.'
}), 403
db = get_db_session()
try:
usuario = db.query(Usuario).get(user_id)
if not usuario:
return jsonify({
'success': False,
'error': 'Usuário não encontrado.'
}), 404
usuario.ativo = not usuario.ativo
db.commit()
return jsonify({
'success': True,
'message': f'Usuário {"ativado" if usuario.ativo else "desativado"} com sucesso!'
})
except Exception as e:
db.rollback()
return jsonify({
'success': False,
'error': str(e)
}), 500
finally:
db.close()
@usuario_bp.route('/usuarios/<int:user_id>/alterar_nivel', methods=['POST'])
@require_login
def alterar_nivel(user_id):
"""Altera o nível de acesso de um usuário"""
if not current_user.is_admin:
return jsonify({
'success': False,
'error': 'Você não tem permissão para alterar níveis de usuários.'
}), 403
novo_nivel = request.form.get('novo_nivel')
if not novo_nivel:
return jsonify({
'success': False,
'error': 'Novo nível não especificado.'
}), 400
db = get_db_session()
try:
usuario = db.query(Usuario).get(user_id)
if not usuario:
return jsonify({
'success': False,
'error': 'Usuário não encontrado.'
}), 404
# Buscar role pelo nível
role = db.query(Role).filter_by(nivel=int(novo_nivel)).first()
if not role:
return jsonify({
'success': False,
'error': 'Nível de acesso inválido.'
}), 400
# Limpar roles existentes e adicionar nova
usuario.roles.clear()
usuario.roles.append(role)
db.commit()
return jsonify({
'success': True,
'message': f'Nível de acesso alterado para {role.nome} com sucesso!'
})
except Exception as e:
db.rollback()
return jsonify({
'success': False,
'error': str(e)
}), 500
finally:
db.close()
@usuario_bp.route('/usuarios/<int:user_id>/toggle_quadro_orientador', methods=['POST'])
@require_login
def toggle_quadro_orientador(user_id):
"""Ativa/desativa quadro orientador para um usuário"""
if not current_user.is_admin:
return jsonify({
'success': False,
'error': 'Você não tem permissão para alterar responsabilidades de usuários.'
}), 403
db = get_db_session()
try:
usuario = db.query(Usuario).get(user_id)
if not usuario:
return jsonify({
'success': False,
'error': 'Usuário não encontrado.'
}), 404
# Toggle quadro orientador
if usuario.quadro_orientador:
usuario.quadro_orientador = False
message = 'Quadro Orientador desativado com sucesso!'
else:
usuario.quadro_orientador = True
message = 'Quadro Orientador ativado com sucesso!'
db.commit()
return jsonify({
'success': True,
'message': message,
'quadro_orientador': usuario.quadro_orientador
})
except Exception as e:
db.rollback()
return jsonify({
'success': False,
'error': str(e)
}), 500
finally:
db.close()