Skip to content
Snippets Groups Projects
Commit 9eccdf5f authored by Hervé  MENAGER's avatar Hervé MENAGER
Browse files

Merge branch 'loginfo' into 'master'

Loginfo

See merge request !12
parents 3fd5ed53 08ceaad1
No related branches found
No related tags found
2 merge requests!13Master,!12Loginfo
Pipeline #29241 passed
...@@ -12,6 +12,7 @@ from django.contrib.contenttypes.models import ContentType ...@@ -12,6 +12,7 @@ from django.contrib.contenttypes.models import ContentType
from django.db.models import Q from django.db.models import Q
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.translation import ugettext, ugettext_lazy from django.utils.translation import ugettext, ugettext_lazy
from django.utils.safestring import mark_safe
from .models import ( from .models import (
Bibliography, Bibliography,
...@@ -70,6 +71,7 @@ class JobModelAdmin(admin.ModelAdmin): ...@@ -70,6 +71,7 @@ class JobModelAdmin(admin.ModelAdmin):
"task_result_status", "task_result_status",
"task_result_date_created", "task_result_date_created",
"task_result_date_done", "task_result_date_done",
"logs",
) )
list_filter = ( list_filter = (
"task_result__status", "task_result__status",
...@@ -82,6 +84,7 @@ class JobModelAdmin(admin.ModelAdmin): ...@@ -82,6 +84,7 @@ class JobModelAdmin(admin.ModelAdmin):
"task_result_status", "task_result_status",
"task_result_date_created", "task_result_date_created",
"task_result_date_done", "task_result_date_done",
"logs",
) )
search_fields = ( search_fields = (
"task_result__task_name", "task_result__task_name",
...@@ -95,6 +98,12 @@ class JobModelAdmin(admin.ModelAdmin): ...@@ -95,6 +98,12 @@ class JobModelAdmin(admin.ModelAdmin):
("std_out", "std_err"), ("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): def task_result_task_id(self, x):
return x.task_result.task_id return x.task_result.task_id
......
.colMS {
width: 100% !important;
}
.card {
width: 100% !important;
}
\ No newline at end of file
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
...@@ -8,6 +8,8 @@ from ippidb.tasks import ( ...@@ -8,6 +8,8 @@ from ippidb.tasks import (
launch_plots_computing, launch_plots_computing,
launch_test_command_caching, launch_test_command_caching,
) )
from django.shortcuts import render
from ippidb.models import Job
class IppidbAdmin(admin.AdminSite): class IppidbAdmin(admin.AdminSite):
...@@ -36,9 +38,31 @@ class IppidbAdmin(admin.AdminSite): ...@@ -36,9 +38,31 @@ class IppidbAdmin(admin.AdminSite):
self.admin_view(self.launch_plots_computing_view), self.admin_view(self.launch_plots_computing_view),
), ),
path("launch_test_command/", self.admin_view(self.launch_test_command),), path("launch_test_command/", self.admin_view(self.launch_test_command),),
path("tasklog/", self.admin_view(self.tasklog), name="tasklog"),
] ]
return my_urls + urls 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): def launch_test_command(self, request):
""" """
This view launches the task to test jobs This view launches the task to test jobs
......
{% 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 %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment