lib.itmens/common/management/commands/jobs.py

79 lines
3.4 KiB
Python
Raw Normal View History

2023-10-21 05:41:38 +00:00
import django_rq
from django.conf import settings
from django.core.management.base import BaseCommand
from rq import Queue
from rq.job import Job
class Command(BaseCommand):
2024-12-26 01:51:24 -05:00
help = "Manage jobs in RQ"
2023-10-21 05:41:38 +00:00
def add_arguments(self, parser):
2023-12-27 16:22:46 -05:00
parser.add_argument("--retry", action="append")
2023-10-21 05:41:38 +00:00
parser.add_argument("--delete", action="append")
parser.add_argument("--list", action="store_true")
2024-12-26 01:51:24 -05:00
parser.add_argument("--prune", action="store_true")
2023-10-21 05:41:38 +00:00
def handle(self, *args, **options):
2023-12-27 16:22:46 -05:00
if options["retry"]:
queue = Queue(connection=django_rq.get_connection("fetch"))
registry = queue.failed_job_registry
for job_id in options["retry"]:
# registry.requeue(job_id)
job = Job.fetch(job_id, connection=django_rq.get_connection("fetch"))
job.requeue()
self.stdout.write(self.style.SUCCESS(f"Retrying {job_id}"))
2023-10-21 05:41:38 +00:00
if options["delete"]:
for job_id in options["delete"]:
job = Job.fetch(job_id, connection=django_rq.get_connection("fetch"))
job.delete()
self.stdout.write(self.style.SUCCESS(f"Deleted {job}"))
2024-12-26 01:51:24 -05:00
if options["list"] or options["prune"]:
2023-10-21 05:41:38 +00:00
queues = settings.RQ_QUEUES.keys()
for q in queues:
queue = django_rq.get_queue(q)
for registry in [
queue.scheduled_job_registry,
queue.started_job_registry,
queue.deferred_job_registry,
queue.finished_job_registry,
queue.failed_job_registry,
queue.canceled_job_registry,
]:
2024-12-26 01:51:24 -05:00
if options["prune"]:
registry.cleanup()
2023-10-21 05:41:38 +00:00
for job_id in registry.get_job_ids():
try:
job = Job.fetch(
job_id, connection=django_rq.get_connection(q)
)
2024-12-26 01:51:24 -05:00
if (
options["prune"]
and q != "cron"
and job.get_status()
in [
"finished",
"failed",
"canceled",
]
):
job.delete()
if options["list"]:
self.stdout.write(
registry.key.ljust(20)
+ str(job.get_status()).ljust(10)
+ job_id.ljust(40)
+ (
job.enqueued_at.strftime("%Y-%m-%d %H:%M:%S")
if job.enqueued_at
else ""
)
)
except Exception as e:
2023-10-21 05:41:38 +00:00
self.stdout.write(
2024-12-26 01:51:24 -05:00
registry.key.ljust(20)
+ "error".ljust(10)
+ job_id.ljust(40)
+ str(e)
2023-10-21 05:41:38 +00:00
)