From a156a919232bfd55267b86c276aefe6a267911e5 Mon Sep 17 00:00:00 2001 From: Nico Vermaas <vermaas@astron.nl> Date: Fri, 1 Apr 2022 12:10:27 +0200 Subject: [PATCH] Validation Page --- atdb/taskdatabase/models.py | 37 +++++++++++++++++-- .../taskdatabase/quality/quality_page.html | 2 +- .../validation/tasks_validation.html | 28 ++++++++------ .../validation/tasks_validation_headers.html | 6 +-- .../validation/validation_page.html | 3 ++ atdb/taskdatabase/urls.py | 2 + atdb/taskdatabase/views.py | 27 +++++++++++--- 7 files changed, 79 insertions(+), 26 deletions(-) diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index 4d51bcf2..607a9f36 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 e8511c0b..6d3b8881 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 75c461e2..e589a047 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 cd699a59..bb346737 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 7382e4c5..ad60380d 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 d69f7d87..ad825a43 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 2597e4ee..e13381a8 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 -- GitLab