From a302d08405c0584d0a948cff0e2e806328ba05c0 Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Fri, 9 Aug 2019 15:59:53 +0200
Subject: [PATCH] Add infos to job model and show them on the job info pages.

---
 app/main/views.py                   | 28 ++++++++-
 app/models.py                       |  1 +
 app/services/views.py               |  1 -
 app/swarm.py                        |  2 +
 app/templates/main/jobs/job.html.j2 | 89 +++++++++++++++++++++++++----
 5 files changed, 109 insertions(+), 12 deletions(-)

diff --git a/app/main/views.py b/app/main/views.py
index 261d14e6..732f2eff 100644
--- a/app/main/views.py
+++ b/app/main/views.py
@@ -71,4 +71,30 @@ def job(job_id):
     elif not job.user_id == current_user.id:
         print('Job does not belong to current user.')
         abort(403)
-    return render_template('main/jobs/job.html.j2', title='Job', job=job)
+    input_dir = os.path.join(current_app.config['OPAQUE_STORAGE'],
+                             str(current_user.id),
+                             'jobs',
+                             str(job.id))
+    output_dir = os.path.join(current_app.config['OPAQUE_STORAGE'],
+                             str(current_user.id),
+                             'jobs',
+                             str(job.id),
+                             'output')
+
+    input_files = {}
+    for file in os.listdir(input_dir):
+        if file == 'output':
+            continue
+        input_files[file] = os.path.join(input_dir, file)
+
+    output_files = {}
+    if job.status == 'complete':
+        for input_file in input_files:
+            dir = os.path.join(output_dir, input_file)
+            for output_file in os.listdir(dir):
+                output_files[output_file] = os.path.join(dir, output_file)
+
+    return render_template('main/jobs/job.html.j2',
+                           input_files=input_files,
+                           job=job,
+                           output_files=output_files, title='Job')
diff --git a/app/models.py b/app/models.py
index ba0859e8..dcdcdbea 100644
--- a/app/models.py
+++ b/app/models.py
@@ -222,6 +222,7 @@ class Job(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     creation_date = db.Column(db.DateTime(), default=datetime.utcnow)
     description = db.Column(db.String(255))
+    end_date = db.Column(db.DateTime())
     mem_mb = db.Column(db.Integer)
     n_cores = db.Column(db.Integer)
     service = db.Column(db.String(64))
diff --git a/app/services/views.py b/app/services/views.py
index 6d493008..cbc13644 100644
--- a/app/services/views.py
+++ b/app/services/views.py
@@ -73,7 +73,6 @@ def ocr():
                       service='ocr',
                       service_args=json.dumps([
                         '-l {}'.format(new_ocr_job_form.language.data),
-                        '--keep-intermediates',
                         '--skip-binarisation']),
                       service_version=new_ocr_job_form.version.data,
                       status='submitted',
diff --git a/app/swarm.py b/app/swarm.py
index 3ee6596d..50f5e77c 100644
--- a/app/swarm.py
+++ b/app/swarm.py
@@ -1,3 +1,4 @@
+from datetime import datetime
 from sqlalchemy import create_engine
 from sqlalchemy.orm import sessionmaker
 import docker
@@ -110,6 +111,7 @@ class Swarm:
                 break
             time.sleep(1)
             service.reload()
+        job.end_date = datetime.utcnow()
         job.status = current_state
         session.commit()
         session.close()
diff --git a/app/templates/main/jobs/job.html.j2 b/app/templates/main/jobs/job.html.j2
index 1963c977..0a8aad5f 100644
--- a/app/templates/main/jobs/job.html.j2
+++ b/app/templates/main/jobs/job.html.j2
@@ -4,21 +4,90 @@
 <div class="col s12 m4">
   <h3>{{ job.title }}</h3>
   <p>{{ job.description }}</p>
+  {% if job.status == 'pending' %}
+    {% set status_color = 'amber' %}
+  {% elif job.status =='running' %}
+    {% set status_color = 'indigo' %}
+  {% elif job.status =='complete' %}
+    {% set status_color = 'teal' %}
+  {% else %}
+    {% set status_color = 'red' %}
+  {% endif %}
+  <p><a class="waves-effect waves-light btn {{ status_color }}">{{ job.status }}</a></p>
 </div>
 
 <div class="col s12 m8">
   <div class="card">
     <div class="card-content">
-      <span class="card-title">Details</span>
-      <p><b>Creation date</b>: {{ job.creation_date }}</p>
-      <p><b>Description</b>: {{ job.description }}</p>
-      <p><b>Memory</b>: {{ job.mem_mb }} MB</p>
-      <p><b>Cores</b>: {{ job.n_cores }}</p>
-      <p><b>Service</b>: {{ job.service }}</p>
-      <p><b>Service arguments</b>: {{ job.service_args }}</p>
-      <p><b>Service version</b>: {{ job.service_version }}</p>
-      <p><b>Status</b>: {{ job.status }}</p>
-      <p><b>Title</b>: {{ job.title }}</p>
+      <span class="card-title">Chronometrics</span>
+      <div class="row">
+        <div class="col s12 m6">
+          <div class="input-field">
+            <input disabled value="{{ job.creation_date }}" id="creation-date" type="text" class="validate">
+            <label for="creation-date">Creation date</label>
+          </div>
+        </div>
+        <div class="col s12 m6">
+          <div class="input-field">
+            <input disabled value="{{ job.end_date }}" id="end-date" type="text" class="validate">
+            <label for="end-date">End date</label>
+          </div>
+        </div>
+      </div>
+      <span class="card-title">Ressource allocations</span>
+      <div class="row">
+        <div class="col s12 m6">
+          <div class="input-field">
+            <input disabled value="{{ job.mem_mb }}" id="mem-mb" type="text" class="validate">
+            <label for="mem-mb">Memory</label>
+          </div>
+        </div>
+        <div class="col s12 m6">
+          <div class="input-field">
+            <input disabled value="{{ job.n_cores }}" id="n-cores" type="text" class="validate">
+            <label for="n-cores">CPU cores</label>
+          </div>
+        </div>
+      </div>
+      <span class="card-title">Service informations</span>
+      <div class="row">
+        <div class="col s12 m4">
+          <div class="input-field">
+            <input disabled value="{{ job.service }}" id="service" type="text" class="validate">
+            <label for="service">Service</label>
+          </div>
+        </div>
+        <div class="col s12 m4">
+          <div class="input-field">
+            <input disabled value="{{ job.service_args|escape }}" id="service-args" type="text" class="validate">
+            <label for="service-args">Service arguments</label>
+          </div>
+        </div>
+        <div class="col s12 m4">
+          <div class="input-field">
+            <input disabled value="{{ job.service_version }}" id="service-version" type="text" class="validate">
+            <label for="service-version">Service version</label>
+          </div>
+        </div>
+      </div>
+      <p>
+      {% for file in input_files %}
+        <a href="file://{{ input_files[file] }}" class="waves-effect waves-light btn-small">
+          <i class="material-icons left">file_download</i>{{ file }}
+        </a>
+      {% endfor %}
+      </p>
+
+      <p>&nbsp;</p>
+
+      <span class="card-title">Results</span>
+      <p>
+      {% for file in output_files %}
+        <a href="file://{{ output_files[file] }}" class="waves-effect waves-light btn-small">
+          <i class="material-icons left">file_download</i>{{ file }}
+        </a>
+      {% endfor %}
+      </p>
   </div>
 </div>
 
-- 
GitLab