fix(tasks): handle next_task by resetting FSM to doing_tasks; add stop/cancel controls and stop button\n\nfix(words/import): pass user level into VocabularyService.add_word via difficulty_level; rename incorrect 'difficulty' arg to 'difficulty_level'

This commit is contained in:
2025-12-04 16:44:16 +03:00
parent 80f248770a
commit cf8f71e24a
3 changed files with 37 additions and 7 deletions

View File

@@ -95,7 +95,8 @@ async def process_text(message: Message, state: FSMContext):
await state.update_data( await state.update_data(
words=words, words=words,
user_id=user.id, user_id=user.id,
original_text=text original_text=text,
level=user.level.name
) )
await state.set_state(ImportStates.viewing_words) await state.set_state(ImportStates.viewing_words)
@@ -189,7 +190,7 @@ async def import_single_word(callback: CallbackQuery, state: FSMContext):
examples=[{"en": word_data.get('context', ''), "ru": ""}] if word_data.get('context') else [], examples=[{"en": word_data.get('context', ''), "ru": ""}] if word_data.get('context') else [],
source=WordSource.CONTEXT, source=WordSource.CONTEXT,
category='imported', category='imported',
difficulty_level=None difficulty_level=data.get('level')
) )
await callback.answer(f"✅ Слово '{word_data['word']}' добавлено в словарь") await callback.answer(f"✅ Слово '{word_data['word']}' добавлено в словарь")
@@ -226,7 +227,7 @@ async def import_all_words(callback: CallbackQuery, state: FSMContext):
examples=[{"en": word_data.get('context', ''), "ru": ""}] if word_data.get('context') else [], examples=[{"en": word_data.get('context', ''), "ru": ""}] if word_data.get('context') else [],
source=WordSource.CONTEXT, source=WordSource.CONTEXT,
category='imported', category='imported',
difficulty_level=None difficulty_level=data.get('level')
) )
added_count += 1 added_count += 1

View File

@@ -151,10 +151,13 @@ async def process_answer(message: Message, state: FSMContext):
# Показываем результат и кнопку "Далее" # Показываем результат и кнопку "Далее"
keyboard = InlineKeyboardMarkup(inline_keyboard=[ keyboard = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text="➡️ Следующее задание", callback_data="next_task")] [InlineKeyboardButton(text="➡️ Следующее задание", callback_data="next_task")],
[InlineKeyboardButton(text="🔚 Завершить", callback_data="stop_tasks")]
]) ])
await message.answer(result_text, reply_markup=keyboard) await message.answer(result_text, reply_markup=keyboard)
# После показа результата ждём нажатия кнопки переключаемся в состояние doing_tasks
await state.set_state(TaskStates.doing_tasks)
@router.callback_query(F.data == "next_task", TaskStates.doing_tasks) @router.callback_query(F.data == "next_task", TaskStates.doing_tasks)
@@ -165,6 +168,31 @@ async def next_task(callback: CallbackQuery, state: FSMContext):
await callback.answer() await callback.answer()
@router.callback_query(F.data == "stop_tasks", TaskStates.doing_tasks)
async def stop_tasks_callback(callback: CallbackQuery, state: FSMContext):
"""Остановить выполнение заданий через кнопку"""
await state.clear()
await callback.message.edit_reply_markup(reply_markup=None)
await callback.message.answer("Задания завершены. Используй /task, чтобы начать заново.")
await callback.answer()
@router.message(Command("stop"), TaskStates.doing_tasks)
@router.message(Command("stop"), TaskStates.waiting_for_answer)
async def stop_tasks(message: Message, state: FSMContext):
"""Остановить выполнение заданий командой /stop"""
await state.clear()
await message.answer("Задания остановлены. Используй /task, чтобы начать заново.")
@router.message(Command("cancel"), TaskStates.doing_tasks)
@router.message(Command("cancel"), TaskStates.waiting_for_answer)
async def cancel_tasks(message: Message, state: FSMContext):
"""Отмена выполнения заданий командой /cancel"""
await state.clear()
await message.answer("Отменено. Можешь вернуться к заданиям командой /task.")
async def finish_tasks(message: Message, state: FSMContext): async def finish_tasks(message: Message, state: FSMContext):
"""Завершение всех заданий""" """Завершение всех заданий"""
data = await state.get_data() data = await state.get_data()

View File

@@ -69,7 +69,8 @@ async def cmd_words(message: Message, state: FSMContext):
await state.update_data( await state.update_data(
theme=theme, theme=theme,
words=words, words=words,
user_id=user.id user_id=user.id,
level=user.level.name
) )
await state.set_state(WordsStates.viewing_words) await state.set_state(WordsStates.viewing_words)
@@ -155,7 +156,7 @@ async def add_single_word(callback: CallbackQuery, state: FSMContext):
examples=[{"en": word_data.get('example', ''), "ru": ""}] if word_data.get('example') else [], examples=[{"en": word_data.get('example', ''), "ru": ""}] if word_data.get('example') else [],
source=WordSource.SUGGESTED, source=WordSource.SUGGESTED,
category=data.get('theme', 'general'), category=data.get('theme', 'general'),
difficulty=None difficulty_level=data.get('level')
) )
await callback.answer(f"✅ Слово '{word_data['word']}' добавлено в словарь") await callback.answer(f"✅ Слово '{word_data['word']}' добавлено в словарь")
@@ -193,7 +194,7 @@ async def add_all_words(callback: CallbackQuery, state: FSMContext):
examples=[{"en": word_data.get('example', ''), "ru": ""}] if word_data.get('example') else [], examples=[{"en": word_data.get('example', ''), "ru": ""}] if word_data.get('example') else [],
source=WordSource.SUGGESTED, source=WordSource.SUGGESTED,
category=theme, category=theme,
difficulty=None difficulty_level=data.get('level')
) )
added_count += 1 added_count += 1