Zlovoblachko's picture
Add application file
339f372
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"])
)