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