@@ -1,26 +1,39 @@ | |||||
<div style="padding: 20px;" class="list-jobs"> | |||||
<div class="list-jobs"> | |||||
{% if jobs.length %} | {% if jobs.length %} | ||||
<table class="table table-bordered"> | |||||
<table class="table table-bordered" style="table-layout: fixed;"> | |||||
<thead> | <thead> | ||||
<tr> | <tr> | ||||
<th style="width: 30%">Queue / Worker</th> | |||||
<th style="width: 20%">Queue / Worker</th> | |||||
<th>Job</th> | <th>Job</th> | ||||
<th style="width: 20%">Created</th> | |||||
<th style="width: 15%">Created</th> | |||||
</tr> | </tr> | ||||
</thead> | </thead> | ||||
<tbody> | <tbody> | ||||
{% for j in jobs %} | {% for j in jobs %} | ||||
<tr> | <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> | </tr> | ||||
{% endfor %} | {% endfor %} | ||||
</tbody> | </tbody> | ||||
</table> | </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 %} | {% 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 %} | {% 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> | </div> |
@@ -1,9 +1,14 @@ | |||||
frappe.pages['background_jobs'].on_page_load = function(wrapper) { | 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, | parent: wrapper, | ||||
title: 'Background Jobs', | title: 'Background Jobs', | ||||
single_column: true | 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) { | frappe.pages['background_jobs'].on_page_show = function(wrapper) { | ||||
@@ -18,10 +23,13 @@ frappe.pages.background_jobs.refresh_jobs = function() { | |||||
page.called = true; | page.called = true; | ||||
frappe.call({ | frappe.call({ | ||||
method: 'frappe.core.page.background_jobs.background_jobs.get_info', | 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) { | callback: function(r) { | ||||
page.called = false; | page.called = false; | ||||
page.body.find('.list-jobs').remove(); | 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') { | if(frappe.get_route()[0]==='background_jobs') { | ||||
frappe.background_jobs_timeout = setTimeout(frappe.pages.background_jobs.refresh_jobs, 2000); | frappe.background_jobs_timeout = setTimeout(frappe.pages.background_jobs.refresh_jobs, 2000); | ||||
@@ -6,7 +6,7 @@ import frappe | |||||
from rq import Queue, Worker | from rq import Queue, Worker | ||||
from frappe.utils.background_jobs import get_redis_conn | from frappe.utils.background_jobs import get_redis_conn | ||||
from frappe.utils import format_datetime | |||||
from frappe.utils import format_datetime, cint | |||||
colors = { | colors = { | ||||
'queued': 'orange', | 'queued': 'orange', | ||||
@@ -15,14 +15,14 @@ colors = { | |||||
} | } | ||||
@frappe.whitelist() | @frappe.whitelist() | ||||
def get_info(): | |||||
def get_info(show_failed=False): | |||||
conn = get_redis_conn() | conn = get_redis_conn() | ||||
queues = Queue.all(conn) | queues = Queue.all(conn) | ||||
workers = Worker.all(conn) | workers = Worker.all(conn) | ||||
jobs = [] | jobs = [] | ||||
def add_job(j, name): | 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({ | jobs.append({ | ||||
'job_name': j.kwargs.get('kwargs', {}).get('playbook_method') \ | 'job_name': j.kwargs.get('kwargs', {}).get('playbook_method') \ | ||||
or str(j.kwargs.get('job_name')), | or str(j.kwargs.get('job_name')), | ||||
@@ -30,6 +30,8 @@ def get_info(): | |||||
'creation': format_datetime(j.created_at), | 'creation': format_datetime(j.created_at), | ||||
'color': colors[j.status] | 'color': colors[j.status] | ||||
}) | }) | ||||
if j.exc_info: | |||||
jobs[-1]['exc_info'] = j.exc_info | |||||
for w in workers: | for w in workers: | ||||
j = w.get_current_job() | j = w.get_current_job() | ||||
@@ -38,7 +40,12 @@ def get_info(): | |||||
for q in queues: | for q in queues: | ||||
if q.name != 'failed': | 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 | 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> |