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:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user