diff --git a/ippisite/ippidb/admin.py b/ippisite/ippidb/admin.py index 10ced876180be13ee0d6aabc6dda5946331ea94d..6d74615ad32d3e85b1635b09a93a7cfead810fd6 100644 --- a/ippisite/ippidb/admin.py +++ b/ippisite/ippidb/admin.py @@ -12,6 +12,7 @@ from django.contrib.contenttypes.models import ContentType from django.db.models import Q from django.utils.html import format_html from django.utils.translation import ugettext, ugettext_lazy +from django.utils.safestring import mark_safe from .models import ( Bibliography, @@ -70,6 +71,7 @@ class JobModelAdmin(admin.ModelAdmin): "task_result_status", "task_result_date_created", "task_result_date_done", + "logs", ) list_filter = ( "task_result__status", @@ -82,6 +84,7 @@ class JobModelAdmin(admin.ModelAdmin): "task_result_status", "task_result_date_created", "task_result_date_done", + "logs", ) search_fields = ( "task_result__task_name", @@ -95,6 +98,12 @@ class JobModelAdmin(admin.ModelAdmin): ("std_out", "std_err"), ) + def logs(self, obj): + url = reverse("admin:tasklog") + return mark_safe( + "<a target='_blank' href='{}?jobid={}'>see log</a>".format(url, obj.id) + ) + def task_result_task_id(self, x): return x.task_result.task_id diff --git a/ippisite/ippidb/static/css/ippidb-admin.css b/ippisite/ippidb/static/css/ippidb-admin.css new file mode 100644 index 0000000000000000000000000000000000000000..bdf98c6a71fd33243c212b9a60664920127c6302 --- /dev/null +++ b/ippisite/ippidb/static/css/ippidb-admin.css @@ -0,0 +1,7 @@ +.colMS { + width: 100% !important; +} + +.card { + width: 100% !important; +} \ No newline at end of file diff --git a/ippisite/ippidb/static/js/ippidb-admin.js b/ippisite/ippidb/static/js/ippidb-admin.js new file mode 100644 index 0000000000000000000000000000000000000000..2834ea0b3f235744ee88c6279c88af29d4ab7442 --- /dev/null +++ b/ippisite/ippidb/static/js/ippidb-admin.js @@ -0,0 +1,44 @@ +function get_logs(taskid) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', '/utils/getoutputjob?task_id=' + taskid, true); + xhr.onload = function() { + const cls = ["border-info", "border-warning", "border-danger"] + var outputs = JSON.parse(xhr.response); + var auth = document.getElementById('auth'); + var createtime = document.getElementById('createtime'); + var updatetime = document.getElementById('updatetime'); + var traceback = document.getElementById('traceback'); + var stderr = document.getElementById('stderr'); + var stdout = document.getElementById('stdout'); + var status = document.getElementById('status'); + auth.innerHTML = outputs.task_name + " || " + outputs.task_id; + datecreate = new Date(outputs.create_time); + createtime.innerHTML = datecreate; + status.innerHTML = outputs.status; + if (outputs.status == "SUCCESS") { + status.closest('div').classList.remove(...cls); + status.closest('div').classList.add("border-success"); + } else if (outputs.status == "FAILURE") { + status.closest('div').classList.remove(...cls); + status.closest('div').classList.add("border-danger"); + } else if (outputs.status == "REVOKED") { + status.closest('div').classList.remove(...cls); + status.closest('div').classList.add("border-warning"); + } else { + status.closest('div').classList.remove(...cls); + status.closest('div').classList.add("border-info"); + }; + dateupdate = new Date(outputs.complete_time); + updatetime.innerHTML = dateupdate; + traceback.innerHTML = outputs.traceback; + stderr.innerHTML = outputs.std_err; + stdout.innerHTML = outputs.std_out; + }; + xhr.send(); +} + +(function() { + let taskid = String(document.getElementById("loginfo").getAttribute("taskid")); + get_logs(taskid); + setInterval(get_logs, 2000, taskid); +})(); \ No newline at end of file diff --git a/ippisite/ippisite/admin.py b/ippisite/ippisite/admin.py index fa80270cc631d16abcdc646e8d53df7efa45bc29..dd1a9292a8e817bcec381181cb8a0af904697662 100644 --- a/ippisite/ippisite/admin.py +++ b/ippisite/ippisite/admin.py @@ -8,6 +8,8 @@ from ippidb.tasks import ( launch_plots_computing, launch_test_command_caching, ) +from django.shortcuts import render +from ippidb.models import Job class IppidbAdmin(admin.AdminSite): @@ -36,9 +38,31 @@ class IppidbAdmin(admin.AdminSite): self.admin_view(self.launch_plots_computing_view), ), path("launch_test_command/", self.admin_view(self.launch_test_command),), + path("tasklog/", self.admin_view(self.tasklog), name="tasklog"), ] return my_urls + urls + def tasklog(self, request): + jobid = request.GET.get("jobid", None) + if jobid: + try: + job = Job.objects.get(id=jobid) + except Job.DoesNotExist: + messages.add_message( + request, + messages.INFO, + "job with id: {} doesn't exist".format(jobid), + ) + return redirect("/admin/ippidb/job") + return render( + request, + "admin/ippidb/loginfo.html", + context={"taskid": job.task_result.task_id}, + ) + else: + messages.add_message(request, messages.INFO, "Please specify a jobid") + return redirect("/admin/ippidb/job") + def launch_test_command(self, request): """ This view launches the task to test jobs diff --git a/ippisite/templates/admin/ippidb/loginfo.html b/ippisite/templates/admin/ippidb/loginfo.html new file mode 100644 index 0000000000000000000000000000000000000000..df35c6140ef981b84daef4ec9125c3ee88e27d7b --- /dev/null +++ b/ippisite/templates/admin/ippidb/loginfo.html @@ -0,0 +1,87 @@ +{% extends "admin/index.html" %} +{% load i18n static %} +{% block extrahead %} +{% endblock %} + +{% block branding %} +{{ block.super }} +{% endblock %} + +{% block extrastyle %} +{{ block.super }} +<style> +#content-related{ + background: none; +} +#content-related .module{ + background: #f8f8f8; +} +#site-wide-commands form{ + margin:15px 7px; +} +#site-wide-commands form input { + width:100%; +} +</style> +<link rel="stylesheet" href="/static/css/ippidb-admin.css"> +<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"> +{% endblock %} +{% block sidebar %} +{% endblock %} +{% block content %} +<div class="container"> +<div class="row"> + <div class="card"> + <div id="name" class="card-header text-center"> + <h5 class="card-title">Task name and id</h5> + <p id="auth" class="card-text">no name no id</p> + </div> + <div class="card-body"> + <div class="row"> + <div class="col border rounded border-info m-1"> + <h6 class="card-title">Status</h6> + <pre> + <p id="status" class="card-text">no status</p> + </pre> + </div> + <div class="col border rounded border-danger m-1"> + <h6 class="card-title">traceback</h6> + <pre> + <p id="traceback" class="card-text">No traceback</p> + </pre> + </div> + </div> + <div class="row"> + <div class="col border rounded border-info m-1"> + <h6 class="card-title">Standard output</h6> + <pre> + <p id="stdout" class="card-text">No standard output</p> + </pre> + </div> + <div class="col border rounded border-warning m-1"> + <h6 class="card-title">Error output</h6> + <pre> + <p id="stderr" class="card-text">No error output</p> + </pre> + </div> + </div> + </div> + <div class="card-footer text-muted"> + <div class="row"> + <div class="col border rounded border-info m-1"> + <h6 class="card-title">Create Time</h6> + <p id="createtime" class="card-text">no create time</p> + </div> + <div class="col border rounded border-info m-1"> + <h6 class="card-title">Update Time</h6> + <p id="updatetime" class="card-text">no update time</p> + </div> + </div> + </div> + </div> +</div> +</div> +<script id="loginfo" src="/static/js/ippidb-admin.js" taskid="{{taskid}}"> +</script> +{% endblock %} +