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 Binary files /dev/null and b/atdb/atdb/static/taskdatabase/ldvlogo_small.png differ diff --git a/atdb/atdb/static/taskdatabase/style.css b/atdb/atdb/static/taskdatabase/style.css index 86e9ac908dc232210c22807bcabfd36f7bd2efe7..4cd9c346b6d3b2691e6860bd785f54a0e130ef09 100644 --- a/atdb/atdb/static/taskdatabase/style.css +++ b/atdb/atdb/static/taskdatabase/style.css @@ -113,11 +113,12 @@ p.title { } .modal-dialog .modal-lg { - max-width: 75% !important; + max-width: 80% !important; } .modal-content { overflow: scroll !important; + width:120% } .form-flex { diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index c5315f5fd0472b40f31c377c029d24b5b6822d74..0444c4f8b6e625a2e135840e50ba3e67e5745d56 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 7a1a6e8c1e11c993f32c28812678181c3c0be134..406bb17aa30c31bd2ee3ff12ba4164023fcb6fe1 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,92 @@ 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"] + + total_size_input = 0 + total_size_output = 0 + + for key in summary: + record = summary[key] + + total_size_input += record['input_size'] + total_size_output+= record['output_size'] + + line = '' + line += '<tr style="background-color:#7EB1C4"><td colspan="3"><b>' + key + '</b></td></tr>' + + line += '<th></th><th>Name</th><th>Size</th>' + line += '<tr><td><b>Input</b></td>' + line += '<td>' + record['input_name'] + '</td>' + line += '<td>' + str(record['input_size']) + ' (' + record['input_size_str'] + ')</td>' + line += '</tr>' + line += '<tr><td><b>Output</b></td>' + line += '<td>' + record['output_name'] + '</td>' + line += '<td>' + str(record['output_size']) + ' (' + record['output_size_str'] + ')</td>' + line += '</tr>' + line += '<tr><td><b>Ratio</b></td>' + line += '<td>' + str(round(record['size_ratio'],3)) + '</td>' + line += '</tr>' + + try: + input_content = record['input_content'] + if input_content: + line += '<th>Input Content</th>' + line += '<tr><td colspan="3">' + for filename in input_content: + line += filename + '\n' + line += '</td></tr>' + except: + pass + + try: + output_content = record['output_content'] + if output_content: + line += '<th>Output Content</th>' + line += '<tr><td colspan="3">' + for filename in output_content: + line += filename + '\n' + line += '</td></tr>' + except: + pass + + try: + 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>' + except: + pass + + try: + 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>' + except: + pass + + results += line + + try: + results += '<th>Totals</th>' + results += '<tr><td colspan="1"><b>Input size</b></td><td>' + str(total_size_input) + '</td></tr>' + results += '<tr><td colspan="1"><b>Output size</b><td>' + str(total_size_output) + '</td></tr>' + results += '<tr><td colspan="1"><b>Ratio</b></td><td>' + str(total_size_output/total_size_output) + '</td></tr>' + + except: + pass + + return results diff --git a/atdb/taskdatabase/static/taskdatabase/style.css b/atdb/taskdatabase/static/taskdatabase/style.css index 86e9ac908dc232210c22807bcabfd36f7bd2efe7..4cd9c346b6d3b2691e6860bd785f54a0e130ef09 100644 --- a/atdb/taskdatabase/static/taskdatabase/style.css +++ b/atdb/taskdatabase/static/taskdatabase/style.css @@ -113,11 +113,12 @@ p.title { } .modal-dialog .modal-lg { - max-width: 75% !important; + max-width: 80% !important; } .modal-content { overflow: scroll !important; + width:120% } .form-flex { diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index dd2c61a9adaef227223016e34154b5f6562579f0..7fdf00000060d8c17b9dc38431d61d56078cac01 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 - 12:00 </div> diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks/quality_card.html b/atdb/taskdatabase/templates/taskdatabase/tasks/quality_card.html index 2dcbc140b91d5fb18acd43c86e5025ad025670f1..853f162e5e2d002d8aea986ccb562c83e7f6dc7e 100644 --- a/atdb/taskdatabase/templates/taskdatabase/tasks/quality_card.html +++ b/atdb/taskdatabase/templates/taskdatabase/tasks/quality_card.html @@ -4,5 +4,9 @@ <table class="table table-striped"> {{ quality | safe }} </table> + <h4>Summary File</h4> + <table class="table table-striped"> + {{ summary | safe }} + </table> </div> </div> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/summary.html b/atdb/taskdatabase/templates/taskdatabase/validation/summary.html new file mode 100644 index 0000000000000000000000000000000000000000..83f69f62930e1db3d010344f0605067d35c7d741 --- /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 4392498eff9731a85653b70499e5342945946c87..196bbd6f54ac5a3e068466757f375c4f380083cc 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 63b90750f0d092801dc7f98f8a4ea3d4cf56f828..7eba892199d051f15e51caa196417972e2f589aa 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 b486b50fabd1876755a20dfafad23a30b3d42e9e..09dba0c2ee01e58fd829fd24912c674ab72cd49e 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 389fbf687a85218c013cd6656e123904ebb0723a..965491c1437c95d91786800e0230ede9c2e59a36 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -522,8 +522,10 @@ def ShowTaskQuality(request, id=0, page=0): request.session['page'] = page quality_html = algorithms.convert_quality_to_html(task) + summary_html = algorithms.construct_summary(task) - return render(request, "taskdatabase/tasks/task_quality.html", {'task': task, 'quality': quality_html}) + return render(request, "taskdatabase/tasks/task_quality.html", + {'task': task, 'quality': quality_html, 'summary' : summary_html}) def AnnotateQualityTaskId(request, id=0, page=0): @@ -604,6 +606,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)