Initial commit: InviteMe production redesign
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
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
|
||||
Reference in New Issue
Block a user