VM-Dashboard-Manager/routers/user_routers.py

173 lines
6.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from flask import render_template, flash, redirect, request, url_for, session, Blueprint
from flask_login import login_required, current_user, login_user
from forms import RegisterForm, UpdateUserPass, UpdateUser
from passlib.hash import sha256_crypt
from db_manager import db, User, Actions, get_user_by_username, VirtualMachine
import secrets
import os
user_blueprint = Blueprint('user', __name__)
@user_blueprint.route('/logout')
@login_required
def logout():
session.clear()
flash('Вы вышли из системы', 'success')
return redirect(url_for('index'))
@user_blueprint.route('/register', methods=['GET', 'POST'])
def register():
if (os.environ.get('REGISTER_OFF')).lower() == 'false':
form = RegisterForm(request.form)
if request.method == 'POST' and form.validate():
name = form.name.data
email = form.email.data
username = form.username.data
password = sha256_crypt.hash(str(form.password.data))
existing_user = User.query.filter_by(username=username).first()
existing_email = User.query.filter_by(email=email).first()
if existing_user:
flash('Пользователь с таким именем уже существует.', 'danger')
return redirect(url_for('user.register'))
if existing_email:
flash('Пользователь с таким email уже существует.', 'danger')
return redirect(url_for('user.register'))
new_user = User(name=name, email=email, username=username, password=password, is_admin=False)
new_user.token = secrets.token_hex(16)
db.session.add(new_user)
db.session.commit()
flash('Теперь вы зарегистрированы и можете войти. Добро пожаловать в PrintumVMs!!', 'success')
return redirect(url_for('user.login'))
return render_template('register.html', form=form)
else:
return render_template('register_off.html', img='/static/image/stop.png')
@user_blueprint.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password_candidate = request.form['password']
users = User.query.filter_by(username=username).first()
if users and sha256_crypt.verify(password_candidate, users.password):
session['logged_in'] = True
session['username'] = username
session['names'] = users.name
session['user_ip'] = request.remote_addr
session['is_admin'] = users.is_admin
users.last_successful_entry = datetime.now()
users.last_address = session['user_ip']
db.session.commit()
login_user(users)
new_action = Actions(user_id=get_user_by_username(username).id,
action_type='login_user',
action_info=request.remote_addr)
db.session.add(new_action)
db.session.commit()
flash('Вы успешно авторизовались', 'success')
return redirect(url_for('index'))
else:
flash('Неверное имя пользователя или пароль', 'danger')
return render_template('login.html')
return render_template('login.html')
@user_blueprint.route('/update_user_info', methods=['GET', 'POST'])
@login_required
def update_user_info():
if request.method == 'POST':
form = UpdateUser(request.form)
if form.validate():
current_user.name = form.name.data
current_user.user_information = form.user_information.data
db.session.commit()
flash('Информация о пользователе успешно обновлена.', 'success')
else:
flash('Ошибка при обновлении информации о пользователе.', 'danger')
return redirect(url_for('index'))
users = User.query.filter_by(username=session['username']).first()
return render_template('edit_info.html', user=users)
@user_blueprint.route('/update_pass', methods=['GET', 'POST'])
@login_required
def update_pass():
if request.method == 'POST':
form = UpdateUserPass(request.form)
if form.new_password.data and form.validate():
current_user.password = sha256_crypt.hash(str(form.new_password.data))
db.session.commit()
flash('Пароль именён!.', 'success')
else:
flash('Ошибка смены пароля!.', 'danger')
return redirect(url_for('index'))
users = User.query.filter_by(username=session['username']).first()
return render_template('edit_pass.html', user=users)
@user_blueprint.route('/delete_user/<string:username>', methods=['POST'])
@login_required
def delete_user(username):
if current_user.is_admin:
user_to_delete = User.query.filter_by(username=username).first()
if user_to_delete:
db.session.delete(user_to_delete)
db.session.commit()
flash('Пользователь успешно удален.', 'success')
return redirect(url_for('admin'))
else:
flash('Ошибка при удалении пользователя.', 'danger')
return redirect(url_for('admin'))
else:
flash('🔔 Вы не администратор! 🔔', 'danger')
return redirect(url_for('index'))
@user_blueprint.route('/user_info/<string:username>', methods=['GET'])
@login_required
def user_info(username):
if current_user.is_admin:
page = request.args.get('page', 1, type=int)
user = User.query.filter_by(username=username).first()
user_data = db.session.query(Actions, VirtualMachine.name, VirtualMachine.hyper) \
.outerjoin(VirtualMachine, Actions.vm == VirtualMachine.id) \
.filter(Actions.user_id == user.id) \
.order_by(Actions.action_timestamp.desc()) \
.paginate(page=page, per_page=50)
return render_template('user_info.html', user_data=user_data, user_pg=user.username)
else:
flash('🔔 Вы не администратор! 🔔', 'danger')
return redirect(url_for('index'))