diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index f5e21fc6115903c4de06365257a187220459eaac..fb34d8025473503d00df24ca98b85d33c9d3cf60 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -1,7 +1,6 @@ from django.db import models from django.urls import reverse from django.utils.timezone import datetime -from django.db.models import Sum # constants datetime_format_string = '%Y-%m-%dT%H:%M:%SZ' @@ -18,6 +17,25 @@ class Workflow(models.Model): return str(self.id) +# convert the quality information from the JSONfield into a easy parsable list for the template +def convert_quality_to_list_for_template(task): + list = [] + + try: + list.append(str(task.quality['uv-coverage'])) + list.append(str(task.quality['sensitivity'])) + list.append(str(task.quality['observing-conditions'])) + list.append("(link)") + list.append("(link)") + list.append("(link)") + list.append("(link)") + + except Exception as err: + pass + + return list + + class Task(models.Model): # Task control properties @@ -69,6 +87,31 @@ class Task(models.Model): except: return "no_predecessor" + @property + def has_quality(self): + # todo: check if there is a 'quality' structure in the 'task.outputs' + try: + quality = self.outputs[0]['quality'] + return True + except: + return False + + @property + def quality(self): + # todo: check if there is a 'quality' structure in the 'task.outputs' + try: + return self.outputs[0]['quality'] + except: + return None + + @property + def quality_as_list(self): + try: + q = convert_quality_to_list_for_template(self) + return q + except: + return None + class LogEntry(models.Model): cpu_cycles = models.IntegerField(null=True,blank=True) wall_clock_time = models.IntegerField(null=True,blank=True) diff --git a/atdb/taskdatabase/services/algorithms.py b/atdb/taskdatabase/services/algorithms.py index 4b9c9d48c1eeb1c453c657631b49c2d2939816f1..45d14adcbe7843e43c99b03272326dd9da344689 100644 --- a/atdb/taskdatabase/services/algorithms.py +++ b/atdb/taskdatabase/services/algorithms.py @@ -106,6 +106,31 @@ def convert_logentries_to_html(log_entries): return results +def convert_quality_to_html(task): + results = "" + + try: + results = "" + results += "<tr><td><b>SAS_ID</b></td><td>" + str(task.sas_id) + "</td></tr>" + results += "<tr><td><b>Project</b></td><td>" + str(task.project) + "</td></tr>" + results += "<tr><td><b>ATDB Filter</b></td><td>" + str(task.filter) + "</td></tr>" + results += "<tr><td><b>Input Type</b></td><td>" + "???" + "</td></tr>" + results += "<tr><td><b>NrJobs (MSs)</b></td><td>" + "???" + "</td></tr>" + results += "<tr><td><b>QA uv-coverage</b></td><td>" + str(task.quality['uv-coverage']) + "</td></tr>" + results += "<tr><td><b>QA sensitivity</b></td><td>" + str(task.quality['sensitivity']) + "</td></tr>" + results += "<tr><td><b>QA observing-conditions</b></td><td>" + str(task.quality['observing-conditions']) + "</td></tr>" + results += "<tr><td><b>QA diagnostic plots</b></td><td>" + "(link)" + "</td></tr>" + results += "<tr><td><b>Workflow summary parset</b></td><td>" + "(link)" + "</td></tr>" + results += "<tr><td><b>Summary logs</b></td><td>" + "(link)" + "</td></tr>" + results += "<tr><td><b>QA summary.hf5</b></td><td>" + "(link)" + "</td></tr>" + + except Exception as err: + results = "<tr><td>" + str(err) + "</td></tr>" + # results = "<tr><td>no data</td></tr>" + + return results + + def convert_list_of_dicts_to_html(my_blob): results = "" my_list = [] diff --git a/atdb/taskdatabase/templates/taskdatabase/base.html b/atdb/taskdatabase/templates/taskdatabase/base.html index fbeea95e660f70d021a472afc9deca3d1761c423..1ca7e6141cdf3d1ff27a875b5898b3927b8cb39b 100644 --- a/atdb/taskdatabase/templates/taskdatabase/base.html +++ b/atdb/taskdatabase/templates/taskdatabase/base.html @@ -37,19 +37,24 @@ <div class="container-fluid"> <ul class="nav navbar-nav"> <!-- Header --> - <li><a class="navbar-brand" href="{% url 'homepage' %}"> + <li><a class="navbar-brand" href="{% url 'index' %}"> <img src="{% static 'taskdatabase/new_ldv_logo.png' %}" height="30" alt=""> ATDB</a> </li> - <li><a class="nav-link" href="{% url 'homepage' %}">Tasks</a></li> + <li><a class="nav-link" href="{% url 'index' %}">Tasks</a></li> +{% comment %} + <li><a class="nav-link" href="{% url 'postprocessing-tasks' %}">PostProcessing</a></li> +{% endcomment %} + {% if user.is_authenticated %} - <li><a class="nav-link" href="{% url 'task-details'%}">Details</a></li> + <li><a class="nav-link" href="{% url 'task-details'%}">Task Details</a></li> + <li><a class="nav-link" href="{% url 'quality' %}">Quality</a></li> {% endif %} <li><a class="nav-link" href="{% url 'dashboard' 'active_nores' %}">Dashboard</a></li> - <li><a class="nav-link" href="{% url 'query' %}">Query</a></li> + <li><a class="nav-link" href="{% url 'query' %}">Filter</a></li> <li><a class="nav-link" href="{% url 'monitoring' %}">Monitoring</a></li> diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index 9757dae899f98416f38c410e2bcc5f75a1d4cdeb..592574f4787eac1c0da9ee24b1180266cc1af899 100644 --- a/atdb/taskdatabase/templates/taskdatabase/index.html +++ b/atdb/taskdatabase/templates/taskdatabase/index.html @@ -19,53 +19,7 @@ <table class="table table-striped table-bordered table-sm"> <thead> - <tr> - <th> - <a href="{% url 'sort-tasks' '-pk' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> - ID - <a href="{% url 'sort-tasks' 'id' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> - </th> - <th>Details</th> - <th> - <a href="{% url 'sort-tasks' '-workflow' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> - Workflow - <a href="{% url 'sort-tasks' 'workflow' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> - </th> - <th> - <a href="{% url 'sort-tasks' '-priority' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> - Priority - <a href="{% url 'sort-tasks' 'priority' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> - </th> - - <th> - <a href="{% url 'sort-tasks' '-status' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> - Status - <a href="{% url 'sort-tasks' 'status' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> - </th> - <th> - <a href="{% url 'sort-tasks' '-project' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> - Project - <a href="{% url 'sort-tasks' 'project' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> - </th> - <th> - <a href="{% url 'sort-tasks' '-sas_id' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> - SAS_ID - <a href="{% url 'sort-tasks' 'sas_id' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> - </th> - <th> - <a href="{% url 'sort-tasks' '-creationTime' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> - CreationTime - <a href="{% url 'sort-tasks' 'creationTime' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> - </th> - - <th> - <a href="{% url 'sort-tasks' '-size_to_process' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> - Size - <a href="{% url 'sort-tasks' 'size_to_process' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> - </th> - - <th>Actions</th> - </tr> + {% include 'taskdatabase/tasks_headers.html' %} </thead> <tbody> {% include 'taskdatabase/tasks.html' %} @@ -80,12 +34,11 @@ {% include 'taskdatabase/pagination.html' %} </div> </div> - <p class="footer"> Version 1.0.0 (3 feb 2021 - 14:00) + <p class="footer"> Version 1.0.0 (4 feb 2021 - 16:00) </div> {% include 'taskdatabase/localstorage_scripts.html' %} - {% endblock %} diff --git a/atdb/taskdatabase/templates/taskdatabase/monitoring.html b/atdb/taskdatabase/templates/taskdatabase/monitoring_page.html similarity index 87% rename from atdb/taskdatabase/templates/taskdatabase/monitoring.html rename to atdb/taskdatabase/templates/taskdatabase/monitoring_page.html index 95fc5c138573e3b7b2cf63ff8a335c0d505c21e7..6da4454a4bd42cee537b8fad34682ccca7f68961 100644 --- a/atdb/taskdatabase/templates/taskdatabase/monitoring.html +++ b/atdb/taskdatabase/templates/taskdatabase/monitoring_page.html @@ -4,6 +4,14 @@ {% block myBlock %} <div class="hiking-container container-fluid"> + <div class="card"> + <div class="card-body"> + <div class="row"> + <div class="col-8"> + <h3>Monitoring</h3> + </div> + </div> + <div class="col-sm-6 col-md-8 col-lg-12"> <div class="thumbnail"> diff --git a/atdb/taskdatabase/templates/taskdatabase/postprocessing.html b/atdb/taskdatabase/templates/taskdatabase/postprocessing.html new file mode 100644 index 0000000000000000000000000000000000000000..276050d311900953d1aa60ba736094572b4ce31a --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/postprocessing.html @@ -0,0 +1,91 @@ +{% extends 'taskdatabase/base.html' %} +{% load static %} + +{% block myBlock %} + +<div class="container-fluid details-container"> + + {% include 'taskdatabase/filter/filter_buttons.html' %} + + <div class="row"> + <div class="col-sm-12 col-md-12 col-lg-12"> + {% include 'taskdatabase/pagination.html' %} + + {% if my_tasks %} + <div class="panel panel-success"> + + <div class="panel-body"> + + <table class="table table-striped table-bordered table-sm"> + + <thead> + <tr> + <th> + <a href="{% url 'sort-tasks' '-pk' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + ID + <a href="{% url 'sort-tasks' 'id' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th>Details</th> + <th> + <a href="{% url 'sort-tasks' '-workflow' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Workflow + <a href="{% url 'sort-tasks' 'workflow' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-priority' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Priority + <a href="{% url 'sort-tasks' 'priority' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + + <th> + <a href="{% url 'sort-tasks' '-status' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Status + <a href="{% url 'sort-tasks' 'status' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-project' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Project + <a href="{% url 'sort-tasks' 'project' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-sas_id' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + SAS_ID + <a href="{% url 'sort-tasks' 'sas_id' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-creationTime' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + CreationTime + <a href="{% url 'sort-tasks' 'creationTime' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + + <th> + <a href="{% url 'sort-tasks' '-size_to_process' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Size + <a href="{% url 'sort-tasks' 'size_to_process' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + + <th>Actions</th> + </tr> + </thead> + <tbody> + {% include 'taskdatabase/tasks.html' %} + </tbody> + </table> + {% else %} + <p>No recent Tasks.</p> + {% endif %} + + </div> + </div> + {% include 'taskdatabase/pagination.html' %} + </div> + </div> + <p class="footer"> Version 1.0.0 (3 feb 2021 - 8:00) + +</div> + +{% include 'taskdatabase/localstorage_scripts.html' %} + + +{% endblock %} + diff --git a/atdb/taskdatabase/templates/taskdatabase/quality_page.html b/atdb/taskdatabase/templates/taskdatabase/quality_page.html new file mode 100644 index 0000000000000000000000000000000000000000..f837b06804ea32d38242d10b5d7b9f7c887b2743 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/quality_page.html @@ -0,0 +1,48 @@ +{% extends 'taskdatabase/base.html' %} +{% load static %} + +{% block myBlock %} + +<div class="container-fluid details-container"> + <div class="card"> + <div class="card-body"> + <div class="row"> + <div class="col-8"> + <h3>Quality Diagnostics</h3> + </div> + </div> + <div class="row"> + <div class="col-sm-12 col-md-12 col-lg-12"> + {% include 'taskdatabase/pagination.html' %} + + {% if my_tasks %} + <div class="panel panel-success"> + + <div class="panel-body"> + + <table class="table table-striped table-bordered table-sm"> + <thead> + {% include 'taskdatabase/tasks_quality_headers.html' %} + </thead> + <tbody> + {% include 'taskdatabase/tasks_quality.html' %} + </tbody> + </table> + {% else %} + <p>No recent Tasks.</p> + {% endif %} + + </div> + </div> + {% include 'taskdatabase/pagination.html' %} + </div> + </div> + </div> + </div> +</div> + +{% include 'taskdatabase/localstorage_scripts.html' %} + + +{% endblock %} + diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks.html b/atdb/taskdatabase/templates/taskdatabase/tasks.html index a4bcecb7162d9c1774687c1321de258375eb7ade..a9486cfd7d50d78ae22ce5e91deeebc2dffbc109 100644 --- a/atdb/taskdatabase/templates/taskdatabase/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/tasks.html @@ -9,12 +9,19 @@ </td> <td> {% if user.is_authenticated %} - <a class="btn btn-primary btn-sm" - href="{% url 'task-details' task.id my_tasks.number %}" - data-popup-url="{% url 'task-details' task.id my_tasks.number %}" - ><i class="fas fa-list"></i> Details - </a> + <a class="btn btn-primary btn-sm" + href="{% url 'task-details' task.id my_tasks.number %}" + data-popup-url="{% url 'task-details' task.id my_tasks.number %}" + ><i class="fas fa-list"></i> Details + </a> + {% if task.has_quality %} + <a class="open-modal btn btn-primary btn-sm" + href="{% url 'task-quality' task.id my_tasks.number %}" + data-popup-url="{% url 'task-quality' task.id my_tasks.number %}" + ><i class="fas fa-balance-scale-right"></i> Quality + </a> + {% endif %} {% endif %} </td> <td> diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks/details_card.html b/atdb/taskdatabase/templates/taskdatabase/tasks/details_card.html index 789074800502e1b7065712b9743ef3b0250137b3..abaab6708b567ee4c3757e122298ab2c9cb16b3e 100644 --- a/atdb/taskdatabase/templates/taskdatabase/tasks/details_card.html +++ b/atdb/taskdatabase/templates/taskdatabase/tasks/details_card.html @@ -1,7 +1,7 @@ <div class="card"> <div class="card-body"> - <h4>Task: {{ task.id }}</h4> + <h4>Task: {{ task.id }} ({{ task.task_type }})</h4> <table class="table table-striped"> <tbody> <tr><td><b>id</b></td><td><a href="{% url 'task-detail-view-api' task.pk %}" target="_blank">{{ task.id }} </a></td></tr> @@ -45,6 +45,13 @@ data-popup-url="{% url 'show-metrics' task.id %}" target="_blank"><i class="fas fa-clock"></i> metrics </a> + {% if task.has_quality %} + <a class="open-modal btn btn-primary btn-sm" + href="{% url 'task-quality' task.id 1 %}" + data-popup-url="{% url 'task-quality' task.id 1 %}" + ><i class="fas fa-balance-scale-right"></i> Quality + </a> + {% endif %} </td> </tr> <tr><td><b>filter</b></td><td>{{ task.filter }}</td></tr> diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks/quality_card.html b/atdb/taskdatabase/templates/taskdatabase/tasks/quality_card.html new file mode 100644 index 0000000000000000000000000000000000000000..2dcbc140b91d5fb18acd43c86e5025ad025670f1 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/tasks/quality_card.html @@ -0,0 +1,8 @@ +<div class="card"> + <div class="card-body"> + <h4>Quality Diagnostics</h4> + <table class="table table-striped"> + {{ quality | safe }} + </table> + </div> +</div> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks/task_quality.html b/atdb/taskdatabase/templates/taskdatabase/tasks/task_quality.html new file mode 100644 index 0000000000000000000000000000000000000000..36102a4fb86ce5b13ce448a3ec47b5a292c92b13 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/tasks/task_quality.html @@ -0,0 +1,19 @@ + +{% load static %} +{% block myBlock %} + +<div class="container-fluid details-container"> + + <div class="row"> + + <div class="col-md"> + {% include "taskdatabase/tasks/quality_card.html" %} + </div> + </div> +</div> + +{% include "taskdatabase/modal/modal_script.html" %} +{% include "taskdatabase/modal/modal.html" %} + +{% endblock %} + diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks_headers.html b/atdb/taskdatabase/templates/taskdatabase/tasks_headers.html new file mode 100644 index 0000000000000000000000000000000000000000..156832363547b92123d5e85d64c4486b499d6147 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/tasks_headers.html @@ -0,0 +1,47 @@ +<tr> + <th> + <a href="{% url 'sort-tasks' '-pk' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + ID + <a href="{% url 'sort-tasks' 'id' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th>Details</th> + <th> + <a href="{% url 'sort-tasks' '-workflow' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Workflow + <a href="{% url 'sort-tasks' 'workflow' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-priority' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Priority + <a href="{% url 'sort-tasks' 'priority' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + + <th> + <a href="{% url 'sort-tasks' '-status' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Status + <a href="{% url 'sort-tasks' 'status' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-project' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Project + <a href="{% url 'sort-tasks' 'project' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-sas_id' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + SAS_ID + <a href="{% url 'sort-tasks' 'sas_id' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-creationTime' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + CreationTime + <a href="{% url 'sort-tasks' 'creationTime' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + + <th> + <a href="{% url 'sort-tasks' '-size_to_process' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Size + <a href="{% url 'sort-tasks' 'size_to_process' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + + <th>Actions</th> +</tr> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks_quality.html b/atdb/taskdatabase/templates/taskdatabase/tasks_quality.html new file mode 100644 index 0000000000000000000000000000000000000000..75c461e2296df90e3092b03e3231195942ff4ff4 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/tasks_quality.html @@ -0,0 +1,49 @@ +{% load static %} +{% for task in my_tasks %} + + {% if task.status != "removed_invisible" %} + <div class="row"> + <tr class="{{ task.status }}"> + + <td> + <a href="{{ task.get_absolute_url }}" target="_blank">{{ task.id }} </a> + </td> + <td> + {% if user.is_authenticated %} + <a class="btn btn-primary btn-sm" + href="{% url 'task-details' task.id my_tasks.number %}" + data-popup-url="{% url 'task-details' task.id my_tasks.number %}" + ><i class="fas fa-list"></i> Details + </a> + {% endif %} + </td> + + {% if task.resume %} + <td class="bigger">{{ task.status }}</td> + {% endif %} + {% if not task.resume %} + <td class="bigger">{{ task.status }} (holding)</td> + {% endif %} + + <td>{{ task.project }}</td> + <td>{{ task.sas_id }}</td> + + <td>{{ task.filter }} </td> + + {% if task.has_quality %} + {% for value in task.quality_as_list %} + <td>{{value}}</td> + {% endfor %} + {% endif %} + + + <td> + + </tr> + </div> + {% endif %} + +{% endfor %} + +{% include "taskdatabase/modal/modal_script.html" %} +{% include "taskdatabase/modal/modal.html" %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks_quality_headers.html b/atdb/taskdatabase/templates/taskdatabase/tasks_quality_headers.html new file mode 100644 index 0000000000000000000000000000000000000000..cd699a598401ff3848aa79ade6099795e5574dc3 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/tasks_quality_headers.html @@ -0,0 +1,16 @@ +<tr> + <th>ID</th> + <th>Details</th> + + <th>Status</th> + <th>Project</th> + <th>SAS_ID</th> + <th>filter</th> + <th>uv-coverage</th> + <th>Sensitivity</th> + <th>Conditions</th> + <th>Diagnostic plots</th> + <th>Summary parset</th> + <th>Summary logs</th> + <th>Summary hf5</th> +</tr> \ No newline at end of file diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index 3fa60009e715d2151de55623ac9fb34f61c6ccb5..bddabc88d16811e3aeff0b16d6c829eea3abbefa 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -12,10 +12,14 @@ urlpatterns = [ path('login/', auth_views.LoginView.as_view(template_name='registration/login.html')), # --- GUI --- - path('', views.IndexView.as_view(), name='homepage'), + path('', views.IndexView.as_view(), name='index'), + path('postprocessing-tasks', views.PostProcessingTasksView.as_view(), name='postprocessing-tasks'), + path('quality', views.ShowQualityPage.as_view(), name='quality'), path('task_details/<int:id>/<page>', views.TaskDetails, name='task-details'), path('task_details/', views.TaskDetails, name='task-details'), + path('task_quality/<int:id>/<page>', views.TaskQuality, name='task-quality'), + path('task_quality/', views.TaskQuality, name='task-quality'), path('show-inputs/<int:id>/', views.ShowInputs, name='show-inputs'), path('show-outputs/<int:id>/', views.ShowOutputs, name='show-outputs'), diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index bdc133adc66ec16c833f88f36d6e905cd940bccf..191b504e4802f5a7f203280ec5dde7db7e6494e6 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -155,7 +155,8 @@ class MonitorFilter(filters.FilterSet): class QueryView(SingleTableMixin, FilterView): table_class = TaskTable model = Task - queryset = Task.objects.filter(task_type='regular') + # queryset = Task.objects.filter(task_type='regular') + queryset = Task.objects.all() template_name = "query/index.html" filterset_class = TaskFilterQueryPage @@ -221,7 +222,136 @@ class IndexView(ListView): tasks = get_searched_tasks(search_box, sort) # only return the 'regular' tasks, and not the 'postprocessing' tasks in the GUI - tasks = tasks.filter(task_type='regular') + # tasks = tasks.filter(task_type='regular') + + paginator = Paginator(tasks, config.TASKS_PER_PAGE) # Show 50 tasks per page + page = self.request.GET.get('page') + + try: + # check if there was a page on the session, if so, use it. + if page == None: + page = self.request.session['page'] + self.request.session['page'] = None + except: + pass + + try: + tasks = paginator.page(page) + except PageNotAnInteger: + # If page is not an integer, deliver first page. + tasks = paginator.page(1) + except EmptyPage: + # If page is out of range (e.g. 9999), deliver last page of results. + tasks = paginator.page(paginator.num_pages) + + return tasks + + +class PostProcessingTasksView(ListView): + """ + This is the main view of ATDB. It shows a pagination list of tasks, sorted by creationTime. + """ + template_name = 'taskdatabase/postprocessing.html' + + # by default this returns the list in an object called object_list, so use 'object_list' in the html page. + # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html. + context_object_name = 'my_tasks' + + def get_queryset(self): + status = self.request.GET.get('status') + search_box = self.request.GET.get('search_box', None) + + # get the sort variable from the session or use default + try: + sort = self.request.session['sort'] + except: + sort = '-creationTime' + + tasks = Task.objects.order_by(sort) + + # check if there is a 'task_filter' put on the session + try: + filter = self.request.session['task_filter'] + if filter != 'all': + tasks = get_searched_tasks(filter, sort) + except: + pass + + # check if there is a 'task_onhold_filter' put on the session + try: + onhold = self.request.session['task_onhold_filter'] + if onhold != None: + tasks = tasks.filter(resume=not onhold) + + except: + pass + + if (search_box is not None): + tasks = get_searched_tasks(search_box, sort) + + # only return the 'regular' tasks, and not the 'postprocessing' tasks in the GUI + tasks = tasks.filter(task_type='postprocessing') + + paginator = Paginator(tasks, config.TASKS_PER_PAGE) # Show 50 tasks per page + page = self.request.GET.get('page') + + try: + # check if there was a page on the session, if so, use it. + if page == None: + page = self.request.session['page'] + self.request.session['page'] = None + except: + pass + + try: + tasks = paginator.page(page) + except PageNotAnInteger: + # If page is not an integer, deliver first page. + tasks = paginator.page(1) + except EmptyPage: + # If page is out of range (e.g. 9999), deliver last page of results. + tasks = paginator.page(paginator.num_pages) + + return tasks + + +class ShowQualityPage(ListView): + """ + This is the main view of ATDB. It shows a pagination list of tasks, sorted by creationTime. + """ + template_name = 'taskdatabase/quality_page.html' + + # by default this returns the list in an object called object_list, so use 'object_list' in the html page. + # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html. + context_object_name = 'my_tasks' + + def get_queryset(self): + status = self.request.GET.get('status') + search_box = self.request.GET.get('search_box', None) + + # get the sort variable from the session or use default + try: + sort = self.request.session['sort'] + except: + sort = '-creationTime' + + tasks = Task.objects.order_by(sort) + + # check if there is a 'task_filter' put on the session + try: + filter = self.request.session['task_filter'] + if filter != 'all': + tasks = get_searched_tasks(filter, sort) + except: + pass + + if (search_box is not None): + tasks = get_searched_tasks(search_box, sort) + + # exclude the tasks without quality information + tasks = tasks.exclude(outputs__isnull=True) + tasks = tasks.exclude(outputs__0__quality__isnull=True) + paginator = Paginator(tasks, config.TASKS_PER_PAGE) # Show 50 tasks per page page = self.request.GET.get('page') @@ -279,7 +409,7 @@ def TaskDetails(request, id=0, page=0): task = Task.objects.get(id=task_on_session) except: messages.add_message(request, messages.WARNING, 'no task selected.') - return redirect('homepage') + return redirect('index') # store the current page on the session request.session['page'] = page @@ -290,6 +420,32 @@ def TaskDetails(request, id=0, page=0): return render(request, "taskdatabase/tasks/task_details.html", {'task': task, 'logentries': logentries_html}) +def TaskQuality(request, id=0, page=0): + try: + task = Task.objects.get(id=id) + + # store the requested task_id on the session + request.session['task_id'] = task.id + + except: + # when an invalid id is given, like '/atdb/task_details/0/', + # then look if there is a task stored on the session + try: + task_on_session = request.session['task_id'] + task = Task.objects.get(id=task_on_session) + except: + messages.add_message(request, messages.WARNING, 'no task selected.') + return redirect('index') + + # store the current page on the session + request.session['page'] = page + + quality_html = algorithms.convert_quality_to_html(task) + + return render(request, "taskdatabase/tasks/task_quality.html", {'task': task, 'quality': quality_html}) + + + def ShowInputs(request, id): task = Task.objects.get(id=id) @@ -341,7 +497,7 @@ def ShowMonitoring(request): distinct_services_per_host = LatestMonitor.objects.all().order_by('name', 'hostname', '-timestamp').distinct('name', 'hostname') monitor_results = algorithms.convert_monitor_to_html(request, distinct_services_per_host) - return render(request, "taskdatabase/monitoring.html", {'monitor_results': monitor_results}) + return render(request, "taskdatabase/monitoring_page.html", {'monitor_results': monitor_results}) class DiagramView(ListView):