diff --git a/atdb/atdb/static/taskdatabase/style.css b/atdb/atdb/static/taskdatabase/style.css index 37d988b1e6c50054db44b60a3216a3b10a530bb9..abaa979356a70d6a40c5ffac12ca958ef50d26c4 100644 --- a/atdb/atdb/static/taskdatabase/style.css +++ b/atdb/atdb/static/taskdatabase/style.css @@ -34,7 +34,7 @@ TD { } -.error,.failed,.staging_failed,.processed_failed,.scrubbed_failed,.stored_failed,.archived_failed { +.error,.failed,.staging_failed,.staged_failed,.processed_failed,.scrubbed_failed,.stored_failed,.archived_failed { color: red; font-weight: bold; } diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index 6d78b2b92dff08a1f6d37b42fa2edfe8e3912a05..68aee451a091e32a1ead889cca0a901b19c18938 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -101,12 +101,13 @@ class Task(models.Model): @property def has_quality(self): - # todo: check if there is a 'quality' structure in the 'task.outputs'? + try: quality = self.outputs['quality'] return True except: return False + # todo: check if there is a 'quality' structure in the 'task.outputs' at another level? try: quality = self.outputs[0]['quality'] return True @@ -115,11 +116,13 @@ class Task(models.Model): @property def quality_json(self): - # todo: check if there is a 'quality' structure in the 'task.outputs'? + try: return self.outputs['quality'] except: return None + # todo: check if there is a 'quality' structure in the 'task.outputs' at another level? + try: return self.outputs[0]['quality'] except: diff --git a/atdb/taskdatabase/services/algorithms.py b/atdb/taskdatabase/services/algorithms.py index 69b58e5014466e92d5e186848d4eda41661d27e0..4ddf4499833ebcd74d06fcc3c096c1668f1f4526 100644 --- a/atdb/taskdatabase/services/algorithms.py +++ b/atdb/taskdatabase/services/algorithms.py @@ -8,7 +8,7 @@ from datetime import datetime, timedelta from django.db.models import Q, Sum import logging from .common import timeit -from ..models import Task, LogEntry, Workflow +from ..models import Task, LogEntry, Workflow, Configuration from django.conf import settings DATE_FORMAT = "%Y-%m-%d" @@ -660,5 +660,31 @@ def construct_dashboard_html(request, selection): def unique_values_for_aggregation_key(queryset, aggregation_key): + return list(map(lambda x: x[aggregation_key], queryset.values(aggregation_key).distinct())) - return list(map(lambda x: x[aggregation_key], queryset.values(aggregation_key).distinct())) \ No newline at end of file + +def construct_inspectionplots(task): + results = "" + quality_structure = task.quality_json + + # translate the path to a url + try: + srm_to_url = Configuration.objects.get(key='dcache:srm_to_url').value + except: + srm_to_url = "srm://srm.grid.sara.nl/pnfs/grid.sara.nl/data::https://webdav.grid.surfsara.nl/pnfs/grid.sara.nl/data" + + token = Configuration.objects.get(key='dcache:token').value + #token ="dcache-http-uuid=23f731bb-0ec4-4401-9176-3393cf2a3da1" + translation = srm_to_url.split("::") + + # find the plots in the quality json structure + plots = task.quality_json["plots"] + for plot in plots: + basename = plot['basename'] + surl = plot['surl'] + "?" + token + + url = surl.replace(translation[0],translation[1]) + results += '<tr><td><a href="' + url + '" target="_blank">'+ basename + '</a></td></tr>' + + + return results diff --git a/atdb/taskdatabase/static/taskdatabase/style.css b/atdb/taskdatabase/static/taskdatabase/style.css index 37d988b1e6c50054db44b60a3216a3b10a530bb9..abaa979356a70d6a40c5ffac12ca958ef50d26c4 100644 --- a/atdb/taskdatabase/static/taskdatabase/style.css +++ b/atdb/taskdatabase/static/taskdatabase/style.css @@ -34,7 +34,7 @@ TD { } -.error,.failed,.staging_failed,.processed_failed,.scrubbed_failed,.stored_failed,.archived_failed { +.error,.failed,.staging_failed,.staged_failed,.processed_failed,.scrubbed_failed,.stored_failed,.archived_failed { color: red; font-weight: bold; } diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index c0027a5ff9a23ea9058bc867f84a36e77f83a3fe..f64f8cbaeb13063920d1685cd313e85e28cf793d 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 (11 apr 2021 - 13:00) + <p class="footer"> Version 1.0.0 (12 apr 2021 - 8:00) </div> diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/inspection_plots.html b/atdb/taskdatabase/templates/taskdatabase/validation/inspection_plots.html new file mode 100644 index 0000000000000000000000000000000000000000..ec082788b377d234e71fcdd700865fe2bfee897e --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/validation/inspection_plots.html @@ -0,0 +1,20 @@ + +{% block myBlock %} +<div class="container-fluid details-container"> + + + <div class="card"> + <div class="card-body"> + <h4>Inspection Plots</h4> + <table class="table table-striped"> + {{ my_plots | 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 e04350d8d51b35f55fd1e54a2489184423790f23..f1baef81a9e02414afdefb66ff614bc7ec9caa74 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html @@ -35,9 +35,18 @@ <td>{{value}}</td> {% endfor %} <td> - <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> + <a class="btn btn-primary btn-sm" role="button" + href="{% url 'inspection-plots' task.id my_tasks.number %}" + target="_blank"> + <img src="{% static 'taskdatabase/surfsara.jpg' %}" height="20" alt="inspection plots"> + </a> + <a class="open-modal btn btn-secondary 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> </td> + {% else %} <td>-</td><td>-</td><td>-</td><td>-</td> {% endif %} diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index b59a75812adf8eb9ad8b8ae7c762cfeabf87db02..d950d86cf0e76e08b1188b68f26d42bc2d5bd722 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -26,6 +26,7 @@ urlpatterns = [ 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_inspectionplots/<int:id>/<page>', views.ShowInspectionPlots, name='inspection-plots'), 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 cc0bf873787d15c46d323cc99c65af79292080d0..654b8cd028f96c4d344d4015ddba8e2e1a01f3b0 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -609,6 +609,18 @@ def AnnotateQuality(request, id=0, page=0, new_remark=""): return render(request, "taskdatabase/validation/annotate_quality.html", {'task': task, 'page': page, 'form':form}) + +def ShowInspectionPlots(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 + plots_html = algorithms.construct_inspectionplots(task) + + return render(request, "taskdatabase/validation/inspection_plots.html", {'task': task, 'my_plots': plots_html}) + + def ShowInputs(request, id): task = Task.objects.get(id=id) @@ -857,7 +869,7 @@ class JobDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): serializer_class = JobSerializer -# example: /atdb/job/ +# example: /atdb/postprocessing/ class PostProcessingRuleListViewAPI(generics.ListCreateAPIView): model = PostProcessingRule queryset = PostProcessingRule.objects.all() @@ -867,7 +879,7 @@ class PostProcessingRuleListViewAPI(generics.ListCreateAPIView): filter_class = PostProcessingFilter -# example: /atdb/job/5/ +# example: /atdb/postprocessing/5/ class PostProcessingRuleDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): model = PostProcessingRule queryset = PostProcessingRule.objects.all()