From dca6592b7e584b5fce99d6d3be9f82c50d25e35f Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 11 Sep 2022 14:55:11 +0530 Subject: [PATCH] feat: delete background jobs from form views --- frappe/core/doctype/rq_job/rq_job.json | 12 ++++++++- frappe/core/doctype/rq_job/rq_job.py | 26 +++++++++++++++++--- frappe/core/doctype/rq_job/rq_job_list.js | 13 ++++++++++ frappe/core/doctype/rq_worker/rq_worker.json | 7 +++--- 4 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 frappe/core/doctype/rq_job/rq_job_list.js diff --git a/frappe/core/doctype/rq_job/rq_job.json b/frappe/core/doctype/rq_job/rq_job.json index 00ad6aa58e..7cae15cf59 100644 --- a/frappe/core/doctype/rq_job/rq_job.json +++ b/frappe/core/doctype/rq_job/rq_job.json @@ -107,7 +107,7 @@ "in_create": 1, "is_virtual": 1, "links": [], - "modified": "2022-09-11 04:39:35.771198", + "modified": "2022-09-11 05:27:50.878534", "modified_by": "Administrator", "module": "Core", "name": "RQ Job", @@ -122,6 +122,16 @@ "report": 1, "role": "System Manager", "share": 1 + }, + { + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Administrator", + "share": 1 } ], "sort_field": "modified", diff --git a/frappe/core/doctype/rq_job/rq_job.py b/frappe/core/doctype/rq_job/rq_job.py index 8623824b82..22de02dd58 100644 --- a/frappe/core/doctype/rq_job/rq_job.py +++ b/frappe/core/doctype/rq_job/rq_job.py @@ -22,7 +22,10 @@ JOB_STATUSES = ["queued", "started", "failed", "finished", "deferred", "schedule class RQJob(Document): def load_from_db(self): job = Job.fetch(self.name, connection=get_redis_conn()) + if not for_current_site(job): + raise frappe.PermissionError super(Document, self).__init__(serialize_job(job)) + self._job_obj = job @staticmethod def get_list(args): @@ -63,6 +66,11 @@ class RQJob(Document): return matched_job_ids + def delete(self): + frappe.only_for("System Manager") + if self._job_obj and for_current_site(self._job_obj): + self._job_obj.delete() + @staticmethod def get_count(args) -> int: # Can not be implemented efficiently due to site filtering hence ignored. @@ -79,9 +87,6 @@ class RQJob(Document): def db_update(self, *args, **kwargs): pass - def delete(self): - pass - def serialize_job(job: Job) -> frappe._dict: if not for_current_site(job): @@ -126,10 +131,23 @@ def fetch_job_ids(queue: Queue, status: str) -> list[str | None]: "failed": queue.failed_job_registry, "deferred": queue.deferred_job_registry, "scheduled": queue.scheduled_job_registry, + "canceled": queue.canceled_job_registry, } registry = registry_map.get(status) - if registry: + if registry is not None: job_ids = registry.get_job_ids() return [j for j in job_ids if j] + return [] + + +@frappe.whitelist() +def remove_failed_jobs(): + frappe.only_for("System Manager") + for queue in get_queues(): + fail_registry = queue.failed_job_registry + for job_ids in create_batch(fail_registry.get_job_ids(), 100): + for job in Job.fetch_many(job_ids=job_ids, connection=get_redis_conn()): + if job and for_current_site(job): + fail_registry.remove(job, delete_job=True) diff --git a/frappe/core/doctype/rq_job/rq_job_list.js b/frappe/core/doctype/rq_job/rq_job_list.js new file mode 100644 index 0000000000..cf7ac81c18 --- /dev/null +++ b/frappe/core/doctype/rq_job/rq_job_list.js @@ -0,0 +1,13 @@ +frappe.listview_settings["RQ Job"] = { + hide_name_column: true, + + refresh(listview) { + if (!has_common(frappe.user_roles, ["Administrator", "System Manager"])) return; + + listview.page.add_inner_button(__("Remove Failed Jobs"), () => { + frappe.confirm(__("Are you sure you want to remove all failed jobs?"), () => { + frappe.xcall("frappe.core.doctype.rq_job.rq_job.remove_failed_jobs"); + }); + }); + }, +}; diff --git a/frappe/core/doctype/rq_worker/rq_worker.json b/frappe/core/doctype/rq_worker/rq_worker.json index d2e0a34bb6..ea65abd482 100644 --- a/frappe/core/doctype/rq_worker/rq_worker.json +++ b/frappe/core/doctype/rq_worker/rq_worker.json @@ -37,8 +37,9 @@ }, { "fieldname": "current_job_id", - "fieldtype": "Data", - "label": "Current Job ID" + "fieldtype": "Link", + "label": "Current Job ID", + "options": "RQ Job" }, { "fieldname": "pid", @@ -106,7 +107,7 @@ "in_create": 1, "is_virtual": 1, "links": [], - "modified": "2022-09-11 04:38:30.606019", + "modified": "2022-09-11 05:02:53.981705", "modified_by": "Administrator", "module": "Core", "name": "RQ Worker",