diff --git a/app/main/views.py b/app/main/views.py index 261d14e6393e6c674ccc840e545ed3769b525aff..732f2eff92527cd8b97395229d7a7fd5310cfa39 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 ba0859e8ff1c3b1c2571fc9c90ee905ac04e1fdf..dcdcdbea0fd3d83572323a70f9b179c396e1965c 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 6d493008b5ef44110f00092c516e49d7f5c901d9..cbc13644d8c2aa6e26e70a10d70c7a75e830c85f 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 3ee6596de9c7d8ddb2ae9c8defdab46f2e5eecd8..50f5e77cf9ae009deff4c28c279b786db1404db9 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 1963c977cec801e8dd21e5766369f52338564d23..0a8aad5f6006125fed7c410080e68d7b1a62d761 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> </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>