feat: delete background jobs from form views

This commit is contained in:
Ankush Menat 2022-09-11 14:55:11 +05:30
parent fc0ff7bd2e
commit dca6592b7e
4 changed files with 50 additions and 8 deletions

View file

@ -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",

View file

@ -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)

View file

@ -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");
});
});
},
};

View file

@ -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",