def validatePassword(form, field): db = get_db() user = db.execute('SELECT * FROM Users WHERE login = ?', (form.login.data, )).fetchone() if user is not None and not check_password_hash(user['password'], field.data): raise ValidationError('Неверный пароль.')
def index(): """Показывает главное меню.""" # Получение общего количества вопросов db = get_db() quesCount = db.execute( 'SELECT COUNT(quesID) AS quesCount FROM Questions;').fetchone() quesCount = quesCount['quesCount'] return render_template("main/index.html", quesCount=quesCount)
def load_logged_in_user(): user_id = session.get('user_id') if user_id is None: g.user = None else: g.user = get_db().execute('SELECT * FROM Users WHERE userID = ?', (user_id, )).fetchone()
def login(): form = LogInForm() if form.validate_on_submit(): login = form.login.data db = get_db() user = db.execute('SELECT * FROM Users WHERE login = ?', (login, )).fetchone() session.clear() session['user_id'] = user['userID'] return redirect(url_for('index')) return render_template('auth/login.html', form=form)
def register(): form = LogUpForm() if form.validate_on_submit(): login = form.login.data password = form.password.data surname = form.surname.data name = form.name.data patronym = form.patronym.data dateOfBirth = form.dateOfBirth.data db = get_db() db.execute( 'INSERT INTO Users (login, password, surname, name, patronym, dateOfBirth) VALUES (?, ?, ?, ?, ?, ?)', (login, generate_password_hash(password), surname, name, patronym, dateOfBirth)) db.commit() return redirect(url_for('auth.login')) return render_template('auth/register.html', form=form)
def result(): db = get_db() # Получение общего количества вопросов quesCount = db.execute( 'SELECT COUNT(quesID) AS quesCount FROM Questions').fetchone() quesCount = quesCount['quesCount'] # Ограничение доступа к странице результатов. if g.user['progress'] <= int(quesCount): abort(403, "Тестирование еще не завершено.".format(g.user['progress'])) # Вычисление результата ansData = db.execute( 'SELECT SUM(validity) AS ansSum, MAX(answered) AS ansDate FROM Testing JOIN Answers USING(ansID)' 'WHERE userID = ?', (g.user['userID'], )).fetchone() resSum = db.execute( 'SELECT SUM(validity) AS resSum FROM Answers').fetchone() res = int(ansData['ansSum'] / resSum['resSum'] * 100) return render_template("main/result.html", res=res, date=ansData['ansDate'])
def test(): # Получение номера текущего вопроса из адреса currentQues = request.args.get('ques', 1, type=int) db = get_db() # Получение формулировки вопроса question = db.execute('SELECT * FROM Questions WHERE quesID = ?', (currentQues, )).fetchone() # Ошибка при переходе на несуществующий вопрос. if question is None: abort(404, "Вопрос № {0} не существует.".format(currentQues)) # Получение общего количества вопросов quesCount = db.execute( 'SELECT COUNT(quesID) AS quesCount FROM Questions;').fetchone() quesCount = quesCount['quesCount'] # Ограничение доступа к пройденным вопросам или вопросам в неверном порядке. if g.user['progress'] > quesCount: flash("Вы уже завершили тестирование, Поздравляем!".format( g.user['progress'], "http://127.0.0.1:5000" + url_for('index'))) return redirect(url_for('index')) if g.user['progress'] != currentQues: abort( 403, "Вы остановились на вопросе № {}. Чтобы продолжить, перейдите по ссылке {}." .format( g.user['progress'], "http://127.0.0.1:5000" + url_for('main.test', ques=g.user['progress']))) # Получение ответов answers = db.execute("SELECT ansID, ansCont FROM Answers WHERE quesID = ?", (currentQues, )).fetchall() ansData = db.execute( 'SELECT COUNT(validity) AS ansCount, SUM(validity) AS ansSum FROM Answers WHERE quesID = ?', (currentQues, )).fetchone() # Создание формы для вопроса if ansData['ansCount'] == 1 and ansData['ansSum'] == 1: form = TextForm() elif ansData['ansSum'] == 1: form = RadioForm(answers) else: form = CheckboxForm(answers) # Обработка подтверждения формы if form.validate_on_submit(): ansIDs = [] # Случай с текстовым полем. if ansData['ansCount'] == 1 and ansData['ansSum'] == 1: ansID = None # Если введенное пользователем соответствует правильному ответу, сохряняется ID этого ответа. if form.textAns.data == answers[0]['ansCont']: ansID = answers[0]['ansID'] ansIDs.append(ansID) # Случай с одним вариантом. elif ansData['ansSum'] == 1: ansIDs.append(form.radioAns.data) # Случай с несколькими вариантами. else: # Сохраняются ID отмеченных ответов. if form.checkboxAns_0.data: ansIDs.append(answers[0]['ansID']) if form.checkboxAns_1.data: ansIDs.append(answers[1]['ansID']) if form.checkboxAns_2.data: ansIDs.append(answers[2]['ansID']) if form.checkboxAns_3.data: ansIDs.append(answers[3]['ansID']) if form.checkboxAns_4.data: ansIDs.append(answers[4]['ansID']) # Добавление ответа в БД. for ansID in ansIDs: db.execute( 'INSERT INTO Testing (userID, quesID, ansID) VALUES (?, ?, ?)', (g.user['userID'], currentQues, ansID)) db.commit() # Обновление прогресса пользователя. db.execute('UPDATE Users SET progress = ? WHERE userID = ?;', (currentQues + 1, g.user['userID'])) db.commit() if g.user['progress'] + 1 > quesCount: return redirect(url_for('main.result')) else: return redirect(url_for('main.test', ques=currentQues + 1)) return render_template("main/test.html", form=form, question=question, ansData=ansData)
def validateLogin(form, field): db = get_db() user = db.execute('SELECT * FROM Users WHERE login = ?', (field.data, )).fetchone() if user is None: raise ValidationError('Неверный логин.')
def validateLogup(form, field): db = get_db() if db.execute('SELECT userID FROM Users WHERE login = ?', (field.data, )).fetchone() is not None: raise ValidationError('Пользователь {} уже зарегистрирован.'.format( field.data))