Пример #1
0
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('Неверный пароль.')
Пример #2
0
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)
Пример #3
0
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()
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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'])
Пример #7
0
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)
Пример #8
0
def validateLogin(form, field):
    db = get_db()
    user = db.execute('SELECT * FROM Users WHERE login = ?',
                      (field.data, )).fetchone()
    if user is None:
        raise ValidationError('Неверный логин.')
Пример #9
0
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))