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)}")