@@ -1,26 +1,39 @@ | |||
<div style="padding: 20px;" class="list-jobs"> | |||
<div class="list-jobs"> | |||
{% if jobs.length %} | |||
<table class="table table-bordered"> | |||
<table class="table table-bordered" style="table-layout: fixed;"> | |||
<thead> | |||
<tr> | |||
<th style="width: 30%">Queue / Worker</th> | |||
<th style="width: 20%">Queue / Worker</th> | |||
<th>Job</th> | |||
<th style="width: 20%">Created</th> | |||
<th style="width: 15%">Created</th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
{% for j in jobs %} | |||
<tr> | |||
<td>{{ j.queue }}</td> | |||
<td><span class="indicator {{ j.color }}" title="{{ j.status }}"> | |||
{{ frappe.utils.encode_tags(j.job_name) }}</span></td> | |||
<td>{{ j.creation }}</td> | |||
<td><span class="indicator {{ j.color }}" title="{{ j.status }}">{{ j.queue }}</span></td> | |||
<td style="overflow: auto;"> | |||
<div> | |||
{{ frappe.utils.encode_tags(j.job_name) }} | |||
</div> | |||
{% if j.exc_info %} | |||
<div> | |||
<pre>{{ frappe.utils.encode_tags(j.exc_info) }}</pre> | |||
</div> | |||
{% endif %} | |||
</td> | |||
<td class="small">{{ j.creation }}</td> | |||
</tr> | |||
{% endfor %} | |||
</tbody> | |||
</table> | |||
<p> | |||
<span class="indicator green" style="margin-right: 20px;">Started</span> | |||
<span class="indicator orange" style="margin-right: 20px;">Queued</span> | |||
<span class="indicator red">Failed</span> | |||
</p> | |||
{% else %} | |||
<p class="text-muted">No pending or failed jobs for this site</p> | |||
<p class="text-muted">No pending or current jobs for this site</p> | |||
{% endif %} | |||
<p class="text-muted">Last refreshed {{ frappe.datetime.now_datetime() }}</p> | |||
<p class="text-muted" style="margin-top: 30px;">Last refreshed {{ frappe.datetime.now_datetime() }}</p> | |||
</div> |
@@ -1,9 +1,14 @@ | |||
frappe.pages['background_jobs'].on_page_load = function(wrapper) { | |||
frappe.pages.background_jobs.page = frappe.ui.make_app_page({ | |||
var page = frappe.ui.make_app_page({ | |||
parent: wrapper, | |||
title: 'Background Jobs', | |||
single_column: true | |||
}); | |||
$(frappe.render_template('background_jobs_outer')).appendTo(page.body); | |||
page.content = $(page.body).find('.table-area'); | |||
frappe.pages.background_jobs.page = page; | |||
} | |||
frappe.pages['background_jobs'].on_page_show = function(wrapper) { | |||
@@ -18,10 +23,13 @@ frappe.pages.background_jobs.refresh_jobs = function() { | |||
page.called = true; | |||
frappe.call({ | |||
method: 'frappe.core.page.background_jobs.background_jobs.get_info', | |||
args: { | |||
show_failed: page.body.find('.show-failed').prop('checked') ? 1 : 0 | |||
}, | |||
callback: function(r) { | |||
page.called = false; | |||
page.body.find('.list-jobs').remove(); | |||
$(frappe.render_template('background_jobs', {jobs:r.message || []})).appendTo(page.body); | |||
$(frappe.render_template('background_jobs', {jobs:r.message || []})).appendTo(page.content); | |||
if(frappe.get_route()[0]==='background_jobs') { | |||
frappe.background_jobs_timeout = setTimeout(frappe.pages.background_jobs.refresh_jobs, 2000); | |||
@@ -6,7 +6,7 @@ import frappe | |||
from rq import Queue, Worker | |||
from frappe.utils.background_jobs import get_redis_conn | |||
from frappe.utils import format_datetime | |||
from frappe.utils import format_datetime, cint | |||
colors = { | |||
'queued': 'orange', | |||
@@ -15,14 +15,14 @@ colors = { | |||
} | |||
@frappe.whitelist() | |||
def get_info(): | |||
def get_info(show_failed=False): | |||
conn = get_redis_conn() | |||
queues = Queue.all(conn) | |||
workers = Worker.all(conn) | |||
jobs = [] | |||
def add_job(j, name): | |||
if j.kwargs.get('site')==frappe.local.site: | |||
if j.kwargs.get('site')==frappe.local.site or True: | |||
jobs.append({ | |||
'job_name': j.kwargs.get('kwargs', {}).get('playbook_method') \ | |||
or str(j.kwargs.get('job_name')), | |||
@@ -30,6 +30,8 @@ def get_info(): | |||
'creation': format_datetime(j.created_at), | |||
'color': colors[j.status] | |||
}) | |||
if j.exc_info: | |||
jobs[-1]['exc_info'] = j.exc_info | |||
for w in workers: | |||
j = w.get_current_job() | |||
@@ -38,7 +40,12 @@ def get_info(): | |||
for q in queues: | |||
if q.name != 'failed': | |||
for j in q.get_jobs(): | |||
add_job(j, q.name) | |||
for j in q.get_jobs(): add_job(j, q.name) | |||
if cint(show_failed): | |||
for q in queues: | |||
if q.name == 'failed': | |||
for j in q.get_jobs()[:10]: add_job(j, q.name) | |||
return jobs |
@@ -0,0 +1,12 @@ | |||
<div style="padding: 20px;"> | |||
<p> | |||
<div class="checkbox"> | |||
<label> | |||
<input type="checkbox" class="show-failed"> {{ __("Show failed jobs") }} | |||
</label> | |||
</div> | |||
</p> | |||
<div class="table-area"> | |||
</div> | |||
</div> |