def initial_insert():
    rol_1 = Rol(id=1, nombre="Monitor")
    rol_2 = Rol(id=2, nombre="Asistente")
    rol_3 = Rol(id=3, nombre="Profesor")
    rol_4 = Rol(id=4, nombre="Administrador")

    db.session.add(rol_1)
    db.session.add(rol_2)
    db.session.add(rol_3)
    db.session.add(rol_4)

    hashed_password = bcrypt.generate_password_hash("admin1").decode("utf-8")
    user = Usuario(login="******",
                   password=hashed_password,
                   rol_id=4,
                   nombres="Admin",
                   apellidos="Admin",
                   activado=True)
    db.session.add(user)

    curso = Curso(nombre="Opti")
    db.session.add(curso)

    semestre = Semestre(nombre="201920")
    db.session.add(semestre)
    db.session.commit()
def crearProfesor(curso_id, semestre_id):
    user_id = current_user.get_id()
    user = Usuario.query.filter_by(id=user_id).first()
    if user.rol_id == 1:
        abort(403)
    form = CrearMonitorForm()
    password = randomString(10)
    if form.validate_on_submit():
        hashed_password = bcrypt.generate_password_hash(password).decode(
            "utf-8")
        user = Usuario(login=form.login.data,
                       password=hashed_password,
                       rol_id=3,
                       activado=False)
        db.session.add(user)
        db.session.commit()
        usuario = Usuario.query.filter_by(login=form.login.data).first()
        usuario_creado_email(usuario)
        flash(
            f"Profesor creado exitosamente. Es necesario que este usuario establezca su propia contraseña.",
            "success")
        return redirect(
            url_for("usuarios.verMonitores",
                    curso_id=curso_id,
                    semestre_id=semestre_id))
    return render_template("usuarios/crear_monitor.html",
                           title="Crear profesor",
                           form=form,
                           legend="Profesor")
def register():
    user_id = current_user.get_id()
    user = Usuario.query.filter_by(id=user_id).first()
    if user.rol_id != 4:
        abort(403)
    roles = [(r.id, r.nombre) for r in Rol.query.all()]
    form = RegistrationForm(request.form)
    form.rol.choices = roles
    password = randomString(10)
    if form.validate_on_submit():
        hashed_password = bcrypt.generate_password_hash(password).decode(
            "utf-8")
        user = Usuario(login=form.login.data,
                       password=hashed_password,
                       rol_id=form.rol.data,
                       activado=False)
        db.session.add(user)
        db.session.commit()
        usuario = Usuario.query.filter_by(login=form.login.data).first()
        usuario_creado_email(usuario)
        flash(
            f"Usuario creado exitosamente. Es necesario que este usuario establezca su propia contraseña.",
            "success")
        return redirect(url_for("usuarios.get_usuarios"))
    return render_template("usuarios/crear_usuario.html",
                           title="Crear usuario",
                           form=form)
def cambiar_contrasena(usuario_id):
    user = Usuario.query.get_or_404(usuario_id)
    form = EstablecerContraseñaForm()
    if form.validate_on_submit():
        hashed_password = bcrypt.generate_password_hash(
            form.password.data).decode('utf-8')
        user.password = hashed_password
        db.session.commit()
        flash('La constreña ha sido definida', 'success')
        return redirect(url_for('cursos.get_cursos'))
    return render_template('usuarios/establecerContrasena.html',
                           title='Cambiar contraseña',
                           form=form)
def reset_password(token):
    if current_user.is_authenticated:
        return redirect(url_for('main.home'))
    user = Usuario.verify_token_password(token)
    if user is None:
        flash(
            'El link de cambio de contraseña ha expirado. Necesitas crear uno nuevo de la misma manera en que creaste el anterior',
            'warning')
        return redirect(url_for('main.home'))
    form = EstablecerContraseñaForm()
    if form.validate_on_submit():
        hashed_password = bcrypt.generate_password_hash(
            form.password.data).decode('utf-8')
        user.password = hashed_password
        db.session.commit()
        flash('La constreña ha sido definida. Ya puedes iniciar sesión.',
              'success')
        return redirect(url_for('usuarios.login'))
    return render_template('usuarios/establecerContrasena.html',
                           title='Cambiar contraseña',
                           form=form)