41 lines
2.2 KiB
Python
41 lines
2.2 KiB
Python
"""Постановка задачи `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
|
||
)
|