From 88af3df9aa7e8bff2c83d61d8e766d1907316f15 Mon Sep 17 00:00:00 2001 From: Vermaas <vermaas@astron.nl> Date: Mon, 19 Jun 2023 16:19:06 +0200 Subject: [PATCH] add quality algorith per task activated when status is set to stored quality threshold values read from Configuration --- atdb/taskdatabase/models.py | 45 +++++++++++++++++-- atdb/taskdatabase/services/algorithms.py | 12 ++--- .../templates/taskdatabase/index.html | 2 +- .../taskdatabase/validation/headers.html | 5 +++ .../taskdatabase/validation/tasks.html | 7 +++ 5 files changed, 61 insertions(+), 10 deletions(-) diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index 4fac9471..eb3b467d 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -3,8 +3,7 @@ from django.urls import reverse from django.utils import timezone from django.utils.timezone import datetime, timedelta from django.conf import settings - - +import json import logging logger = logging.getLogger(__name__) @@ -68,6 +67,41 @@ def convert_summary_to_list_for_template(task): return list +def calculate_quality(task): + """" + calculate the quality of this task based on rfi_percent values + The threshold values are written from a configuration json blob + """ + try: + # read the quality_thresholds from the Configuration table + try: + quality_thresholds = json.loads(Configuration.objects.get(key='quality_thresholds').value) + except: + quality_thresholds = { + "moderate" : 20, + "poor" : 50, + "overall_moderate" : 50, + "overall_good": 90, + } + + summary = task.quality_json["summary"] + quality = task.quality + + for key in summary: + record = summary[key] + rfi_percent = int(record['rfi_percent']) + if rfi_percent > 0: + quality = "good" + if rfi_percent > quality_thresholds['moderate']: + quality = "moderate" + elif rfi_percent > quality_thresholds['poor']: + quality = "poor" + return quality + + except Exception as error: + logger.info(error) + + class Task(models.Model): # Task control properties @@ -108,12 +142,15 @@ class Task(models.Model): return str(self.id) + ' - (' + self.task_type + ') - ' + str(self.sas_id) def save(self, *args, **kwargs): - # nv:1mar2023, temporary hack, set tasks 'on hold' as soon they get to 'stored' + # nv:1mar2023, temporary hack, set tasks 'on hold' as soon they get to 'scrubbed' # (users forget to do that manually, causing unwanted ingests) - if (self.status != 'scrubbed') & (self.new_status == 'scrubbed'): self.resume = False + # nv:19jun2023, calculate the quality of this task + if (self.status != 'stored') & (self.new_status == 'stored'): + self.quality = calculate_quality(self) + super(Task, self).save(*args, **kwargs) diff --git a/atdb/taskdatabase/services/algorithms.py b/atdb/taskdatabase/services/algorithms.py index abdc4326..73cb0a5f 100644 --- a/atdb/taskdatabase/services/algorithms.py +++ b/atdb/taskdatabase/services/algorithms.py @@ -797,7 +797,6 @@ def construct_inspectionplots(task, expand_image="False", source='task_id'): def construct_summary(task): - title = "" totals = "" results = "" total_size_input = 0 @@ -815,7 +814,7 @@ def construct_summary(task): results += '<tr style="background-color:#7EB1C4"><td colspan="3"><b>Task ' + str(task.id) + '</b></td></tr>' - # find the plots in the quality json structure + # find the summary in the quality json structure try: summary = task.quality_json["summary"] @@ -867,9 +866,12 @@ def construct_summary(task): pass totals += '<th>Totals</th><th></th><th></th>' - totals += '<tr><td colspan="2"><b>Input size</b></td><td>' + str(total_size_input) + '</td></tr>' - totals += '<tr><td colspan="2"><b>Output size</b><td>' + str(total_size_output) + '</td></tr>' - totals += '<tr><td colspan="2"><b>Ratio</b></td><td>' + str(round(total_size_output / total_size_input, 3)) + '</td></tr>' + try: + totals += '<tr><td colspan="2"><b>Input size</b></td><td>' + str(total_size_input) + '</td></tr>' + totals += '<tr><td colspan="2"><b>Output size</b><td>' + str(total_size_output) + '</td></tr>' + totals += '<tr><td colspan="2"><b>Ratio</b></td><td>' + str(round(total_size_output / total_size_input, 3)) + '</td></tr>' + except: + pass results = title + totals + results return results diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index fe379d56..b75b486c 100644 --- a/atdb/taskdatabase/templates/taskdatabase/index.html +++ b/atdb/taskdatabase/templates/taskdatabase/index.html @@ -31,7 +31,7 @@ {% include 'taskdatabase/pagination.html' %} </div> </div> - <p class="footer"> Version 10 May 2023 + <p class="footer"> Version 19 June 2023 </div> {% include 'taskdatabase/refresh.html' %} diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/headers.html b/atdb/taskdatabase/templates/taskdatabase/validation/headers.html index 9cd3a073..8d9206ca 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/headers.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/headers.html @@ -4,6 +4,11 @@ SAS_ID <a href="{% url 'sort-tasks' 'sas_id' 'validation' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> </th> + <th> + <a href="{% url 'sort-tasks' '-workflow' 'validation' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Workflow + <a href="{% url 'sort-tasks' 'workflow' 'validation' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> <th> <a href="{% url 'sort-tasks' '-project' 'validation' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> Project diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html index b4517b9f..981e77c0 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html @@ -5,6 +5,13 @@ <div class="row"> <tr class="{{ task.status }}"> <td>{{ task.sas_id }}</td> + <td> + <a class="open-modal btn btn-primary btn-sm" + href="{% url 'workflow-details' task.workflow.id %}" + data-popup-url="{% url 'workflow-details' task.workflow.id %}" + target="_blank"><i class="fas fa-project-diagram"></i> {{ task.workflow.id }} + </a></td> + </td> <td>{{ task.project }}</td> -- GitLab