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>&nbsp;
+                        </a>&nbsp;
+                    </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>&nbsp;
                     </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