diff --git a/atdb/docs/ATDB-LDV - Deployment Diagram.png b/atdb/docs/ATDB-LDV - Deployment Diagram.png index 28daea63de9b3d737f1f4b67f174d26bc705a4b3..fdd601825814d34169120960eb530ba8bc738693 100644 Binary files a/atdb/docs/ATDB-LDV - Deployment Diagram.png and b/atdb/docs/ATDB-LDV - Deployment Diagram.png differ diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index b2ca7d735725e4a671a3fcfaca7b7b668af1103e..c2abfdc2b7bb20cb41260db87bd8c19f79863591 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -4,6 +4,7 @@ from django.utils import timezone from django.utils.timezone import datetime, timedelta from django.conf import settings + import logging logger = logging.getLogger(__name__) @@ -215,6 +216,41 @@ class Task(models.Model): except: return None + @property + def sas_id_archived(self): + try: + # --- temporary hack, test data --- + return self.sas_id + # --------------------------------- + + return self.archive['sas_id_archived'] + + + + except: + return None + + def lta_object_id(self): + try: + return self.archive['lta_object_id'] + except: + return None + + def url_in_lta(self): + try: + lta_url = Configuration.objects.get(key='lta:url').value + url_in_lta = lta_url + "Lofar?project=ALL&mode=query_result_page" + + # --- temporary hack, test data --- + url_in_lta += "&product=PulsarPipeline&pipeline_object_id=ED0BBBFC49D81C3DE053164A17ACBF9C" + # --------------------------------- + + return url_in_lta + + 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 917f3dae2feca9cf42359795ef12fe3bf38eaaef..ff9b89965d2ba9098cfbed70a11379da947d0793 100644 --- a/atdb/taskdatabase/services/algorithms.py +++ b/atdb/taskdatabase/services/algorithms.py @@ -814,3 +814,4 @@ def construct_summary(task): results = title + totals + results return results + diff --git a/atdb/taskdatabase/templates/taskdatabase/archived/annotate_quality_taskid.html b/atdb/taskdatabase/templates/taskdatabase/archived/annotate_quality_taskid.html new file mode 100644 index 0000000000000000000000000000000000000000..23d0e3d6e076a8841b0b8c146b337dae15df78ee --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/archived/annotate_quality_taskid.html @@ -0,0 +1,27 @@ + +{% block myBlock %} +<div class="container-fluid details-container"> + + + <div class="card"> + <div class="card-body"> + <h4>Quality Annotation (per task)</h4> + + <form class="post-form" action="{% url 'annotate-quality-taskid' 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 'quality' %}" 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/archived/headers.html b/atdb/taskdatabase/templates/taskdatabase/archived/headers.html new file mode 100644 index 0000000000000000000000000000000000000000..d99d241256941bbdf8d35dd24783f7fd891a3d35 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/archived/headers.html @@ -0,0 +1,35 @@ +<tr> + <th> + <a href="{% url 'sort-tasks' '-pk' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + ID + <a href="{% url 'sort-tasks' 'id' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th>Details</th> + <th> + <a href="{% url 'sort-tasks' '-workflow' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Workflow + <a href="{% url 'sort-tasks' 'workflow' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-filter' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Filter + <a href="{% url 'sort-tasks' 'filter' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-project' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Project + <a href="{% url 'sort-tasks' 'project' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-sas_id' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + SAS_ID (input) + <a href="{% url 'sort-tasks' 'sas_id' 'archived' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + SAS_ID (output) + </th> + + + <th>Annotate</th> + +</tr> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/archived/page.html b/atdb/taskdatabase/templates/taskdatabase/archived/page.html new file mode 100644 index 0000000000000000000000000000000000000000..c35844359a0823b66ade7f04fdb46e6e14402408 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/archived/page.html @@ -0,0 +1,47 @@ +{% extends 'taskdatabase/base.html' %} +{% load static %} + +{% block myBlock %} + +<div class="container-fluid details-container"> + <div class="card"> + <div class="card-body"> + <div class="row"> + <div class="col-12"> + <h3>Archived</h3> + This overview shows the tasks that are archived in the LTA. + <hr> + </div> + </div> + <div class="row"> + <div class="col-sm-12 col-md-12 col-lg-12"> + {% include 'taskdatabase/pagination.html' %} + + {% if my_tasks %} + <div class="panel panel-success"> + <div class="panel-body"> + <table class="table table-striped table-bordered table-sm"> + <thead> + {% include 'taskdatabase/archived/headers.html' %} + </thead> + <tbody> + {% include 'taskdatabase/archived/tasks.html' %} + </tbody> + </table> + </div> + </div> + {% else %} + <p>No recent Tasks.</p> + {% endif %} + {% include 'taskdatabase/pagination.html' %} + </div> + </div> + </div> + </div> +</div> + +{% include 'taskdatabase/no_refresh.html' %} + + +{% endblock %} + diff --git a/atdb/taskdatabase/templates/taskdatabase/archived/tasks.html b/atdb/taskdatabase/templates/taskdatabase/archived/tasks.html new file mode 100644 index 0000000000000000000000000000000000000000..a865ec60de57a36dbda102d3a1f540fc62aeb8a0 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/archived/tasks.html @@ -0,0 +1,75 @@ +{% load static %} +{% for task in my_tasks %} + + {% if task.status != "removed_invisible" %} + <div class="row"> + <tr class="{{ task.status }}"> + + <td> + <a href="{{ task.get_absolute_url }}" target="_blank">{{ task.id }} </a> + </td> + <td> + {% if user.is_authenticated %} + <a class="btn btn-primary btn-sm" + href="{% url 'task-details' task.id my_tasks.number %}" + data-popup-url="{% url 'task-details' task.id my_tasks.number %}" + ><i class="fas fa-list"></i> Details + </a> + {% endif %} + {% if task.has_quality %} + <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 %}" + ><i class="fas fa-balance-scale-right"></i> Quality + </a> + {% endif %} + </td> + <td> + <a class="open-modal btn btn-primary btn-sm" + href="{% url 'workflow-details' task.workflow %}" + data-popup-url="{% url 'workflow-details' task.workflow %}" + target="_blank"><i class="fas fa-project-diagram"></i> {{ task.workflow }} + </a></td> + </td> + <td>{{ task.filter }} </td> + <td>{{ task.project }}</td> + + <td> + {{ task.sas_id }} + </td> + <td> + {% if task.sas_id_archived != None %} + <a href={{ task.url_in_lta }} target="_blank"> + <img src="{% static 'taskdatabase/ldvlogo_small.png' %}" height="20" alt="link to LTA"> + {{ task.sas_id }} + </a> + {% else %} + - + {% endif %} + </td> + + <td>{% if user.is_authenticated %} + {% if task.get_quality_remarks_taskid %} + <a class="open-modal btn btn-warning btn-sm" + href="{% url 'annotate-quality-taskid' task.id my_tasks.number %}" + data-popup-url="{% url 'annotate-quality-taskid' 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 'annotate-quality-taskid' task.id my_tasks.number %}" + data-popup-url="{% url 'annotate-quality-taskid' task.id my_tasks.number %}"> + <i class="fas fa-pen-alt"></i> + </a> + {% endif %} + {% endif %} + </td> + + </tr> + </div> + {% endif %} + +{% endfor %} + +{% include "taskdatabase/modal/modal_script.html" %} +{% include "taskdatabase/modal/modal.html" %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/base.html b/atdb/taskdatabase/templates/taskdatabase/base.html index a8b7f7a9209c78b10890a16567a637135c943318..384c0fd7bb0b3ec8abc7aeada1e07463a54ea59b 100644 --- a/atdb/taskdatabase/templates/taskdatabase/base.html +++ b/atdb/taskdatabase/templates/taskdatabase/base.html @@ -54,13 +54,11 @@ <li><a class="nav-link" href="{% url 'dashboard' 'active_nores_nofilter' %}">Dashboard</a></li> <li><a class="nav-link" href="{% url 'query' %}">Filter</a></li> -{% comment %} - <li><a class="nav-link" href="{% url 'query2' request|current_query_params %}">Filter2</a></li> -{% endcomment %} <li><a class="nav-link" href="{% url 'quality' %}">Quality</a></li> <li><a class="nav-link" href="{% url 'validation' %}">Validation</a></li> <li><a class="nav-link" href="{% url 'failures' %}">Failures</a></li> + <li><a class="nav-link" href="{% url 'archived' %}">Archived</a></li> <li><a class="nav-link" href="{% url 'monitoring' %}">Monitoring</a></li> diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures_headers.html b/atdb/taskdatabase/templates/taskdatabase/failures/headers.html similarity index 100% rename from atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures_headers.html rename to atdb/taskdatabase/templates/taskdatabase/failures/headers.html diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/failures_page.html b/atdb/taskdatabase/templates/taskdatabase/failures/page.html similarity index 89% rename from atdb/taskdatabase/templates/taskdatabase/failures/failures_page.html rename to atdb/taskdatabase/templates/taskdatabase/failures/page.html index 15d5493c8beb43cd12c41dc111fbe39298682160..274af27451e6a3435cfe071410f153f819ad8eab 100644 --- a/atdb/taskdatabase/templates/taskdatabase/failures/failures_page.html +++ b/atdb/taskdatabase/templates/taskdatabase/failures/page.html @@ -26,10 +26,10 @@ <table class="table table-striped table-bordered table-sm"> <thead> - {% include 'taskdatabase/failures/tasks_failures_headers.html' %} + {% include 'taskdatabase/failures/headers.html' %} </thead> <tbody> - {% include 'taskdatabase/failures/tasks_failures.html' %} + {% include 'taskdatabase/failures/tasks.html' %} </tbody> </table> {% else %} diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html b/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html similarity index 100% rename from atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html rename to atdb/taskdatabase/templates/taskdatabase/failures/tasks.html diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index b463486bf50b8396799d6d4b14508b14893fd602..dfb1d18c5636283831bffba8c417d7e62baa774f 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 10 Januari 2022 - 15:00 + <p class="footer"> Version 12 Januari 2022 - 7:00 </div> diff --git a/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html b/atdb/taskdatabase/templates/taskdatabase/quality/headers.html similarity index 100% rename from atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html rename to atdb/taskdatabase/templates/taskdatabase/quality/headers.html diff --git a/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html b/atdb/taskdatabase/templates/taskdatabase/quality/page.html similarity index 89% rename from atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html rename to atdb/taskdatabase/templates/taskdatabase/quality/page.html index 905758f44916d66ba2f3aeef73610b2b98d1393d..5e4f0216536f07c403fb7a51240e38165ee9b78e 100644 --- a/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html +++ b/atdb/taskdatabase/templates/taskdatabase/quality/page.html @@ -25,10 +25,10 @@ <table class="table table-striped table-bordered table-sm"> <thead> - {% include 'taskdatabase/quality/tasks_quality_headers.html' %} + {% include 'taskdatabase/quality/headers.html' %} </thead> <tbody> - {% include 'taskdatabase/quality/tasks_quality.html' %} + {% include 'taskdatabase/quality/tasks.html' %} </tbody> </table> {% else %} diff --git a/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality.html b/atdb/taskdatabase/templates/taskdatabase/quality/tasks.html similarity index 100% rename from atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality.html rename to atdb/taskdatabase/templates/taskdatabase/quality/tasks.html diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html b/atdb/taskdatabase/templates/taskdatabase/validation/headers.html similarity index 100% rename from atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html rename to atdb/taskdatabase/templates/taskdatabase/validation/headers.html diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html b/atdb/taskdatabase/templates/taskdatabase/validation/page.html similarity index 92% rename from atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html rename to atdb/taskdatabase/templates/taskdatabase/validation/page.html index c5af634cb13f22e91b6d93b1c837b8526d29dc99..b2434b97b96fefe312110eaa38d3dd2bb450985e 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/page.html @@ -29,10 +29,10 @@ <table class="table table-striped table-bordered table-sm"> <thead> - {% include 'taskdatabase/validation/tasks_validation_headers.html' %} + {% include 'taskdatabase/validation/headers.html' %} </thead> <tbody> - {% include 'taskdatabase/validation/tasks_validation.html' %} + {% include 'taskdatabase/validation/tasks.html' %} </tbody> </table> {% else %} diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html similarity index 100% rename from atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html rename to atdb/taskdatabase/templates/taskdatabase/validation/tasks.html diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index b5b585a5ab6439a49b68cc5a7288018f0a0b99ba..b980e73869bb2aa92e8d696054bf39763705df21 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -18,6 +18,7 @@ urlpatterns = [ path('quality', views.ShowQualityPage.as_view(), name='quality'), path('validation', views.ShowValidationPage.as_view(), name='validation'), path('failures', views.ShowFailuresPage.as_view(), name='failures'), + path('archived', views.ShowArchivedPage.as_view(), name='archived'), path('task_details/<int:id>/<page>', views.TaskDetails, name='task-details'), path('task_details/', views.TaskDetails, name='task-details'), diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index b15cce1dc1e3741941be271a21736c33bd964b4e..20e253bed44a685d05e5cbea35a05faefb3b3e47 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -287,7 +287,7 @@ class ShowQualityPage(ListView): This shows the tasks that have a quality statistics in its outputs[0]['quality']. Not that the global filter is also applied """ - template_name = 'taskdatabase/quality/quality_page.html' + template_name = 'taskdatabase/quality/page.html' # by default this returns the list in an object called object_list, so use 'object_list' in the html page. # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html. @@ -327,9 +327,9 @@ class ShowQualityPage(ListView): class ShowValidationPage(ListView): """ This shows the tasks that are ready for validation - Not that the global filter is also applied + Note that the global filter is also applied """ - template_name = 'taskdatabase/validation/validation_page.html' + template_name = 'taskdatabase/validation/page.html' # by default this returns the list in an object called object_list, so use 'object_list' in the html page. # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html. @@ -368,10 +368,10 @@ class ShowValidationPage(ListView): class ShowFailuresPage(ListView): """ - This shows the tasks that are ready for validation - Not that the global filter is also applied + This shows the tasks that are ready failed in one of the steps + Note that the global filter is also applied """ - template_name = 'taskdatabase/failures/failures_page.html' + template_name = 'taskdatabase/failures/page.html' # by default this returns the list in an object called object_list, so use 'object_list' in the html page. # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html. @@ -405,6 +405,45 @@ class ShowFailuresPage(ListView): return tasks +class ShowArchivedPage(ListView): + """ + This shows the tasks that are archived + Note that the global filter is also applied + """ + template_name = 'taskdatabase/archived/page.html' + + # by default this returns the list in an object called object_list, so use 'object_list' in the html page. + # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html. + context_object_name = 'my_tasks' + + def get_queryset(self): + + archived_tasks = Task.objects.filter(status__icontains='archived') + tasks = get_filtered_tasks(self.request, archived_tasks) + + paginator = Paginator(tasks, config.TASKS_PER_PAGE) # Show 50 tasks per page + page = self.request.GET.get('page') + + try: + # check if there was a page on the session, if so, use it. + if page == None: + page = self.request.session['page'] + self.request.session['page'] = None + except: + pass + + try: + tasks = paginator.page(page) + except PageNotAnInteger: + # If page is not an integer, deliver first page. + tasks = paginator.page(1) + except EmptyPage: + # If page is out of range (e.g. 9999), deliver last page of results. + tasks = paginator.page(paginator.num_pages) + + return tasks + + # this provides a broad range of filters for the search_box in the GUI def get_filtered_tasks(request, pre_filtered_tasks=None, distinct=None):