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 admin_keyboards as kb
from app.states import AdminAddTest, AdminStates
from app.middleware.authentification import admin_check
router = Router()
@router.message(F.text == 'Отредактировать тесты')
async def test_editor_start(message: Message):
if not await admin_check(message, {}):
await message.answer("У вас нет доступа к админ-панели")
return
await message.answer(
'Текущие тесты. Нажмите для редактирования',
reply_markup=await kb.admin_keyboard_tests()
)
@router.callback_query(F.data == 'add_test')
async def add_test(callback: CallbackQuery, state: FSMContext):
await callback.answer('Добавляем тест')
await state.set_state(AdminAddTest.admin_set_title)
await callback.message.answer('Введите название теста (пожалуйста, не используйте "_" в названии!)')
@router.message(AdminAddTest.admin_set_title)
async def add_test_name(message: Message, state: FSMContext):
await state.update_data(name=message.text)
await state.set_state(AdminAddTest.admin_set_desc)
await message.answer('Введите краткое описание теста')
@router.message(AdminAddTest.admin_set_desc)
async def add_test_desc(message: Message, state: FSMContext):
await state.update_data(desc=message.text)
await state.set_state(AdminAddTest.admin_set_status)
await message.answer('Хотите ли Вы сделать данный тест активным? Активные тесты будут тут же доступны для '
'взаимодействия в пользовательском интерфейсе.', reply_markup=kb.yes_no_keyboard)
@router.message(AdminAddTest.admin_set_status)
async def add_test_status(message: Message, state: FSMContext):
await state.update_data(status=message.text)
await state.set_state(AdminAddTest.admin_set_type)
await message.answer('Введите тип теста: с баллами или без баллов. Тесты с баллами предполагают вывод разных '
'итогов теста в зависимости от количества набранных баллов, тесты без баллов предполагают '
'одно и то же сообщение по итогам прохождения', reply_markup=kb.test_type_keyboard)
@router.message(AdminAddTest.admin_set_type)
async def add_test_type(message: Message, state: FSMContext):
await state.update_data(type=message.text)
if message.text == 'С баллами':
await state.update_data(completion_message=None)
data = await state.get_data()
await rq.add_test_wo_points(data['name'], data['type'], data['desc'], True if data['status'] == 'Да' else False,
data['completion_message'])
await state.set_state(AdminAddTest.admin_set_completion_result_set)
await message.answer('Введите вариант сообщения, показывающегося в конце теста, и количество баллов, нужное для его '
'достижения в следующем формате: \n'
'22-24 \n'
'Вы получили результат 1!')
if message.text == 'Без баллов':
await state.set_state(AdminAddTest.admin_set_completion_result)
await message.answer('Введите сообщение, показывающееся в конце теста')
@router.message(AdminAddTest.admin_set_completion_result)
async def add_test_completion_wo(message: Message, state: FSMContext):
await state.update_data(completion_message=message.text)
data = await state.get_data()
await rq.add_test_wo_points(data['name'], data['type'], data['desc'], True if data['status'] == 'Да' else False, data['completion_message'])
await state.set_state(AdminAddTest.admin_add_question_vars_wo_points)
await message.answer('Введите первый вопрос, на следующих строках введите варианты ответа. Например: \n\n'
'В каком году Юрий Гагарин полетел в космос?\n***\n'
'1963 год \n'
'1961 год \n'
'1968 год')
@router.message(AdminAddTest.admin_add_question_vars_wo_points)
async def add_question_wo(message: Message, state: FSMContext):
data = await state.get_data()
await rq.add_question_vars_wo_points(data['name'], message.text)
await state.set_state(AdminAddTest.admin_end_questions)
await message.answer('Хотите ли вы добавить еще один вопрос?', reply_markup=kb.yes_no_keyboard)
@router.message(AdminAddTest.admin_end_questions)
async def do_we_continue_q(message: Message, state: FSMContext):
if message.text == 'Да':
await state.set_state(AdminAddTest.admin_add_question_vars_wo_points)
await message.answer('Введите вопрос, придерживаясь такого же форматирования, как раньше')
elif message.text == 'Нет':
await state.clear()
await message.answer('Спасибо! Ваш тест сохранен! Можно вернуться в меню!', reply_markup=kb.admin_back)
@router.message(AdminAddTest.admin_set_completion_result_set)
async def add_test_completion_w(message: Message, state: FSMContext):
data = await state.get_data()
await rq.add_test_result_w_points(data['name'], message.text)
await state.set_state(AdminAddTest.admin_end_results)
await message.answer('Хотите ли вы добавить еще вариант?', reply_markup=kb.yes_no_keyboard)
@router.message(AdminAddTest.admin_end_results)
async def add_test_completion_choice(message: Message, state: FSMContext):
if message.text == 'Да':
await state.set_state(AdminAddTest.admin_set_completion_result_set)
await message.answer(
'Введите вариант сообщения, показывающегося в конце теста, и количество баллов, нужное для его '
'достижения в следующем формате: \n'
'22-24 \n'
'Вы получили результат 1!')
if message.text == 'Нет':
await state.set_state(AdminAddTest.admin_add_question_vars_wo_points)
await message.answer('Введите первый вопрос, на следующих строках введите варианты ответа. После каждого ответа '
'указывайте количество баллов, начисляемых за этот вариант, через .... Например: \n\n'
'В каком году Юрий Гагарин полетел в космос?\n***\n'
'1963 год...0 \n'
'1961 год...2 \n'
'1968 год...0')
@router.callback_query(F.data.startswith('change_test_'))
async def view_test(callback: CallbackQuery):
await callback.answer('')
test_data = await rq.get_test(callback.data.split('_')[2])
results_string = ''
if not test_data['results']:
results_string += 'Отдельных результатов теста нет'
else:
for i in range(len(test_data['results'])):
results_string += f'Результат теста для количества очков {test_data["results"][i].max_points} - {test_data["results"][i].min_points}: \n' \
f'{test_data["results"][i].result_text} \n'
questions_string = ''
if not test_data['questions']:
questions_string += 'У этого теста нет вопросов'
else:
for i in range(len(test_data['questions'])):
questions_string += f'Вопрос {i+1}: {test_data["questions"][i].question_content} \n' \
f'Варианты ответа: {test_data["questions"][i].question_variants} \n'
await callback.message.answer(f'Название теста: {test_data["test"].test_name}, \n'
f'Тип теста: {test_data["test"].test_type}, \n'
f'Описание теста: {test_data["test"].test_description} \n'
f'Статус активности теста: {test_data["test"].is_active} \n'
f'Сообщение о завершении теста: {test_data["test"].completion_message} \n'
f'Возможные результаты теста: \n{results_string} \n\n'
f'Вопросы теста: \n{questions_string} \n\n'
f'На данный момент подробное редактирование тестов не поддерживается. Если Вы хотите '
f'изменить статус активности теста, нажмите на соответствующую кнопку внизу. Если Вы '
f'хотите внести в тест содержательные изменения, мы рекомендуем удалить тест и '
f'внести его заново!',
reply_markup= await kb.admin_change_test(test_data['id']))
@router.callback_query(F.data.startswith('edittest_status_'))
async def change_status(callback: CallbackQuery, state: FSMContext):
await callback.answer('')
await state.update_data(id=callback.data.split('_')[2])
await state.set_state(AdminStates.admin_edit_test_status)
await callback.message.answer(f'Должен ли тест быть активным?', reply_markup=kb.yes_no_keyboard)
@router.message(AdminStates.admin_edit_test_status)
async def set_new_status(message: Message, state: FSMContext):
data = await state.get_data()
await rq.change_test_status(data['id'], message.text)
await message.answer('Изменения были сохранены! Теперь можно вернуться в меню!',
reply_markup=kb.admin_back)
await state.clear()
@router.callback_query(F.data.startswith('deletetest_'))
async def confirm_test_deletion(callback: CallbackQuery, state: FSMContext):
await callback.answer('')
await state.set_state(AdminStates.admin_delete_test)
await state.update_data(id=callback.data.split("_")[1])
await callback.message.answer(f'Вы уверены, что хотите удалить тест?',
reply_markup=kb.yes_no_keyboard)
@router.message(AdminStates.admin_delete_test)
async def delete_or_not_delete_test(message: Message, state: FSMContext):
if message.text == 'Нет':
await state.clear()
await message.answer('Тогда вернемся в меню :)', reply_markup=kb.admin_back)
if message.text == 'Да':
data = await state.get_data()
await rq.delete_test(data['id'])
await state.clear()
await message.answer('Тест был успешно удален! Можно вернуться в меню', reply_markup=kb.admin_back)
@router.callback_query(F.data == 'admin_to_main')
async def return_to_main(callback: CallbackQuery):
await callback.answer('Возвращаемся в меню')
await callback.message.answer('Здравствуйте! Что Вы хотите сделать?', reply_markup=kb.admin_main)