From 39607b5ea49486f9b79afd82b57d26f6236ccd0a Mon Sep 17 00:00:00 2001 From: vermaas <vermaas@astron.nl> Date: Thu, 8 Dec 2022 09:19:57 +0100 Subject: [PATCH] add summary file --- .../static/taskdatabase/ldvlogo_small.png | Bin 0 -> 9789 bytes atdb/taskdatabase/models.py | 43 +++++++++++++ atdb/taskdatabase/services/algorithms.py | 60 +++++++++++++++++- .../templates/taskdatabase/index.html | 2 +- .../taskdatabase/validation/summary.html | 21 ++++++ .../validation/tasks_validation.html | 25 ++++++-- .../validation/tasks_validation_headers.html | 1 + atdb/taskdatabase/urls.py | 1 + atdb/taskdatabase/views.py | 9 +++ 9 files changed, 155 insertions(+), 7 deletions(-) create mode 100644 atdb/atdb/static/taskdatabase/ldvlogo_small.png create mode 100644 atdb/taskdatabase/templates/taskdatabase/validation/summary.html diff --git a/atdb/atdb/static/taskdatabase/ldvlogo_small.png b/atdb/atdb/static/taskdatabase/ldvlogo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..14989c31e2a47e13fb4d083ad33fd105c35d3c9f GIT binary patch literal 9789 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 UD4sk2{dPgfN-9aziW!IeALOkPhyVZp literal 0 HcmV?d00001 diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index c5315f5f..0444c4f8 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -49,6 +49,18 @@ def convert_quality_to_shortlist_for_template(task): return list +def convert_summary_to_list_for_template(task): + list = [] + + try: + summary = task.quality_json['summary'] + + + except Exception as err: + pass + + return list + class Task(models.Model): @@ -118,6 +130,29 @@ class Task(models.Model): except: return False + @property + def has_plots(self): + + try: + quality = self.outputs['quality'] + plots = quality['plots'] + if len(plots) > 0: + return True + else: + return False + + except: + return False + + @property + def has_summary(self): + try: + summary = self.outputs['quality']['summary'] + return True + except: + return False + + @property def quality_json(self): @@ -169,6 +204,14 @@ class Task(models.Model): except: return None + @property + def summary_as_list(self): + try: + q = convert_summary_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 7a1a6e8c..db7a4dfb 100644 --- a/atdb/taskdatabase/services/algorithms.py +++ b/atdb/taskdatabase/services/algorithms.py @@ -3,7 +3,7 @@ Author: Nico Vermaas - Astron Description: Business logic for ATDB. These functions are called from the views (views.py). """ - +import json from datetime import datetime, timedelta from django.db.models import Q, Sum import logging @@ -680,7 +680,6 @@ def unique_values_for_aggregation_key(queryset, aggregation_key): def construct_inspectionplots(task): results = "" - quality_structure = task.quality_json # translate the path to a url try: @@ -703,3 +702,60 @@ def construct_inspectionplots(task): results += '<tr><td><a href="' + url + '" target="_blank">'+ basename + '</a></td></tr>' return results + + +def construct_summary(task): + results = "" + + # find the plots in the quality json structure + summary = task.quality_json["summary"] + #loaded = json.loads(summary) + for key in summary: + record = summary[key] + line = '' + + line += '<tr style="background-color:#7EB1C4"><td colspan="3"><b>' + key + '</b></td></tr>' + + line += '<th>input size</th>' \ + '<th>output size</th>' \ + '<th>size_ratio</th>' + line += '<tr>' + line += '<td>' + record['input_size_str'] + '</td>' + line += '<td>' + str(record['output_size']) + ' (' + record['output_size_str'] + ')</td>' + line += '<td>' + str(round(record['size_ratio'],3)) + '</td>' + line += '</tr>' + + input_content = record['input_content'] + line += '<th>Input Content</th>' + line += '<tr><td colspan="3">' + for filename in input_content: + line += filename + '\n' + line += '</td></tr>' + + output_content = record['output_content'] + line += '<th>Output Content</th>' + line += '<tr><td colspan="3">' + for filename in output_content: + line += filename + '\n' + line += '</td></tr>' + + to_add = record['to_add'] + if to_add: + line += '<th>to_add</th>' + line += '<tr><td colspan="3">' + for filename in to_add: + line += filename + '\n' + line += '</td></tr>' + + to_delete = record['to_delete'] + if to_delete: + line += '<th>to_delete</th>' + line += '<tr><td colspan="3">' + for filename in to_delete: + line += filename + '\n' + line += '</td></tr>' + + + results += line + + return results diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index dd2c61a9..9e997f5a 100644 --- a/atdb/taskdatabase/templates/taskdatabase/index.html +++ b/atdb/taskdatabase/templates/taskdatabase/index.html @@ -34,7 +34,7 @@ {% include 'taskdatabase/pagination.html' %} </div> </div> - <p class="footer"> Version 2 December 2022 - 13:00 + <p class="footer"> Version 8 December 2022 - 7:00 </div> diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/summary.html b/atdb/taskdatabase/templates/taskdatabase/validation/summary.html new file mode 100644 index 00000000..83f69f62 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/validation/summary.html @@ -0,0 +1,21 @@ +{% load static %} +{% block myBlock %} +<div class="container-fluid details-container"> + + + <div class="card"> + <div class="card-body"> + <h4><img src="{% static 'taskdatabase/ldvlogo_small.png' %}" height="30" alt="summary"> + Summary File (sas_id {{ task.sas_id }}) </h4> + <table class="table table-striped"> + {{ my_summary | safe }} + </table> + + </div> + </div> +</div> +{% endblock %} + + +{% include "taskdatabase/modal/modal_script.html" %} +{% include "taskdatabase/modal/modal.html" %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html index 4392498e..196bbd6f 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html @@ -14,19 +14,36 @@ {% for value in task.quality_as_list %} <td>{{value}}</td> {% endfor %} - <td> - <a class="open-modal btn btn-primary btn-sm" + {% if task.has_plots %} + <td> + <a class="open-modal btn btn-primary btn-sm" href="{% url 'inspection-plots' task.id my_tasks.number %}" data-popup-url="{% url 'inspection-plots' task.id my_tasks.number %}"> <img src="{% static 'taskdatabase/surfsara.jpg' %}" height="20" alt="inspection plots"> - </a> + </a> + </td> + {% else %} + <td>-</td> + {% endif %} + + {% if task.has_summary %} + <td> + <a class="open-modal btn btn-primary btn-sm" + href="{% url 'summary' task.id my_tasks.number %}" + data-popup-url="{% url 'summary' task.id my_tasks.number %}"> + <img src="{% static 'taskdatabase/ldvlogo_small.png' %}" height="20" alt="summary"> SUM + </a> </td> + {% else %} + <td>-</td> + {% endif %} {% else %} - <td>-</td><td>-</td><td>-</td><td>-</td> + <td>-</td><td>-</td><td>-</td><td>-</td><td>-</td> {% endif %} + <td> {% if user.is_authenticated %} {% if task.get_quality_remarks_sasid %} diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html index 63b90750..7eba8921 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html @@ -18,6 +18,7 @@ <th>Sensitivity</th> <th>Conditions</th> <th>Plots</th> + <th>Summary</th> <th>Annotate</th> <th>Quality</th> <th>Validate (choose a Q)</th> diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index b486b50f..09dba0c2 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -29,6 +29,7 @@ urlpatterns = [ path('annotate_quality_sasid/<int:id>', views.AnnotateQualitySasId, name='annotate-quality-sasid'), path('annotate_quality_sasid/<int:id>/<page>', views.AnnotateQualitySasId, name='annotate-quality-sasid'), path('show_inspectionplots/<int:id>/<page>', views.ShowInspectionPlots, name='inspection-plots'), + path('show_summary/<int:id>/<page>', views.ShowSummary, name='summary'), 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 389fbf68..908370b9 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -604,6 +604,15 @@ def ShowInspectionPlots(request, id=0, page=0): return render(request, "taskdatabase/validation/inspection_plots.html", {'task': task, 'my_plots': plots_html}) +def ShowSummary(request, id=0, page=0): + # a GET means that the form should be presented to be filled in + task = Task.objects.get(id=id) + + # convert the path to a url + summary_html = algorithms.construct_summary(task) + + return render(request, "taskdatabase/validation/summary.html", {'task': task, 'my_summary': summary_html}) + def ShowInputs(request, id): task = Task.objects.get(id=id) -- GitLab