diff --git a/atdb/taskdatabase/services/algorithms.py b/atdb/taskdatabase/services/algorithms.py index de2afb9aac74c575b9a92e424921b07d6476d2f1..1039ee574d4f81b1d0747831abd4820aa0bac8a5 100644 --- a/atdb/taskdatabase/services/algorithms.py +++ b/atdb/taskdatabase/services/algorithms.py @@ -1127,22 +1127,135 @@ def construct_linc_summary(task): return results -def construct_summary(task): +def construct_summary(task, format='html'): summary_flavour = get_summary_flavour(task) logger.info(f'summary_flavour = {summary_flavour}') - # construct the appropriate summary html - if summary_flavour == SummaryFlavour.DEFAULT.value: - return construct_default_summary(task) + if format=='html': + # construct the appropriate summary html + if summary_flavour == SummaryFlavour.DEFAULT.value: + return construct_default_summary(task) - elif summary_flavour == SummaryFlavour.IMAGING_COMPRESSION.value: - return construct_imaging_summary(task) + elif summary_flavour == SummaryFlavour.IMAGING_COMPRESSION.value: + return construct_imaging_summary(task) - elif summary_flavour == SummaryFlavour.LINC_CALIBRATOR.value: - return construct_linc_summary(task) + elif summary_flavour == SummaryFlavour.LINC_CALIBRATOR.value: + return construct_linc_summary(task) - elif summary_flavour == SummaryFlavour.LINC_TARGET.value: - return construct_linc_summary(task) + elif summary_flavour == SummaryFlavour.LINC_TARGET.value: + return construct_linc_summary(task) + + elif format=='json': + if summary_flavour == SummaryFlavour.DEFAULT.value: + return construct_default_summary_json(task) return None + + +def construct_default_summary_json(task): + + total_size_input = 0 + total_size_output = 0 + quality_values = {'poor': 0, 'moderate': 0, 'good': 0} + + sas_id = task.sas_id + title = f'Summary File for SAS_ID {task.sas_id}' + summary_json = {} + summary_json['title'] = title + + tasks = Task.objects.filter(sas_id=sas_id) + tasks_records = [] + + for task in tasks: + task_record = {} + + # skip 'suspended' and 'discarded' tasks + if task.status in ['suspended', 'discarded']: + continue + + task_record['task'] = task.id + + # find the summary in the quality json structure + try: + summary = task.quality_json["summary"] + + for key in summary: + record = summary[key] + total_size_input += record['input_size'] + total_size_output+= record['output_size'] + + task_record['file'] = key + task_record['input_name'] = record['input_name'] + task_record['input_size'] = record['input_size'] + task_record['output_name'] = record['output_name'] + task_record['output_size'] = record['output_size'] + task_record['size_ratio'] = str(round(record['size_ratio'],3)) + + if 'rfi_percent' in record: + # add RFI percentage (if present) + task_record['rfi_percent'] = str(record['rfi_percent']) + + try: + # add calculated quality (if present) + calculated_qualities = task.calculated_qualities + if calculated_qualities: + task_quality = calculated_qualities['per_task'] + task_record['task_quality'] = str(task_quality) + + except: + pass + + try: + task_record['added'] = record['added'] + except: + pass + + try: + task_record['deleted'] = record['deleted'] + except: + pass + + try: + key = task.calculated_qualities['per_task'] + quality_values[key] = quality_values[key] + 1 + except: + # ignore the tasks that have no calculated quality. + pass + + tasks_records.append(task_record) + except: + pass + + # calculate totals + totals_record = {} + + try: + totals_record['input_size'] = total_size_input + totals_record['output_size'] = total_size_output + totals_record['ratio'] = round(total_size_output / total_size_input, 3) + + try: + # add calculated quality per sasid (if present) + if calculated_qualities: + sasid_quality = calculated_qualities['per_sasid'] + totals_record['sasid_quality'] = str(sasid_quality) + totals_record['quality_values'] = str(quality_values) + + try: + quality_thresholds = json.loads(Configuration.objects.get(key='quality_thresholds').value) + totals_record['rfi_tresholds'] = quality_thresholds + + except: + pass + except: + pass + + except: + pass + + summary_json['totals'] = totals_record + summary_json['tasks'] = tasks_records + + return summary_json + diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/retry_buttons.html b/atdb/taskdatabase/templates/taskdatabase/failures/retry_buttons.html index 09fdec5133ace7fab6db25a3b659d8bfea5c01da..6126d241702fe94b93d4ed964ceeed2fc52a12b3 100644 --- a/atdb/taskdatabase/templates/taskdatabase/failures/retry_buttons.html +++ b/atdb/taskdatabase/templates/taskdatabase/failures/retry_buttons.html @@ -17,7 +17,7 @@ <a href="{% url 'task-retry-view' task.pk 'scrubbed' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><b><i class="fas fa-sync-alt"></i> Retry</b></a> {% endif %} {% if task.status == "archived_failed" %} - (manual) </b></a> + <a href="{% url 'task-retry-view' task.pk 'pre_archived' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><b><i class="fas fa-sync-alt"></i> Retry</b></a> {% endif %} {% if task.status == "finished_failed" %} <a href="{% url 'task-retry-view' task.pk 'finishing' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><b><i class="fas fa-sync-alt"></i> Retry</b></a> diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index bac558c2ef8d49eea882f8f42a7c143b682026ce..14c9ae55140bbba720355c249ec513fad43f9e36 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -1796,8 +1796,8 @@ def GetSummaryJson(request, sas_id): # use a trick to be able to use the existing task based code queryset = Task.objects.filter(sas_id=sas_id) task = queryset[0] - #summary_json = algorithms.construct_summary_json(task) - summary_json = None + summary_json = algorithms.construct_summary(task,format='json') + return JsonResponse({ 'summary': summary_json })