diff --git a/atdb/atdb/static/taskdatabase/style.css b/atdb/atdb/static/taskdatabase/style.css index b8cd66eb0f20cc2334faf2e99bb7a853f4c23499..37d988b1e6c50054db44b60a3216a3b10a530bb9 100644 --- a/atdb/atdb/static/taskdatabase/style.css +++ b/atdb/atdb/static/taskdatabase/style.css @@ -118,4 +118,8 @@ p.title { .modal-content { overflow: scroll !important; +} + +.form-flex { + display: flex; } \ No newline at end of file diff --git a/atdb/taskdatabase/forms.py b/atdb/taskdatabase/forms.py index 8df61fe653fbda58e10c943611c6ca5f817c7976..6354a3c50d8c1d5109256c1de9d6238d3aa1421e 100644 --- a/atdb/taskdatabase/forms.py +++ b/atdb/taskdatabase/forms.py @@ -1,10 +1,5 @@ from django import forms -STATUS_CHOICES = [('defined','defined'), - ('scheduled','scheduled'), - ('running','running'), - ('removed','removed'), - ('error','error') - ] -class FilterForm(forms.Form): - status = forms.MultipleChoiceField(required=True, widget=forms.CheckboxSelectMultiple, choices=STATUS_CHOICES) +class QualityAnnotationForm(forms.Form): + annotation = forms.CharField(label='', widget=forms.Textarea, max_length=1000) + return_to_page = forms.IntegerField(widget=forms.HiddenInput) \ No newline at end of file diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index 9556bd8af823d4212941c0078c96138d537549cd..48b8e59f12c3724e9855328bfc9bb9e39ea6f348 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -26,9 +26,6 @@ def convert_quality_to_list_for_template(task): list.append(str(task.quality_json['sensitivity'])) list.append(str(task.quality_json['observing-conditions'])) list.append("-") - list.append("-") - list.append("-") - list.append("-") except Exception as err: pass diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py index 45bbd2823f400d25956676c681fc5fbaff4b5e61..a260c1d888ef2cffa1114cd55d1f8d71efae3a49 100644 --- a/atdb/taskdatabase/serializers.py +++ b/atdb/taskdatabase/serializers.py @@ -98,7 +98,7 @@ class TaskReadSerializer(serializers.ModelSerializer): 'workflow', 'stage_request_id', 'status','new_status','quality', - 'inputs','outputs','metrics','status_history', + 'inputs','outputs','metrics','remarks','status_history', 'size_to_process', 'size_processed', 'total_processing_time', 'log_entries','meta_scheduling','environment' ] diff --git a/atdb/taskdatabase/services/algorithms.py b/atdb/taskdatabase/services/algorithms.py index 958cb43db886d35571ff52b4efe8072a6907e662..69b58e5014466e92d5e186848d4eda41661d27e0 100644 --- a/atdb/taskdatabase/services/algorithms.py +++ b/atdb/taskdatabase/services/algorithms.py @@ -138,9 +138,9 @@ def convert_quality_to_html(task): pass results += "<tr><td><b>QA diagnostic plots</b></td><td>" + "-" + "</td></tr>" - results += "<tr><td><b>Workflow summary parset</b></td><td>" + "-" + "</td></tr>" - results += "<tr><td><b>Summary logs</b></td><td>" + "-" + "</td></tr>" - results += "<tr><td><b>QA summary.hf5</b></td><td>" + "-" + "</td></tr>" + #results += "<tr><td><b>Workflow summary parset</b></td><td>" + "-" + "</td></tr>" + #results += "<tr><td><b>Summary logs</b></td><td>" + "-" + "</td></tr>" + #results += "<tr><td><b>QA summary.hf5</b></td><td>" + "-" + "</td></tr>" except Exception as err: results = "<tr><td>" + str(err) + "</td></tr>" diff --git a/atdb/taskdatabase/static/taskdatabase/style.css b/atdb/taskdatabase/static/taskdatabase/style.css index b8cd66eb0f20cc2334faf2e99bb7a853f4c23499..37d988b1e6c50054db44b60a3216a3b10a530bb9 100644 --- a/atdb/taskdatabase/static/taskdatabase/style.css +++ b/atdb/taskdatabase/static/taskdatabase/style.css @@ -118,4 +118,8 @@ p.title { .modal-content { overflow: scroll !important; +} + +.form-flex { + display: flex; } \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/retry_buttons.html b/atdb/taskdatabase/templates/taskdatabase/failures/retry_buttons.html new file mode 100644 index 0000000000000000000000000000000000000000..3a82fed5947d0a236d4da144c004456085656b09 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/failures/retry_buttons.html @@ -0,0 +1,18 @@ + {% if task.status == "staged_failed" or task.status == "staging_failed" %} + <a href="{% url 'task-retry-view' task.pk 'defined' 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 == "fetched_failed" or task.status == "fetching_failed" %} + <a href="{% url 'task-retry-view' task.pk 'staged' 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 == "processed_failed" or task.status == "processing_failed" %} + <a href="{% url 'task-retry-view' task.pk 'fetched' 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 == "stored_failed" or task.status == "storing_failed" %} + <a href="{% url 'task-retry-view' task.pk 'processed' 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 == "scrubbed_failed" or task.status == "scrubbing_failed" %} + <a href="{% url 'task-retry-view' task.pk 'validated' 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" or task.status == "archiving_failed" %} + <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 %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html index 817f4405af2f60f30e83df0771cb2bc80a95fe1f..51bd7cabba1fc72a5ae5fea04e123f93f51f29f8 100644 --- a/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html +++ b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html @@ -37,37 +37,8 @@ <td>{{ task.filter }} </td> - {% if task.status == "staged_failed" or task.status == "staging_failed" %} - <td> - <a href="{% url 'task-retry-view' task.pk 'defined' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><b><i class="fas fa-sync-alt"></i> Retry</b></a> - </td> - {% endif %} - {% if task.status == "fetched_failed" or task.status == "fetching_failed" %} - <td> - <a href="{% url 'task-retry-view' task.pk 'staged' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><b><i class="fas fa-sync-alt"></i> Retry</b></a> - </td> - {% endif %} - {% if task.status == "processed_failed" or task.status == "processing_failed" %} - <td> - <a href="{% url 'task-retry-view' task.pk 'fetched' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><b><i class="fas fa-sync-alt"></i> Retry</b></a> - </td> - {% endif %} - {% if task.status == "stored_failed" or task.status == "storing_failed" %} - <td> - <a href="{% url 'task-retry-view' task.pk 'processed' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><b><i class="fas fa-sync-alt"></i> Retry</b></a> - </td> - {% endif %} - {% if task.status == "scrubbed_failed" or task.status == "scrubbing_failed" %} - <td> - <a href="{% url 'task-retry-view' task.pk 'validated' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><b><i class="fas fa-sync-alt"></i> Retry</b></a> - </td> - {% endif %} - {% if task.status == "archived_failed" or task.status == "archiving_failed" %} - <td> - <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> - </td> - {% endif %} - <td> + + <td>{% include "taskdatabase/failures/retry_buttons.html" %}</td> </tr> </div> diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index 7a8652a35b72291fb0561ef6e9b05e1c049ce61a..9f5636ed866590291c270f54bcb2e9a1b9e63b89 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 1.0.0 (4 apr 2021 - 13:00) + <p class="footer"> Version 1.0.0 (8 apr 2021 - 11:00) </div> diff --git a/atdb/taskdatabase/templates/taskdatabase/modal/modal_no_close.html b/atdb/taskdatabase/templates/taskdatabase/modal/modal_no_close.html new file mode 100644 index 0000000000000000000000000000000000000000..e153f3a89d91a2477b871effb5c390233d98fe82 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/modal/modal_no_close.html @@ -0,0 +1,8 @@ + +<div id="popup" class="modal fade" role="dialog"> + <div class="modal-dialog modal-lg"> + <div class="modal-content"> + <div class="modal-body"></div> + </div> + </div> +</div> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/modal/modal_script.html b/atdb/taskdatabase/templates/taskdatabase/modal/modal_script.html index 1c0d5006e22de81d0a943b69510fbf8ba88c4a63..52cff4d42b8d10e61a4b4e05e3d8090da4492426 100644 --- a/atdb/taskdatabase/templates/taskdatabase/modal/modal_script.html +++ b/atdb/taskdatabase/templates/taskdatabase/modal/modal_script.html @@ -8,4 +8,4 @@ $popup.modal("show"); }); }); -</script> \ No newline at end of file +</script> diff --git a/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html b/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html index cd699a598401ff3848aa79ade6099795e5574dc3..98901d30ac7a7dbfcdf551f5905c2b112ace3d8d 100644 --- a/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html +++ b/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html @@ -10,7 +10,4 @@ <th>Sensitivity</th> <th>Conditions</th> <th>Diagnostic plots</th> - <th>Summary parset</th> - <th>Summary logs</th> - <th>Summary hf5</th> </tr> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html b/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html index 2328da1a792cdc2525614ce06c3a190b5af6a88d..f2606a3c328088c3d88c978de33e47d9fb3e93e6 100644 --- a/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html +++ b/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html @@ -10,11 +10,11 @@ <tr> <a href="{% url 'task-multi-hold' 'hold' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-pause"></i> hold</a> <a href="{% url 'task-multi-hold' 'resume' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-play"></i> start</a> - <a href="{% url 'task-multi-setstatus' 'defined' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> defined</a> <a href="{% url 'task-multi-setstatus' 'staged' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> staged</a> <a href="{% url 'task-multi-setstatus' 'processed' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> processed</a> <a href="{% url 'task-multi-setstatus' 'validated' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> validated</a> + <a href="{% url 'task-multi-setstatus' 'stored' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> stored</a> <a href="{% url 'task-multi-setstatus' 'scrubbed' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> scrubbed</a> <a href="{% url 'task-multi-setstatus' 'archived' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> archived</a> <a href="{% url 'task-multi-setstatus' 'finished' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> finished</a> diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks.html b/atdb/taskdatabase/templates/taskdatabase/tasks.html index 2ecdfa5d4b488d558ee151f9325f5abedacfdf3c..6aacb705d5498377b213dfa4d2707d59e50be156 100644 --- a/atdb/taskdatabase/templates/taskdatabase/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/tasks.html @@ -72,9 +72,11 @@ <a href="{% url 'task-setstatus-view' task.pk 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> validate</a> {% endif %} {% endif %} - </td> - </tr> + {% include "taskdatabase/failures/retry_buttons.html" %} + + </td> + </tr> </div> {% endif %} {% endfor %} diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/annotate_quality.html b/atdb/taskdatabase/templates/taskdatabase/validation/annotate_quality.html new file mode 100644 index 0000000000000000000000000000000000000000..dd0fc8cb4787be3fdca4c936a58fc364e10bafc1 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/validation/annotate_quality.html @@ -0,0 +1,27 @@ + +{% block myBlock %} +<div class="container-fluid details-container"> + + + <div class="card"> + <div class="card-body"> + <h4>Quality Annotation</h4> + + <form class="post-form" action="{% url 'annotate-quality' task.id %}" method="POST"> + {% csrf_token %} + <div> + {{ form }} + </div> + <div><button class="btn btn-success btn-sm" type="submit"><i class="fas fa-check"></i> OK</button> + <a href="{% url 'validation' %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-times-circle"></i> Cancel</a>  + </div> + </form> + + </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 0485f26a8fca50c9da59b1d01d0052fa5a98341f..cf376f175f9a108e8819be7b76137058b6dd02d3 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html @@ -35,8 +35,8 @@ <td>{{value}}</td> {% endfor %} <td> - <a href="https://ganglia.grid.surfsara.nl/dcache.php?vo=Lofar&r=day" - class="btn btn-info btn-sm" role="button" target="_blank"><img src="{% static 'taskdatabase/surfsara.jpg' %}" height="20" alt=""></a> + <a href="" + class="btn btn-primary btn-sm" role="button" target="_blank"><img src="{% static 'taskdatabase/surfsara.jpg' %}" height="20" alt="this is a placeholder, links to plots will follow"></a> </td> {% else %} <td>-</td><td>-</td><td>-</td><td>-</td> @@ -47,25 +47,23 @@ <td> {% if task.has_quality_remarks %} - <a class="open-modal btn btn-primary btn-sm" - href="{% url 'task-quality' task.id my_tasks.number %}" - data-popup-url="{% url 'task-quality' task.id my_tasks.number %}"> + <a class="open-modal btn btn-warning btn-sm" + href="{% url 'annotate-quality' task.id my_tasks.number %}" + data-popup-url="{% url 'annotate-quality' task.id my_tasks.number %}"> <i class="fas fa-pen-alt"></i> </a> {% else %} <a class="open-modal btn btn-secondary btn-sm" - href="{% url 'task-quality' task.id my_tasks.number %}" - data-popup-url="{% url 'task-quality' task.id my_tasks.number %}"> + href="{% url 'annotate-quality' task.id my_tasks.number %}" + data-popup-url="{% url 'annotate-quality' task.id my_tasks.number %}"> <i class="fas fa-pen-alt"></i> </a> {% endif %} </td> <td> - <a href="{% url 'task-validate-view' task.pk 'poor' 'validated' my_tasks.number %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-check"></i> P</a> <a href="{% url 'task-validate-view' task.pk 'moderate' 'validated' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-check"></i> M</a> <a href="{% url 'task-validate-view' task.pk 'good' 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> G</a> - </td> </tr> @@ -75,4 +73,4 @@ {% endfor %} {% include "taskdatabase/modal/modal_script.html" %} -{% include "taskdatabase/modal/modal.html" %} \ No newline at end of file +{% include "taskdatabase/modal/modal_no_close.html" %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html index 88d6dc4743303e097b2c8b5718106d30b3bca970..fbb2435a07b3ef6f45d3bf679b965989b70ce0b4 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html @@ -26,6 +26,6 @@ <th>Conditions</th> <th>Plots</th> <th>Quality</th> - <th>Edit</th> + <th>Annotate</th> <th>Poor/Moderate/Good</th> </tr> \ No newline at end of file diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index fa5b2c7d4bb9a5e9e210c7e600b455cbde793a21..9d0a5aaa55a15fcbb52c3b10fbfd3bbbc041e1d1 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -21,8 +21,11 @@ urlpatterns = [ path('task_details/<int:id>/<page>', views.TaskDetails, name='task-details'), path('task_details/', views.TaskDetails, name='task-details'), - path('task_quality/<int:id>/<page>', views.TaskQuality, name='task-quality'), - path('task_quality/', views.TaskQuality, name='task-quality'), + path('task_quality/<int:id>/<page>', views.ShowTaskQuality, name='task-quality'), + path('task_quality/', views.ShowTaskQuality, name='task-quality'), + path('annotate_quality/<int:id>/<page>', views.AnnotateQuality, name='annotate-quality'), + path('annotate_quality/<int:id>', views.AnnotateQuality, name='annotate-quality'), + path('annotate_quality/', views.AnnotateQuality, name='annotate-quality'), 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 8e5a20249a268e2cd3fcf32b8a5da7275764b0c3..1008200196ecd1d671004b545fe0012e216b48fa 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -27,6 +27,7 @@ from rest_framework.request import Request from django.conf import settings from .models import Task, Status, Workflow, LogEntry, Configuration, Job, PostProcessingRule, Monitor, LatestMonitor from .tables import TaskTable +from .forms import QualityAnnotationForm from django.db.models import Q from .serializers import \ @@ -554,7 +555,7 @@ def TaskDetails(request, id=0, page=0): return render(request, "taskdatabase/tasks/task_details.html", {'task': task, 'logentries': logentries_html}) -def TaskQuality(request, id=0, page=0): +def ShowTaskQuality(request, id=0, page=0): try: task = Task.objects.get(id=id) @@ -579,6 +580,39 @@ def TaskQuality(request, id=0, page=0): return render(request, "taskdatabase/tasks/task_quality.html", {'task': task, 'quality': quality_html}) +def AnnotateQuality(request, id=0, page=0, new_remark=""): + + # store the current page on the session + # request.session['page'] = page + + # a POST means that the form is filled in and should be stored in the database + if request.method == "POST": + + form = QualityAnnotationForm(request.POST) + + if form.is_valid(): + task = Task.objects.get(id=id) + try: + task.remarks['quality'] = request.POST.get("annotation","") + except: + task.remarks = {} + task.remarks['quality'] = request.POST.get("annotation","") + + task.save() + return redirect('/atdb/validation?page='+request.POST.get("return_to_page",1)) + + else: + # a GET means that the form should be presented to be filled in + task = Task.objects.get(id=id) + try: + quality_remarks = task.remarks['quality'] + except: + quality_remarks = "" + + form = QualityAnnotationForm(initial={'annotation': quality_remarks, 'return_to_page': page}) + + return render(request, "taskdatabase/validation/annotate_quality.html", {'task': task, 'page': page, 'form':form}) + def ShowInputs(request, id): task = Task.objects.get(id=id) @@ -1062,7 +1096,7 @@ def TaskMultiStatus(request, new_status, query_params): current_query_params = convert_query_params_to_url(query_params) request.session['current_query_params'] = current_query_params - return render(request, "query/confirm_multi_change.html", {'new_value': new_status, 'count': count}) + return render(request, "taskdatabase/query/confirm_multi_change.html", {'new_value': new_status, 'count': count}) @login_required @@ -1086,7 +1120,7 @@ def TaskMultiHold(request, onhold, query_params): current_query_params = convert_query_params_to_url(query_params) request.session['current_query_params'] = current_query_params - return render(request, "query/confirm_multi_change.html", {'new_value': onhold, 'count': count}) + return render(request, "taskdatabase/query/confirm_multi_change.html", {'new_value': onhold, 'count': count}) # /atdb/get_size?status__in=defined,staged