# db_utils.py from app.models import Subscriptions, Users from sqlalchemy.orm import joinedload def get_recipients_by_region(app, region_id: int, severity: str = "") -> list[int]: """ Возвращает список chat_id, подписанных на указанный регион с учётом критичности и фильтром по is_blocked. Args: app: экземпляр Flask-приложения region_id (int): номер региона severity (str): уровень критичности события ("Disaster", "High", и т.п.) Returns: list[int]: список chat_id """ if region_id is None: return [] with app.app_context(): # Предположим, что поле is_blocked у пользователя, а не у подписки, # тогда нужно сделать join по пользователям: query = ( Subscriptions.query .join(Users, Users.chat_id == Subscriptions.chat_id) .filter( Subscriptions.region_id == region_id, Subscriptions.active == True, Subscriptions.skip == False, Users.is_blocked == False # исключаем заблокированных пользователей ) ) if severity != "Disaster": query = query.filter(Subscriptions.disaster_only == False) subs = query.options(joinedload(Subscriptions.user)).all() return [sub.chat_id for sub in subs]