36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
from types import SimpleNamespace
|
|
|
|
from flask import current_app
|
|
from redis import Redis
|
|
from rq import Queue
|
|
from rq.job import JobStatus
|
|
|
|
|
|
ACTIVE_JOB_STATUSES = {JobStatus.QUEUED, JobStatus.STARTED, JobStatus.DEFERRED, JobStatus.SCHEDULED}
|
|
|
|
|
|
def get_task_queue():
|
|
redis_url = current_app.config.get("TASK_QUEUE_REDIS_URL", "")
|
|
if not redis_url:
|
|
raise RuntimeError("Очередь фоновых задач не настроена")
|
|
connection = Redis.from_url(redis_url, socket_connect_timeout=3, socket_timeout=3)
|
|
return Queue("inviteme", connection=connection, default_timeout=3600)
|
|
|
|
|
|
def enqueue_event_invitations(event_id, initiated_by_id):
|
|
if current_app.config.get("TASK_QUEUE_EAGER"):
|
|
from app.tasks import send_event_invitations_in_context
|
|
result = send_event_invitations_in_context(event_id, initiated_by_id)
|
|
return SimpleNamespace(id="eager", result=result), True
|
|
queue = get_task_queue()
|
|
job_id = f"event-invitations-{event_id}"
|
|
existing = queue.fetch_job(job_id)
|
|
if existing and existing.get_status(refresh=True) in ACTIVE_JOB_STATUSES:
|
|
return existing, False
|
|
if existing:
|
|
existing.delete()
|
|
return queue.enqueue(
|
|
"app.tasks.send_event_invitations", event_id, initiated_by_id,
|
|
job_id=job_id, job_timeout=3600, result_ttl=3600, failure_ttl=86400,
|
|
), True
|