File size: 2,723 Bytes
339f372
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from aiogram import Router, F
from aiogram.types import Message, CallbackQuery
from aiogram.fsm.context import FSMContext
from app.database import requests as rq
from app.keyboards import user_keyboards as kb
from app.states import TestStates
from app.database.requests import check_user_registered

router = Router()

@router.message(F.text == "Пройти тест")
async def show_available_tests(message: Message):
    registration_status = await check_user_registered(message.from_user.id)
    if registration_status:
        await message.answer(
            "Выберите тест:",
            reply_markup=await kb.get_tests_keyboard()
        )
    if not registration_status:
        await message.answer(
            "Зарегистрируйтесь, чтобы сохранить Ваши результаты и получить персональные рекомендации!",
            reply_markup=kb.user_back
        )

@router.callback_query(F.data.startswith("start_test_"))
async def start_test(callback: CallbackQuery, state: FSMContext):
    test_id = callback.data.split("_")[2]
    test_data = await rq.start_test_attempt(
        callback.from_user.id,
        test_id
    )
    
    if not test_data:
        await callback.message.answer("Тест недоступен")
        return

    await state.set_state(TestStates.answering)
    await state.update_data(
        attempt_id=test_data["attempt_id"],
        current_question=1,
        total_questions=test_data["total_questions"]
    )

    await callback.message.answer(
        f"Вопрос 1 из {test_data['total_questions']}:\n\n"
        f"{test_data['question'].question_content}",
        reply_markup=await kb.get_test_question_keyboard(test_data["question"])
    )

@router.callback_query(F.data.startswith("test_answer_"))
async def process_answer(callback: CallbackQuery, state: FSMContext):
    _, _, question_id, answer = callback.data.split("_")
    
    data = await state.get_data()
    result = await rq.record_answer(data["attempt_id"],
        int(question_id),
        answer
    )

    if result.get("completed"):
        await callback.message.answer(
            f"Тест завершен!\n\n"
            f"Ваш результат: {result['result']}"
        )
        await state.clear()
    else:
        current_q = data["current_question"] + 1
        await state.update_data(current_question=current_q)
        
        await callback.message.answer(
            f"Вопрос {current_q} из {data['total_questions']}:\n\n"
            f"{result['next_question'].question_content}",
            reply_markup=await kb.get_test_question_keyboard(result["next_question"])
        )