Первоначальная версия VidConf

This commit is contained in:
2026-07-23 01:04:01 +03:00
commit 896455381a
335 changed files with 61527 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
"""Постановка задачи `send_invitations` в очередь Celery.
Отправляет задачу по имени через голый Celery-клиент (`broker_url` без
`backend`) — тот же приём, что `services/pipeline_producer.py`: backend не
импортирует пакет `workers` (инвариант разделения слоёв, см. докстринг
`pipeline_producer.py`). Задача регистрируется и обрабатывается в
`workers/tasks/invitations.py` (блок C).
"""
import uuid
from celery import Celery
from core.config import get_settings
SEND_INVITATIONS_TASK_NAME = "workers.tasks.invitations.send_invitations"
NOTIFY_QUEUE = "notify"
def enqueue_invitations(conference_id: uuid.UUID, *, emails: list[str] | None = None) -> None:
"""Поставить в очередь `notify` рассылку .ics-приглашений на конференцию `conference_id`.
`emails=None` — получатели по умолчанию (владелец + для закреплённых
участники прошлых сеансов, см. `workers/tasks/invitations.py`); явный
список — ручная рассылка администратором. Задача сама идемпотентна
(журнал `email_deliveries(kind='invitation')` без unique, повтор
постановки максимум продублирует письмо).
Очередь передаётся явно (`queue=NOTIFY_QUEUE`): этот клиент — отдельный
экземпляр `Celery` без `task_routes` из `workers/celery_app.py` (тот
маршрут действует только внутри процесса воркера, который его
импортирует), поэтому без явного параметра задача ушла бы в дефолтную
очередь `celery` — тот же приём, что `TRANSCRIPTION_QUEUE` в
`pipeline_producer.py`.
"""
settings = get_settings()
client = Celery("vidconf-producer", broker=settings.redis_url)
client.send_task(
SEND_INVITATIONS_TASK_NAME, args=[str(conference_id), emails], queue=NOTIFY_QUEUE
)