diff --git a/atdb/atdb/static/taskdatabase/ATDB-LDV Workflow Diagram.png b/atdb/atdb/static/taskdatabase/ATDB-LDV Workflow Diagram.png index 9640689bf19cd81dd6a93813f02dbad2f433ce35..32eb9a99e93f9fc7f7310005c55f7f21e14c4540 100644 Binary files a/atdb/atdb/static/taskdatabase/ATDB-LDV Workflow Diagram.png and b/atdb/atdb/static/taskdatabase/ATDB-LDV Workflow Diagram.png differ diff --git a/atdb/docs/ATDB Context Diagram.png b/atdb/docs/ATDB Context Diagram.png deleted file mode 100644 index 624425c3f79d6c9b909c728e61b6e687d11a1615..0000000000000000000000000000000000000000 Binary files a/atdb/docs/ATDB Context Diagram.png and /dev/null differ diff --git a/atdb/docs/ATDB-LDV - Deployment Diagram.png b/atdb/docs/ATDB-LDV - Deployment Diagram.png index 88d60db1f98c2ccbc2b5be45ef5b2d4609e0c6d2..94370d9e9bffe85dee25c32c1f46632f28af68ac 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/docs/ATDB-LDV Workflow Diagram.png b/atdb/docs/ATDB-LDV Workflow Diagram.png index fc44c244a6f9910638a23d0ef3a5fb25551ad835..2ef5b467bffbb3b10197899e0bcbbf8ffa66c6dc 100644 Binary files a/atdb/docs/ATDB-LDV Workflow Diagram.png and b/atdb/docs/ATDB-LDV Workflow Diagram.png differ diff --git a/atdb/taskdatabase/migrations/0015_auto_20220401_1336.py b/atdb/taskdatabase/migrations/0015_auto_20220401_1336.py new file mode 100644 index 0000000000000000000000000000000000000000..905a12b7c65d076f6a7e6bacc8ac9def3c106686 --- /dev/null +++ b/atdb/taskdatabase/migrations/0015_auto_20220401_1336.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.4 on 2022-04-01 11:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('taskdatabase', '0014_task_environment'), + ] + + operations = [ + migrations.AddField( + model_name='task', + name='quality', + field=models.CharField(blank=True, max_length=10, null=True), + ), + migrations.AddField( + model_name='task', + name='remarks', + field=models.JSONField(blank=True, null=True), + ), + ] diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index 4d51bcf255c5254f11551fadcc2b305fb455b43c..ddf73715b57352e0cbf76e7b3d56b1d6df1cc359 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -22,13 +22,27 @@ def convert_quality_to_list_for_template(task): list = [] try: - list.append(str(task.quality['uv-coverage'])) - list.append(str(task.quality['sensitivity'])) - list.append(str(task.quality['observing-conditions'])) - list.append("(link)") - list.append("(link)") - list.append("(link)") - list.append("(link)") + list.append(str(task.quality_json['uv-coverage'])) + 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 + + return list + + +def convert_quality_to_shortlist_for_template(task): + list = [] + + try: + list.append(str(task.quality_json['uv-coverage'])) + list.append(str(task.quality_json['sensitivity'])) + list.append(str(task.quality_json['observing-conditions'])) except Exception as err: pass @@ -45,6 +59,7 @@ class Task(models.Model): environment = models.CharField(max_length=255, blank=True, null=True) new_status = models.CharField(max_length=50, default="defining", null=True) status = models.CharField(db_index=True, default="unknown", max_length=50,blank=True, null=True) + quality = models.CharField(max_length=10,blank=True, null=True) resume = models.BooleanField(verbose_name="Resume", default=True) creationTime = models.DateTimeField(verbose_name="CreationTime",default=datetime.utcnow, blank=True) @@ -59,7 +74,7 @@ class Task(models.Model): inputs = models.JSONField(null=True, blank=True) outputs = models.JSONField(null=True, blank=True) metrics = models.JSONField(null=True, blank=True) - + remarks = models.JSONField(null=True, blank=True) meta_scheduling = models.JSONField(null=True, blank=True) size_to_process = models.PositiveBigIntegerField(default=0, null=True, blank=True) @@ -90,20 +105,27 @@ class Task(models.Model): @property def has_quality(self): - # todo: check if there is a 'quality' structure in the 'task.outputs' + # todo: check if there is a 'quality' structure in the 'task.outputs'? try: - quality = self.outputs[0]['quality'] + quality = self.outputs['quality'] return True except: - return False + try: + quality = self.outputs[0]['quality'] + return True + except: + return False @property - def quality(self): - # todo: check if there is a 'quality' structure in the 'task.outputs' + def quality_json(self): + # todo: check if there is a 'quality' structure in the 'task.outputs'? try: - return self.outputs[0]['quality'] + return self.outputs['quality'] except: - return None + try: + return self.outputs[0]['quality'] + except: + return None @property def quality_as_list(self): @@ -113,6 +135,14 @@ class Task(models.Model): except: return None + @property + def quality_as_shortlist(self): + try: + q = convert_quality_to_shortlist_for_template(self) + return q + 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/serializers.py b/atdb/taskdatabase/serializers.py index 238477988d78718c97b40874b50ff9b9414be2f8..45bbd2823f400d25956676c681fc5fbaff4b5e61 100644 --- a/atdb/taskdatabase/serializers.py +++ b/atdb/taskdatabase/serializers.py @@ -42,8 +42,8 @@ class TaskWriteSerializer(serializers.ModelSerializer): 'project','sas_id','priority','purge_policy','resume', 'new_workflow_id','new_workflow_uri','workflow', 'stage_request_id', - 'status','new_status', - 'inputs','outputs','metrics','status_history', + 'status','new_status','quality', + 'inputs','outputs','metrics','status_history','remarks', 'size_to_process','size_processed','total_processing_time', 'log_entries','meta_scheduling','environment' ) @@ -97,7 +97,7 @@ class TaskReadSerializer(serializers.ModelSerializer): 'project','sas_id','priority','purge_policy','resume', 'workflow', 'stage_request_id', - 'status','new_status', + 'status','new_status','quality', 'inputs','outputs','metrics','status_history', 'size_to_process', 'size_processed', 'total_processing_time', 'log_entries','meta_scheduling','environment' @@ -128,7 +128,7 @@ class TaskReadSerializerFast(serializers.ModelSerializer): 'project','sas_id','priority','purge_policy','resume', 'workflow', 'stage_request_id', - 'status','new_status', + 'status','new_status','quality', 'inputs','outputs','metrics', 'size_to_process', 'size_processed', 'total_processing_time', diff --git a/atdb/taskdatabase/services/algorithms.py b/atdb/taskdatabase/services/algorithms.py index 60c8445f96d0c6f8e51eb0310385f45781c9dfc0..0016fef157a24d96f30930f6f352246ee5e29c53 100644 --- a/atdb/taskdatabase/services/algorithms.py +++ b/atdb/taskdatabase/services/algorithms.py @@ -117,13 +117,13 @@ def convert_quality_to_html(task): results += "<tr><td><b>ATDB Filter</b></td><td>" + str(task.filter) + "</td></tr>" results += "<tr><td><b>Input Type</b></td><td>" + "???" + "</td></tr>" results += "<tr><td><b>NrJobs (MSs)</b></td><td>" + "???" + "</td></tr>" - results += "<tr><td><b>QA uv-coverage</b></td><td>" + str(task.quality['uv-coverage']) + "</td></tr>" - results += "<tr><td><b>QA sensitivity</b></td><td>" + str(task.quality['sensitivity']) + "</td></tr>" - results += "<tr><td><b>QA observing-conditions</b></td><td>" + str(task.quality['observing-conditions']) + "</td></tr>" - results += "<tr><td><b>QA diagnostic plots</b></td><td>" + "(link)" + "</td></tr>" - results += "<tr><td><b>Workflow summary parset</b></td><td>" + "(link)" + "</td></tr>" - results += "<tr><td><b>Summary logs</b></td><td>" + "(link)" + "</td></tr>" - results += "<tr><td><b>QA summary.hf5</b></td><td>" + "(link)" + "</td></tr>" + results += "<tr><td><b>QA uv-coverage</b></td><td>" + str(task.quality_json['uv-coverage']) + "</td></tr>" + results += "<tr><td><b>QA sensitivity</b></td><td>" + str(task.quality_json['sensitivity']) + "</td></tr>" + results += "<tr><td><b>QA observing-conditions</b></td><td>" + str(task.quality_json['observing-conditions']) + "</td></tr>" + 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>" except Exception as err: results = "<tr><td>" + str(err) + "</td></tr>" diff --git a/atdb/taskdatabase/static/taskdatabase/ATDB-LDV Workflow Diagram.png b/atdb/taskdatabase/static/taskdatabase/ATDB-LDV Workflow Diagram.png index 9640689bf19cd81dd6a93813f02dbad2f433ce35..32eb9a99e93f9fc7f7310005c55f7f21e14c4540 100644 Binary files a/atdb/taskdatabase/static/taskdatabase/ATDB-LDV Workflow Diagram.png and b/atdb/taskdatabase/static/taskdatabase/ATDB-LDV Workflow Diagram.png differ diff --git a/atdb/taskdatabase/templates/taskdatabase/base.html b/atdb/taskdatabase/templates/taskdatabase/base.html index f16ec634befd882d8302cbd2e955e0c62bf2fa07..25e84e89d43eba11b909f17da0df436b233e6455 100644 --- a/atdb/taskdatabase/templates/taskdatabase/base.html +++ b/atdb/taskdatabase/templates/taskdatabase/base.html @@ -49,7 +49,6 @@ {% if user.is_authenticated %} <li><a class="nav-link" href="{% url 'task-details'%}">Task Details</a></li> - <li><a class="nav-link" href="{% url 'quality' %}">Quality</a></li> {% endif %} <li><a class="nav-link" href="{% url 'dashboard' 'active_nores_nofilter' %}">Dashboard</a></li> @@ -58,6 +57,11 @@ {% 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 'monitoring' %}">Monitoring</a></li> <li><a class="nav-link" href="{% url 'diagram' %}">Diagram</a></li> diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/failures_page.html b/atdb/taskdatabase/templates/taskdatabase/failures/failures_page.html new file mode 100644 index 0000000000000000000000000000000000000000..6f67507a5f61f7580aa9088f0217dec20ea09d5b --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/failures/failures_page.html @@ -0,0 +1,52 @@ +{% 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-8"> + <h3>Failures</h3> + These are all the tasks that failed. + Click 'Retry' to restart a specific step in the workflow. + <a class="nav-link" href="{% url 'diagram' %}">See workflow diagram</a> + <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/failures/tasks_failures_headers.html' %} + </thead> + <tbody> + {% include 'taskdatabase/failures/tasks_failures.html' %} + </tbody> + </table> + {% else %} + <p>No recent Tasks.</p> + {% endif %} + + </div> + </div> + {% include 'taskdatabase/pagination.html' %} + </div> + </div> + </div> + </div> +</div> + +{% include 'taskdatabase/localstorage_scripts.html' %} + + +{% endblock %} + diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html new file mode 100644 index 0000000000000000000000000000000000000000..796d6e526453ec0dacf15db6dbc9a6735d539c20 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html @@ -0,0 +1,46 @@ +{% 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 %} + </td> + + {% if task.resume %} + <td class="bigger">{{ task.status }}</td> + {% endif %} + {% if not task.resume %} + <td class="bigger">{{ task.status }} (holding)</td> + {% endif %} + + <td>{{ task.project }}</td> + <td>{{ task.sas_id }}</td> + + <td>{{ task.filter }} </td> + {% if task.status == "processed_failed" %} + <td> + <a href="{% url 'task-setstatus-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 %} + <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/failures/tasks_failures_headers.html b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures_headers.html new file mode 100644 index 0000000000000000000000000000000000000000..5bf48b688419c58da166d4d53495647c43c4726c --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures_headers.html @@ -0,0 +1,10 @@ +<tr> + <th>ID</th> + <th>Details</th> + + <th>Status</th> + <th>Project</th> + <th>SAS_ID</th> + <th>filter</th> + <th>Actions</th> +</tr> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index 096baa9294dcdeca33762e90bf41de489a39495a..0e2c23da9e97ddd297c95589df15a6642e7f2eb8 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 (8 mar 2021 - 17:00) + <p class="footer"> Version 1.0.0 (1 apr 2021 - 12:00) </div> diff --git a/atdb/taskdatabase/templates/taskdatabase/quality_page.html b/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html similarity index 80% rename from atdb/taskdatabase/templates/taskdatabase/quality_page.html rename to atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html index f837b06804ea32d38242d10b5d7b9f7c887b2743..6d3b8881cef4dc1a1a301f1dd9ad9e1609b3543c 100644 --- a/atdb/taskdatabase/templates/taskdatabase/quality_page.html +++ b/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html @@ -9,6 +9,8 @@ <div class="row"> <div class="col-8"> <h3>Quality Diagnostics</h3> + This overview shows the Quality Diagnostics of all the task that have this information. + <hr> </div> </div> <div class="row"> @@ -22,10 +24,10 @@ <table class="table table-striped table-bordered table-sm"> <thead> - {% include 'taskdatabase/tasks_quality_headers.html' %} + {% include 'taskdatabase/quality/tasks_quality_headers.html' %} </thead> <tbody> - {% include 'taskdatabase/tasks_quality.html' %} + {% include 'taskdatabase/quality/tasks_quality.html' %} </tbody> </table> {% else %} diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks_quality.html b/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality.html similarity index 100% rename from atdb/taskdatabase/templates/taskdatabase/tasks_quality.html rename to atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality.html diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks_quality_headers.html b/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html similarity index 100% rename from atdb/taskdatabase/templates/taskdatabase/tasks_quality_headers.html rename to atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html new file mode 100644 index 0000000000000000000000000000000000000000..e589a047527954e808536924de8af1ec615e0e1e --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html @@ -0,0 +1,55 @@ +{% 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> + {% 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 %} + {% endif %} + </td> + + <td>{{ task.project }}</td> + <td>{{ task.sas_id }}</td> + + <td>{{ task.filter }} </td> + + {% if task.has_quality %} + {% for value in task.quality_as_shortlist %} + <td>{{value}}</td> + {% endfor %} + {% else %} + <td>-</td><td>-</td><td>-</td> + {% endif %} + + <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> Poor</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> Moderate</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> Good</a> + + </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/validation/tasks_validation_headers.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html new file mode 100644 index 0000000000000000000000000000000000000000..bb346737bf9c7a53182045cb295e7ce74b87df17 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html @@ -0,0 +1,12 @@ +<tr> + <th>ID</th> + <th>Details</th> + + <th>Project</th> + <th>SAS_ID</th> + <th>filter</th> + <th>uv-coverage</th> + <th>Sensitivity</th> + <th>Conditions</th> + <th>Choose a Quality</th> +</tr> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html b/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html new file mode 100644 index 0000000000000000000000000000000000000000..ad60380d51bacdc879330f0e43bf1f68582ee9ea --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html @@ -0,0 +1,53 @@ +{% 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-8"> + <h3>Validation</h3> + These are the tasks in status 'stored' that can be validated. Click one of the quality buttons to validate. + <td> + {% include 'taskdatabase/filter/search.html' %} + </td> + <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/validation/tasks_validation_headers.html' %} + </thead> + <tbody> + {% include 'taskdatabase/validation/tasks_validation.html' %} + </tbody> + </table> + {% else %} + <p>No recent Tasks.</p> + {% endif %} + + </div> + </div> + {% include 'taskdatabase/pagination.html' %} + </div> + </div> + </div> + </div> +</div> + +{% include 'taskdatabase/localstorage_scripts.html' %} + + +{% endblock %} + diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index 622bf459fedf36af6799beaa441c93d340fcdebd..ad825a43387d0a773a0659b8a3691ee5c5a266ac 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -16,6 +16,8 @@ urlpatterns = [ path('', views.IndexView.as_view(), name='index'), path('postprocessing-tasks', views.PostProcessingTasksView.as_view(), name='postprocessing-tasks'), 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('task_details/<int:id>/<page>', views.TaskDetails, name='task-details'), path('task_details/', views.TaskDetails, name='task-details'), @@ -79,6 +81,8 @@ urlpatterns = [ path('tasks/<int:pk>/setstatus/<new_status>/<page>', views.TaskSetStatus, name='task-setstatus-view'), path('tasks/<int:pk>/setstatus/<new_status>', views.TaskSetStatus, name='task-details-setstatus'), + path('tasks/<int:pk>/validate/<quality>/<new_status>/<page>', views.TaskValidate, name='task-validate-view'), + path('tasks/<int:pk>/change_priority/<priority_change>/<page>', views.ChangePriority, name='task-change-priority'), path('tasks/<int:pk>/change_priority/<priority_change>', views.ChangePriority, name='task-change-priority'), path('tasks/sort-tasks/<sort>', views.SortTasks, name='sort-tasks'), diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index 37456f44e39dfc305fb18cfb8cf17d593cca9d53..f3ccb8cafb601b5121f12cbe912f543e23941fbe 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -327,16 +327,16 @@ class PostProcessingTasksView(ListView): class ShowQualityPage(ListView): """ - This is the main view of ATDB. It shows a pagination list of tasks, sorted by creationTime. + 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_page.html' + template_name = 'taskdatabase/quality/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. context_object_name = 'my_tasks' def get_queryset(self): - status = self.request.GET.get('status') search_box = self.request.GET.get('search_box', None) # get the sort variable from the session or use default @@ -359,9 +359,68 @@ class ShowQualityPage(ListView): tasks = get_searched_tasks(search_box, sort) # exclude the tasks without quality information - tasks = tasks.exclude(outputs__isnull=True) - tasks = tasks.exclude(outputs__0__quality__isnull=True) + #tasks = tasks.exclude(outputs__isnull=True) + tasks = tasks.exclude(outputs__quality__isnull=True) + #tasks = tasks.exclude(outputs__0__quality__isnull=True) + + 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 + + +class ShowValidationPage(ListView): + """ + This shows the tasks that are ready for validation + Not that the global filter is also applied + """ + template_name = 'taskdatabase/validation/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. + context_object_name = 'my_tasks' + + def get_queryset(self): + search_box = self.request.GET.get('search_box', None) + + # get the sort variable from the session or use default + try: + sort = self.request.session['sort'] + except: + sort = '-creationTime' + + tasks = Task.objects.filter(status__icontains='stored').order_by(sort) + + # check if there is a 'task_filter' put on the session + try: + filter = self.request.session['task_filter'] + if filter != 'all': + tasks = get_searched_tasks(filter, sort) + except: + pass + + if (search_box is not None): + tasks = get_searched_tasks(search_box, sort) + + # exclude the tasks without quality information + tasks = tasks.exclude(status__icontains="failed") paginator = Paginator(tasks, config.TASKS_PER_PAGE) # Show 50 tasks per page page = self.request.GET.get('page') @@ -386,6 +445,64 @@ class ShowQualityPage(ListView): return tasks +class ShowFailuresPage(ListView): + """ + This shows the tasks that are ready for validation + Not that the global filter is also applied + """ + template_name = 'taskdatabase/failures/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. + context_object_name = 'my_tasks' + + def get_queryset(self): + status = self.request.GET.get('status') + search_box = self.request.GET.get('search_box', None) + + # get the sort variable from the session or use default + try: + sort = self.request.session['sort'] + except: + sort = '-creationTime' + + tasks = Task.objects.filter(status__icontains='failed').order_by(sort) + + # check if there is a 'task_filter' put on the session + try: + filter = self.request.session['task_filter'] + if filter != 'all': + tasks = get_searched_tasks(filter, sort) + except: + pass + + if (search_box is not None): + tasks = get_searched_tasks(search_box, sort) + + 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 + + + def get_searched_tasks(search, sort): tasks = Task.objects.filter( Q(id__contains=search) | @@ -790,6 +907,25 @@ def TaskSetStatus(request, pk, new_status, page=0): return redirect('/atdb/?page=' + page) +@login_required +def TaskValidate(request, pk, quality, new_status, page=0): + model = Task + task = Task.objects.get(pk=pk) + task.new_status = new_status + + #todo: database change + #task.quality = quality + + task.save() + + if page == 0: + # redirect to details screen + return redirect('/atdb/validation') + else: + # redirect to tasks list + return redirect('/atdb/validation?page=' + page) + + # set a filter value in the session, used later by the 'get_searched_tasks' mechanism def TaskSetFilter(request, filter): request.session['task_filter'] = filter