From efc8f04836dc28e89b2804da65b165cec0851ed2 Mon Sep 17 00:00:00 2001 From: Egor Date: Thu, 25 Sep 2025 18:14:12 +0300 Subject: [PATCH] Enable direct bot configuration edits from setting view --- app/handlers/admin/bot_configuration.py | 77 ++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/app/handlers/admin/bot_configuration.py b/app/handlers/admin/bot_configuration.py index b2b5281e..0198397a 100644 --- a/app/handlers/admin/bot_configuration.py +++ b/app/handlers/admin/bot_configuration.py @@ -79,6 +79,22 @@ def _parse_category_payload(payload: str) -> Tuple[str, str, int, int]: return group_key, category_key, category_page, settings_page +async def _remember_setting_context( + state: FSMContext, + key: str, + group_key: str, + category_page: int, + settings_page: int, +) -> None: + await state.update_data( + setting_key=key, + setting_group_key=group_key, + setting_category_page=category_page, + setting_settings_page=settings_page, + ) + await state.set_state(BotConfigStates.waiting_for_value) + + def _parse_group_payload(payload: str) -> Tuple[str, int]: parts = payload.split(":") group_key = parts[1] if len(parts) > 1 else CATEGORY_FALLBACK_KEY @@ -349,6 +365,9 @@ def _render_setting_text(key: str) -> str: f"Текущее значение: {summary['current']}", f"Значение по умолчанию: {summary['original']}", f"Переопределено в БД: {'✅ Да' if summary['has_override'] else '❌ Нет'}", + "", + "Отправьте новое значение сообщением, чтобы обновить настройку.", + "Или используйте кнопки ниже для дополнительных действий.", ] return "\n".join(lines) @@ -360,6 +379,7 @@ async def show_bot_config_menu( callback: types.CallbackQuery, db_user: User, db: AsyncSession, + state: FSMContext, ): keyboard = _build_groups_keyboard() await callback.message.edit_text( @@ -367,6 +387,7 @@ async def show_bot_config_menu( reply_markup=keyboard, ) await callback.answer() + await state.clear() @admin_required @@ -375,6 +396,7 @@ async def show_bot_config_group( callback: types.CallbackQuery, db_user: User, db: AsyncSession, + state: FSMContext, ): group_key, page = _parse_group_payload(callback.data) grouped = _get_grouped_categories() @@ -391,6 +413,7 @@ async def show_bot_config_group( reply_markup=keyboard, ) await callback.answer() + await state.clear() @admin_required @@ -399,6 +422,7 @@ async def show_bot_config_category( callback: types.CallbackQuery, db_user: User, db: AsyncSession, + state: FSMContext, ): group_key, category_key, category_page, settings_page = _parse_category_payload( callback.data @@ -422,6 +446,7 @@ async def show_bot_config_category( reply_markup=keyboard, ) await callback.answer() + await state.clear() @admin_required @@ -430,6 +455,7 @@ async def show_bot_config_setting( callback: types.CallbackQuery, db_user: User, db: AsyncSession, + state: FSMContext, ): parts = callback.data.split(":", 4) group_key = parts[1] if len(parts) > 1 else CATEGORY_FALLBACK_KEY @@ -447,6 +473,14 @@ async def show_bot_config_setting( await callback.message.edit_text(text, reply_markup=keyboard) await callback.answer() + await _remember_setting_context( + state, + key, + group_key, + category_page, + settings_page, + ) + @admin_required @error_handler @@ -502,13 +536,13 @@ async def start_edit_setting( ), ) - await state.update_data( - setting_key=key, - setting_group_key=group_key, - setting_category_page=category_page, - setting_settings_page=settings_page, + await _remember_setting_context( + state, + key, + group_key, + category_page, + settings_page, ) - await state.set_state(BotConfigStates.waiting_for_value) await callback.answer() @@ -534,7 +568,12 @@ async def handle_edit_setting( try: value = bot_configuration_service.parse_user_value(key, message.text or "") except ValueError as error: - await message.answer(f"⚠️ {error}") + error_text = str(error) + if error_text == "Ввод отменен пользователем": + await message.answer("❌ Изменение отменено") + await state.clear() + else: + await message.answer(f"⚠️ {error_text}") return await bot_configuration_service.set_value(db, key, value) @@ -544,7 +583,13 @@ async def handle_edit_setting( keyboard = _build_setting_keyboard(key, group_key, category_page, settings_page) await message.answer("✅ Настройка обновлена") await message.answer(text, reply_markup=keyboard) - await state.clear() + await _remember_setting_context( + state, + key, + group_key, + category_page, + settings_page, + ) @admin_required @@ -553,6 +598,7 @@ async def reset_setting( callback: types.CallbackQuery, db_user: User, db: AsyncSession, + state: FSMContext, ): parts = callback.data.split(":", 4) group_key = parts[1] if len(parts) > 1 else CATEGORY_FALLBACK_KEY @@ -571,6 +617,13 @@ async def reset_setting( text = _render_setting_text(key) keyboard = _build_setting_keyboard(key, group_key, category_page, settings_page) await callback.message.edit_text(text, reply_markup=keyboard) + await _remember_setting_context( + state, + key, + group_key, + category_page, + settings_page, + ) await callback.answer("Сброшено к значению по умолчанию") @@ -580,6 +633,7 @@ async def toggle_setting( callback: types.CallbackQuery, db_user: User, db: AsyncSession, + state: FSMContext, ): parts = callback.data.split(":", 4) group_key = parts[1] if len(parts) > 1 else CATEGORY_FALLBACK_KEY @@ -600,6 +654,13 @@ async def toggle_setting( text = _render_setting_text(key) keyboard = _build_setting_keyboard(key, group_key, category_page, settings_page) await callback.message.edit_text(text, reply_markup=keyboard) + await _remember_setting_context( + state, + key, + group_key, + category_page, + settings_page, + ) await callback.answer("Обновлено")