from flask import Blueprint, request, render_template, redirect, url_for, flash, jsonify from functions.database import get_db_connection, 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_connection() 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_connection() 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//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_connection() 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//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_connection() 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//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_connection() 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()