From 5074afaafaf514baa49862cc11c970d45baa36dc Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 13 Sep 2022 19:11:35 +0530 Subject: [PATCH] fix: RQ job name when func object is passed (#18112) (#18113) [skip ci] (cherry picked from commit 4120d5a8e3eca43b2e69e04ac4dbea60505a1982) Co-authored-by: Ankush Menat --- frappe/core/doctype/rq_job/rq_job.py | 9 ++++++++- frappe/core/doctype/rq_job/test_rq_job.py | 7 +++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/rq_job/rq_job.py b/frappe/core/doctype/rq_job/rq_job.py index bceb93c0a4..7e1c35a0e6 100644 --- a/frappe/core/doctype/rq_job/rq_job.py +++ b/frappe/core/doctype/rq_job/rq_job.py @@ -2,6 +2,7 @@ # For license information, please see license.txt import functools +import re from rq.command import send_stop_job_command from rq.job import Job @@ -113,12 +114,18 @@ class RQJob(Document): def serialize_job(job: Job) -> frappe._dict: modified = job.last_heartbeat or job.ended_at or job.started_at or job.created_at + job_name = job.kwargs.get("kwargs", {}).get("job_type") or str(job.kwargs.get("job_name")) + + # function objects have this repr: '' + # This regex just removes unnecessary things around it. + if matches := re.match(r".*) at 0x.*>", job_name): + job_name = matches.group("func_name") return frappe._dict( name=job.id, job_id=job.id, queue=job.origin.rsplit(":", 1)[1], - job_name=job.kwargs.get("kwargs", {}).get("job_type") or str(job.kwargs.get("job_name")), + job_name=job_name, status=job.get_status(), started_at=convert_utc_to_user_timezone(job.started_at) if job.started_at else "", ended_at=convert_utc_to_user_timezone(job.ended_at) if job.ended_at else "", diff --git a/frappe/core/doctype/rq_job/test_rq_job.py b/frappe/core/doctype/rq_job/test_rq_job.py index 4a51f54c0d..42d1e2bf82 100644 --- a/frappe/core/doctype/rq_job/test_rq_job.py +++ b/frappe/core/doctype/rq_job/test_rq_job.py @@ -29,11 +29,9 @@ class TestRQJob(FrappeTestCase): def test_serialization(self): job = frappe.enqueue(method=self.BG_JOB, queue="short") - rq_job = frappe.get_doc("RQ Job", job.id) self.assertEqual(job, rq_job.job) - self.assertDocumentEqual( { "name": job.id, @@ -46,6 +44,11 @@ class TestRQJob(FrappeTestCase): ) self.check_status(job, "finished") + def test_func_obj_serialization(self): + job = frappe.enqueue(method=test_func, queue="short") + rq_job = frappe.get_doc("RQ Job", job.id) + self.assertEqual(rq_job.job_name, "test_func") + def test_get_list_filtering(self): # Check failed job clearning and filtering