diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index 4d51bcf255c5254f11551fadcc2b305fb455b43c..607a9f36f9e8721caaae6fbf1585efd6c2c88f60 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -36,6 +36,20 @@ def convert_quality_to_list_for_template(task): return list +def convert_quality_to_shortlist_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'])) + + except Exception as err: + pass + + return list + + class Task(models.Model): # Task control properties @@ -92,18 +106,25 @@ class Task(models.Model): def has_quality(self): # 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' 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 +134,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/templates/taskdatabase/quality/quality_page.html b/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html index e8511c0ba6645f16b8a57d6bc6799dd31b06ba8d..6d3b8881cef4dc1a1a301f1dd9ad9e1609b3543c 100644 --- a/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html +++ b/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html @@ -9,7 +9,7 @@ <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'. + This overview shows the Quality Diagnostics of all the task that have this information. <hr> </div> </div> diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html index 75c461e2296df90e3092b03e3231195942ff4ff4..e589a047527954e808536924de8af1ec615e0e1e 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html @@ -15,29 +15,35 @@ 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> - {% 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.has_quality %} - {% for value in task.quality_as_list %} - <td>{{value}}</td> - {% endfor %} + {% 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> diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html index cd699a598401ff3848aa79ade6099795e5574dc3..bb346737bf9c7a53182045cb295e7ce74b87df17 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html @@ -2,15 +2,11 @@ <th>ID</th> <th>Details</th> - <th>Status</th> <th>Project</th> <th>SAS_ID</th> <th>filter</th> <th>uv-coverage</th> <th>Sensitivity</th> <th>Conditions</th> - <th>Diagnostic plots</th> - <th>Summary parset</th> - <th>Summary logs</th> - <th>Summary hf5</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 index 7382e4c58f9c29af36438efde0853c9e78758475..ad60380d51bacdc879330f0e43bf1f68582ee9ea 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html @@ -10,6 +10,9 @@ <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> diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index d69f7d87f110aa0a586ba61c09c4ace6016568c9..ad825a43387d0a773a0659b8a3691ee5c5a266ac 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -81,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 2597e4ee233dc793ce9efb63bf568033d6cbac12..e13381a8c5a33cbca9f9d53e511a7d2d1eee4531 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -337,7 +337,6 @@ class ShowQualityPage(ListView): 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 @@ -399,7 +398,6 @@ class ShowValidationPage(ListView): 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 @@ -408,7 +406,7 @@ class ShowValidationPage(ListView): except: sort = '-creationTime' - tasks = Task.objects.order_by(sort) + tasks = Task.objects.filter(status__icontains='stored').order_by(sort) # check if there is a 'task_filter' put on the session try: @@ -422,8 +420,8 @@ class ShowValidationPage(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(status__icontains="failed") + #tasks = tasks.exclude(outputs__0__quality__isnull=True) paginator = Paginator(tasks, config.TASKS_PER_PAGE) # Show 50 tasks per page @@ -916,6 +914,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