From dae34dc0ef8f3e0e4324008fa188f96d1e430ecb Mon Sep 17 00:00:00 2001 From: Egor Date: Sun, 31 Aug 2025 18:59:39 +0300 Subject: [PATCH] Update promocodes.py --- app/handlers/admin/promocodes.py | 85 +++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 13 deletions(-) diff --git a/app/handlers/admin/promocodes.py b/app/handlers/admin/promocodes.py index 9e7b5647..a5caabc5 100644 --- a/app/handlers/admin/promocodes.py +++ b/app/handlers/admin/promocodes.py @@ -189,6 +189,8 @@ async def show_promocode_management( await callback.answer() +# Замените эти функции в вашем файле + @admin_required @error_handler async def show_promocode_edit_menu( @@ -196,7 +198,12 @@ async def show_promocode_edit_menu( db_user: User, db: AsyncSession ): - promo_id = int(callback.data.split('_')[-1]) + callback_parts = callback.data.split('_') + if len(callback_parts) >= 3: + promo_id = int(callback_parts[2]) + else: + await callback.answer("❌ Ошибка получения ID промокода", show_alert=True) + return promo = await db.get(PromoCode, promo_id) if not promo: @@ -206,9 +213,23 @@ async def show_promocode_edit_menu( text = f""" ✏️ Редактирование промокода {promo.code} -Выберите параметр для изменения: +💰 Текущие параметры: """ + if promo.type == PromoCodeType.BALANCE.value: + text += f"• Бонус: {settings.format_price(promo.balance_bonus_kopeks)}\n" + elif promo.type in [PromoCodeType.SUBSCRIPTION_DAYS.value, PromoCodeType.TRIAL_SUBSCRIPTION.value]: + text += f"• Дней: {promo.subscription_days}\n" + + text += f"• Использований: {promo.current_uses}/{promo.max_uses}\n" + + if promo.valid_until: + text += f"• До: {format_datetime(promo.valid_until)}\n" + else: + text += f"• Срок: бессрочно\n" + + text += f"\nВыберите параметр для изменения:" + keyboard = [ [ types.InlineKeyboardButton( @@ -262,14 +283,19 @@ async def start_edit_promocode_date( db_user: User, state: FSMContext ): - promo_id = int(callback.data.split('_')[-1]) + callback_parts = callback.data.split('_') + if len(callback_parts) >= 4: + promo_id = int(callback_parts[3]) + else: + await callback.answer("❌ Ошибка получения ID промокода", show_alert=True) + return await state.update_data( editing_promo_id=promo_id, edit_action="date" ) - text = """ + text = f""" 📅 Изменение даты окончания промокода Введите количество дней до окончания (от текущего момента): @@ -277,6 +303,8 @@ async def start_edit_promocode_date( • Введите положительное число для установки срока Например: 30 (промокод будет действовать 30 дней) + +ID промокода: {promo_id} """ keyboard = types.InlineKeyboardMarkup(inline_keyboard=[ @@ -295,18 +323,25 @@ async def start_edit_promocode_amount( db_user: User, state: FSMContext ): - promo_id = int(callback.data.split('_')[-1]) + callback_parts = callback.data.split('_') + if len(callback_parts) >= 4: + promo_id = int(callback_parts[3]) + else: + await callback.answer("❌ Ошибка получения ID промокода", show_alert=True) + return await state.update_data( editing_promo_id=promo_id, edit_action="amount" ) - text = """ + text = f""" 💰 Изменение суммы бонуса промокода Введите новую сумму в рублях: Например: 500 + +ID промокода: {promo_id} """ keyboard = types.InlineKeyboardMarkup(inline_keyboard=[ @@ -317,7 +352,6 @@ async def start_edit_promocode_amount( await state.set_state(AdminStates.setting_promocode_value) await callback.answer() - @admin_required @error_handler async def start_edit_promocode_days( @@ -325,18 +359,25 @@ async def start_edit_promocode_days( db_user: User, state: FSMContext ): - promo_id = int(callback.data.split('_')[-1]) + callback_parts = callback.data.split('_') + if len(callback_parts) >= 4: + promo_id = int(callback_parts[3]) + else: + await callback.answer("❌ Ошибка получения ID промокода", show_alert=True) + return await state.update_data( editing_promo_id=promo_id, edit_action="days" ) - text = """ + text = f""" 📅 Изменение количества дней подписки Введите новое количество дней: Например: 30 + +ID промокода: {promo_id} """ keyboard = types.InlineKeyboardMarkup(inline_keyboard=[ @@ -355,14 +396,19 @@ async def start_edit_promocode_uses( db_user: User, state: FSMContext ): - promo_id = int(callback.data.split('_')[-1]) + callback_parts = callback.data.split('_') + if len(callback_parts) >= 4: + promo_id = int(callback_parts[3]) + else: + await callback.answer("❌ Ошибка получения ID промокода", show_alert=True) + return await state.update_data( editing_promo_id=promo_id, edit_action="uses" ) - text = """ + text = f""" 📊 Изменение максимального количества использований Введите новое количество использований: @@ -370,6 +416,8 @@ async def start_edit_promocode_uses( • Введите положительное число для ограничения Например: 100 + +ID промокода: {promo_id} """ keyboard = types.InlineKeyboardMarkup(inline_keyboard=[ @@ -803,7 +851,12 @@ async def confirm_delete_promocode( db_user: User, db: AsyncSession ): - promo_id = int(callback.data.split('_')[-1]) + callback_parts = callback.data.split('_') + if len(callback_parts) >= 3: + promo_id = int(callback_parts[2]) + else: + await callback.answer("❌ Ошибка получения ID промокода", show_alert=True) + return promo = await db.get(PromoCode, promo_id) if not promo: @@ -815,7 +868,13 @@ async def confirm_delete_promocode( Вы действительно хотите удалить промокод {promo.code}? -Внимание: Это действие нельзя отменить! +📊 Информация о промокоде: +• Использований: {promo.current_uses}/{promo.max_uses} +• Статус: {'Активен' if promo.is_active else 'Неактивен'} + +⚠️ Внимание: Это действие нельзя отменить! + +ID: {promo_id} """ keyboard = types.InlineKeyboardMarkup(inline_keyboard=[