All checks were successful
Build and Push Docker Images / build (push) Successful in 1m28s
- Рефакторинг Telegram бота на модульную структуру для удобства поддержки и расширения - Создан общий RabbitMQ клиент для Flask и Telegram компонентов - Подготовлена базовая архитектура для будущего масштабирования и новых функций Signed-off-by: UdoChudo <stream@udochudo.ru>
39 lines
1.6 KiB
Python
39 lines
1.6 KiB
Python
# 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]
|