diff --git a/app/handlers/admin/monitoring.py b/app/handlers/admin/monitoring.py index 178d3e0c..6efae06c 100644 --- a/app/handlers/admin/monitoring.py +++ b/app/handlers/admin/monitoring.py @@ -8,7 +8,7 @@ from aiogram.fsm.context import FSMContext from aiogram.exceptions import TelegramBadRequest from app.config import settings -from app.database.database import get_db +from app.database.database import AsyncSessionLocal from app.services.monitoring_service import monitoring_service from app.services.nalogo_queue_service import nalogo_queue_service from app.services.traffic_monitoring_service import ( @@ -383,12 +383,12 @@ async def _render_notification_settings_for_state( @admin_required async def admin_monitoring_menu(callback: CallbackQuery): try: - async for db in get_db(): + async with AsyncSessionLocal() as db: status = await monitoring_service.get_monitoring_status(db) - + running_status = "🟒 Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚" if status['is_running'] else "πŸ”΄ ΠžΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½" last_update = status['last_update'].strftime('%H:%M:%S') if status['last_update'] else "Никогда" - + text = f""" πŸ” БистСма ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° @@ -404,12 +404,11 @@ async def admin_monitoring_menu(callback: CallbackQuery): πŸ”§ Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ дСйствиС: """ - + language = callback.from_user.language_code or settings.DEFAULT_LANGUAGE keyboard = get_monitoring_keyboard(language) await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard) - break - + except Exception as e: logger.error(f"Ошибка Π² Π°Π΄ΠΌΠΈΠ½ мСню ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°: {e}") await callback.answer("❌ Ошибка получСния Π΄Π°Π½Π½Ρ‹Ρ…", show_alert=True) @@ -742,7 +741,7 @@ async def force_check_callback(callback: CallbackQuery): try: await callback.answer("⏳ ВыполняСм ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ подписок...") - async for db in get_db(): + async with AsyncSessionLocal() as db: results = await monitoring_service.force_check_subscriptions(db) text = f""" @@ -764,7 +763,6 @@ async def force_check_callback(callback: CallbackQuery): ]) await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard) - break except Exception as e: logger.error(f"Ошибка ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ: {e}") @@ -843,46 +841,45 @@ async def monitoring_logs_callback(callback: CallbackQuery): if "_page_" in callback.data: page = int(callback.data.split("_page_")[1]) - async for db in get_db(): + async with AsyncSessionLocal() as db: all_logs = await monitoring_service.get_monitoring_logs(db, limit=1000) - + if not all_logs: text = "πŸ“‹ Π›ΠΎΠ³ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° пусты\n\nБистСма Π΅Ρ‰Π΅ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ." keyboard = get_monitoring_logs_back_keyboard() await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard) return - + per_page = 8 paginated_logs = paginate_list(all_logs, page=page, per_page=per_page) - + text = f"πŸ“‹ Π›ΠΎΠ³ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° (стр. {page}/{paginated_logs.total_pages})\n\n" - + for log in paginated_logs.items: icon = "βœ…" if log['is_success'] else "❌" time_str = log['created_at'].strftime('%m-%d %H:%M') event_type = log['event_type'].replace('_', ' ').title() - + message = log['message'] if len(message) > 45: message = message[:45] + "..." - + text += f"{icon} {time_str} {event_type}\n" text += f" πŸ“„ {message}\n\n" - + total_success = sum(1 for log in all_logs if log['is_success']) total_failed = len(all_logs) - total_success success_rate = round(total_success / len(all_logs) * 100, 1) if all_logs else 0 - + text += f"πŸ“Š ΠžΠ±Ρ‰Π°Ρ статистика:\n" text += f"β€’ ВсСго событий: {len(all_logs)}\n" text += f"β€’ Π£ΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ…: {total_success}\n" text += f"β€’ Ошибок: {total_failed}\n" text += f"β€’ Π£ΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΡŒ: {success_rate}%" - + keyboard = get_monitoring_logs_keyboard(page, paginated_logs.total_pages) await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard) - break - + except Exception as e: logger.error(f"Ошибка получСния Π»ΠΎΠ³ΠΎΠ²: {e}") await callback.answer("❌ Ошибка получСния Π»ΠΎΠ³ΠΎΠ²", show_alert=True) @@ -892,17 +889,17 @@ async def monitoring_logs_callback(callback: CallbackQuery): @admin_required async def clear_logs_callback(callback: CallbackQuery): try: - async for db in get_db(): - deleted_count = await monitoring_service.cleanup_old_logs(db, days=0) - + async with AsyncSessionLocal() as db: + deleted_count = await monitoring_service.cleanup_old_logs(db, days=0) + await db.commit() + if deleted_count > 0: await callback.answer(f"πŸ—‘οΈ Π£Π΄Π°Π»Π΅Π½ΠΎ {deleted_count} записСй Π»ΠΎΠ³ΠΎΠ²") else: await callback.answer("ℹ️ Π›ΠΎΠ³ΠΈ ΡƒΠΆΠ΅ пусты") - + await monitoring_logs_callback(callback) - break - + except Exception as e: logger.error(f"Ошибка очистки Π»ΠΎΠ³ΠΎΠ²: {e}") await callback.answer(f"❌ Ошибка очистки: {str(e)}", show_alert=True) @@ -942,19 +939,19 @@ async def test_notifications_callback(callback: CallbackQuery): @admin_required async def monitoring_statistics_callback(callback: CallbackQuery): try: - async for db in get_db(): + async with AsyncSessionLocal() as db: from app.database.crud.subscription import get_subscriptions_statistics sub_stats = await get_subscriptions_statistics(db) - + mon_status = await monitoring_service.get_monitoring_status(db) - + week_ago = datetime.now() - timedelta(days=7) week_logs = await monitoring_service.get_monitoring_logs(db, limit=1000) week_logs = [log for log in week_logs if log['created_at'] >= week_ago] - + week_success = sum(1 for log in week_logs if log['is_success']) week_errors = len(week_logs) - week_success - + text = f""" πŸ“Š Бтатистика ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° @@ -1028,8 +1025,7 @@ async def monitoring_statistics_callback(callback: CallbackQuery): keyboard = InlineKeyboardMarkup(inline_keyboard=buttons) await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard) - break - + except Exception as e: logger.error(f"Ошибка получСния статистики: {e}") await callback.answer(f"❌ Ошибка получСния статистики: {str(e)}", show_alert=True) @@ -1068,7 +1064,7 @@ async def nalogo_force_process_callback(callback: CallbackQuery): from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton # ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ статистику - async for db in get_db(): + async with AsyncSessionLocal() as db: from app.database.crud.subscription import get_subscriptions_statistics sub_stats = await get_subscriptions_statistics(db) mon_status = await monitoring_service.get_monitoring_status(db) @@ -1139,7 +1135,6 @@ async def nalogo_force_process_callback(callback: CallbackQuery): keyboard = InlineKeyboardMarkup(inline_keyboard=buttons) await callback.message.edit_text(stats_text, parse_mode="HTML", reply_markup=keyboard) - break except Exception as e: logger.error(f"Ошибка ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‡Π΅ΠΊΠΎΠ²: {e}") @@ -1309,7 +1304,7 @@ async def receipts_link_old_callback(callback: CallbackQuery): TRACKING_START_DATE = datetime(2024, 12, 29, 0, 0, 0) - async for db in get_db(): + async with AsyncSessionLocal() as db: # ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ старыС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Ρ‡Π΅ΠΊΠΎΠ² query = select(Transaction).where( and_( @@ -1387,7 +1382,6 @@ async def receipts_link_old_callback(callback: CallbackQuery): ]) await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard) - break except Exception as e: logger.error(f"Ошибка привязки старых Ρ‡Π΅ΠΊΠΎΠ²: {e}", exc_info=True) @@ -1695,11 +1689,11 @@ def get_monitoring_logs_back_keyboard(): @admin_required async def monitoring_command(message: Message): try: - async for db in get_db(): + async with AsyncSessionLocal() as db: status = await monitoring_service.get_monitoring_status(db) - + running_status = "🟒 Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚" if status['is_running'] else "πŸ”΄ ΠžΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½" - + text = f""" πŸ” Быстрый статус ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° @@ -1709,10 +1703,9 @@ async def monitoring_command(message: Message): Для ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ управлСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Π΄ΠΌΠΈΠ½-панСль. """ - + await message.answer(text, parse_mode="HTML") - break - + except Exception as e: logger.error(f"Ошибка ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ /monitoring: {e}") await message.answer(f"❌ Ошибка: {str(e)}")