From 7b54fcf3adc5e4b513dd7530249c14f7bea85cfb Mon Sep 17 00:00:00 2001 From: Capybara-z Date: Wed, 3 Sep 2025 00:36:11 +0300 Subject: [PATCH] auto-initialize tariff weights on bot startup --- database/init_db.py | 3 +++ database/tariffs.py | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/database/init_db.py b/database/init_db.py index c278d755..6a71654c 100644 --- a/database/init_db.py +++ b/database/init_db.py @@ -5,6 +5,7 @@ from sqlalchemy import select from config import ADMIN_ID from database.db import async_session_maker, engine from database.models import Admin, Base, User +from database.tariffs import initialize_all_tariff_weights async def init_db(): @@ -34,3 +35,5 @@ async def init_db(): ) ) await session.commit() + + await initialize_all_tariff_weights(session) diff --git a/database/tariffs.py b/database/tariffs.py index bfe9ea8f..9ccdfc1e 100644 --- a/database/tariffs.py +++ b/database/tariffs.py @@ -53,11 +53,10 @@ async def get_tariffs(session: AsyncSession, tariff_id: int = None, group_code: if with_subgroup_weights and group_code: tariffs_without_order = [t for t in tariffs if t.get("sort_order") is None] if tariffs_without_order: - max_order = max((t.get("sort_order") or 0 for t in tariffs), default=0) - for i, tariff in enumerate(tariffs_without_order, start=max_order + 1): - tariff["sort_order"] = i + for tariff in tariffs_without_order: + tariff["sort_order"] = 1 await session.execute( - update(Tariff).where(Tariff.id == tariff["id"]).values(sort_order=i) + update(Tariff).where(Tariff.id == tariff["id"]).values(sort_order=1) ) await session.commit() @@ -130,11 +129,14 @@ async def create_tariff(session: AsyncSession, data: dict): if group_code: result = await session.execute( select(func.max(Tariff.sort_order)) - .where(Tariff.group_code == group_code) + .where(Tariff.group_code == group_code, Tariff.sort_order.isnot(None)) ) max_order = result.scalar() or 0 else: - result = await session.execute(select(func.max(Tariff.sort_order))) + result = await session.execute( + select(func.max(Tariff.sort_order)) + .where(Tariff.sort_order.isnot(None)) + ) max_order = result.scalar() or 0 data["sort_order"] = max_order + 1 @@ -261,3 +263,27 @@ async def initialize_tariff_sort_orders(session: AsyncSession, group_code: str) logger.error(f"[TARIFF] Ошибка при инициализации sort_order для группы {group_code}: {e}") await session.rollback() return False + + +async def initialize_all_tariff_weights(session: AsyncSession) -> bool: + try: + result = await session.execute( + select(Tariff).where(Tariff.sort_order.is_(None)) + ) + tariffs_without_weight = result.scalars().all() + + if not tariffs_without_weight: + return True + + for tariff in tariffs_without_weight: + await session.execute( + update(Tariff).where(Tariff.id == tariff.id).values(sort_order=1) + ) + + await session.commit() + return True + + except SQLAlchemyError as e: + logger.error(f"[TARIFF] Ошибка при инициализации весов тарифов: {e}") + await session.rollback() + return False \ No newline at end of file