From 6c154d83bd3391e16c89b03e9a54b85146f418a5 Mon Sep 17 00:00:00 2001
From: Vermaas <vermaas@astron.nl>
Date: Thu, 4 May 2023 17:24:20 +0200
Subject: [PATCH] add discard button to validation screen also

---
 atdb/logs/atdb.log                            | 12 +++++
 .../taskdatabase/discarded/headers.html       |  2 +-
 .../taskdatabase/discarded/tasks.html         |  2 +-
 .../taskdatabase/failures/tasks.html          |  1 -
 .../validation/confirm_discard.html           | 31 +++++++++++++
 .../taskdatabase/validation/headers.html      |  1 +
 .../taskdatabase/validation/tasks.html        |  2 +-
 atdb/taskdatabase/urls.py                     |  1 +
 atdb/taskdatabase/views.py                    | 45 +++++++++++++++++++
 9 files changed, 93 insertions(+), 4 deletions(-)
 create mode 100644 atdb/taskdatabase/templates/taskdatabase/validation/confirm_discard.html

diff --git a/atdb/logs/atdb.log b/atdb/logs/atdb.log
index 87f2820e..06ea6317 100644
--- a/atdb/logs/atdb.log
+++ b/atdb/logs/atdb.log
@@ -42,3 +42,15 @@ logging[14/Apr/2023 14:17:24,827] unsupported operand type(s) for +=: 'NoneType'
 [01/May/2023 17:07:47,382] task 25485 - (regular) - 146233 has no plots, skipped.
 [01/May/2023 17:07:48,568] unsupported operand type(s) for &: 'bool' and 'str'
 [01/May/2023 17:07:48,569] task 25485 - (regular) - 146233 has no plots, skipped.
+[04/May/2023 14:35:18,946] 'NoneType' object is not subscriptable
+[04/May/2023 14:35:18,946] task 25378 - (regular) - 116876 has no plots, skipped.
+[04/May/2023 14:35:21,861] 'NoneType' object is not subscriptable
+[04/May/2023 14:35:21,861] task 25378 - (regular) - 116876 has no plots, skipped.
+[04/May/2023 14:35:52,010] 'NoneType' object is not subscriptable
+[04/May/2023 14:35:52,010] task 25378 - (regular) - 116876 has no plots, skipped.
+[04/May/2023 14:35:52,100] 'NoneType' object is not subscriptable
+[04/May/2023 14:35:52,100] task 25378 - (regular) - 116876 has no plots, skipped.
+[04/May/2023 14:35:52,193] 'NoneType' object is not subscriptable
+[04/May/2023 14:35:52,193] task 25378 - (regular) - 116876 has no plots, skipped.
+[04/May/2023 14:35:52,294] 'NoneType' object is not subscriptable
+[04/May/2023 14:35:52,294] task 25378 - (regular) - 116876 has no plots, skipped.
diff --git a/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html b/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html
index 765c5664..cb27d6cc 100644
--- a/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html
+++ b/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html
@@ -26,5 +26,5 @@
         <a href="{% url 'sort-tasks' 'filter' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a>
     </th>
     <th>Cleanup Policy</th>
-    <th>Remarks</th>
+    <th>Reason</th>
 </tr>
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html b/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html
index 7dce2839..ab93845b 100644
--- a/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html
+++ b/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html
@@ -37,7 +37,7 @@
 
                 <td>{{ task.filter }} </td>
                 <td>{{ task.cleanup_policy }} </td>
-                <td>{{ task.remarks }} </td>
+                <td>{{ task.remarks.discard_reason }} </td>
                 </tr>
             </div>
         {% endif %}
diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html b/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html
index 3d167b86..09c33c87 100644
--- a/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html
+++ b/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html
@@ -41,7 +41,6 @@
                 <td>
                     {% include "taskdatabase/failures/retry_buttons.html" %}
                     <a href="{% url 'task-discard-view' task.pk 'discarded' my_tasks.number %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-trash-alt"></i> Discard</a>
-
                 </td>
 
                 </tr>
diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/confirm_discard.html b/atdb/taskdatabase/templates/taskdatabase/validation/confirm_discard.html
new file mode 100644
index 00000000..add183b0
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/validation/confirm_discard.html
@@ -0,0 +1,31 @@
+{% extends 'taskdatabase/base.html' %}
+
+{% block myBlock %}
+<div class="container-fluid details-container">
+
+
+  <div class="card">
+       <div class="card-body">
+
+            <form action="./{{ page }}" method="POST">{% csrf_token %}
+                <div class="text-center">
+
+                <h5> Are you sure you want to discard all ({{ count }}) tasks with SAS_ID {{ sas_id }}?</h5>
+                    Enter a reason for discarding (optional)
+                    {% csrf_token %}
+
+                <div>
+                    {{ my_form }}
+                </div>
+
+                <p>
+                    <button class="btn btn-success btn-sm" type="submit"><i class="fas fa-check"></i> OK</button>
+                    <a href="{% url 'validation' %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-times-circle"></i> Cancel</a>&nbsp
+                </p>
+                </div>
+            </form>
+
+       </div>
+  </div>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/headers.html b/atdb/taskdatabase/templates/taskdatabase/validation/headers.html
index 7eba8921..9cd3a073 100644
--- a/atdb/taskdatabase/templates/taskdatabase/validation/headers.html
+++ b/atdb/taskdatabase/templates/taskdatabase/validation/headers.html
@@ -22,4 +22,5 @@
     <th>Annotate</th>
     <th>Quality</th>
     <th>Validate (choose a Q)</th>
+    <th>Discard</th>
 </tr>
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html
index d89f7fa7..28446485 100644
--- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html
+++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html
@@ -68,7 +68,7 @@
                 </td>
                 <td class="{{ task.quality }}">{{ task.quality|default_if_none:"-" }}</td>
                 <td>{% include "taskdatabase/validation/validation_buttons.html" %}</td>
-
+                <td><a href="{% url 'task-discard-view-sasid' task.pk 'discarded' my_tasks.number %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-trash-alt"></i></a></td>
             </tr>
         </div>
         {% endif %}
diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py
index 636b2f38..102fe1aa 100644
--- a/atdb/taskdatabase/urls.py
+++ b/atdb/taskdatabase/urls.py
@@ -98,6 +98,7 @@ urlpatterns = [
     path('tasks/<int:pk>/validate/<quality>/<new_status>/<page>', views.TaskValidate, name='task-validate-view'),
     path('tasks/<int:pk>/retry/<new_status>/<page>', views.TaskRetry, name='task-retry-view'),
     path('tasks/<int:pk>/discard/<new_status>/<page>', views.TaskDiscard, name='task-discard-view'),
+    path('tasks/<int:pk>/discard_sasid/<new_status>/<page>', views.TaskDiscardSasId, name='task-discard-view-sasid'),
 
     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'),
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index e07be8eb..4f687a9c 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -1129,6 +1129,51 @@ def TaskDiscard(request, pk, new_status, page=0):
     return render(request, "taskdatabase/failures/confirm_discard.html", {'task': task, 'page': page})
 
 
+
+def TaskDiscardSasId(request, pk, new_status, page=0):
+    # TODO: when the cleanup service in place,
+    # make a change in this line in failures\tasks.html. Change 'discard' into 'discarded'.
+    # <a href="{% url 'task-discard-view' task.pk 'discarded' my_tasks.number %}"
+
+    task = Task.objects.get(pk=pk)
+    sas_id = task.sas_id
+    tasks = Task.objects.filter(sas_id=sas_id)
+
+    if request.method == "POST":
+        form = QualityAnnotationForm(request.POST)
+
+        for task in tasks:
+            task.cleanup_policy = task.status
+
+            if form.is_valid():
+                try:
+                    task.remarks['discard_reason'] = request.POST.get("annotation", "")
+                except:
+                    task.remarks = {}
+                    task.remarks['discard_reason'] = request.POST.get("annotation", "")
+
+            task.new_status = new_status
+            task.save()
+
+        # return to the validation page
+        return redirect_with_params('validation', '?page=' + page)
+
+    else:
+        # a GET means that the form should be presented to be filled in
+        try:
+            discard_reason = task.remarks['discard_reason']
+        except:
+            discard_reason = ""
+
+        count=tasks.count()
+
+        my_form = QualityAnnotationForm(initial={'annotation': discard_reason, 'return_to_page': page})
+
+        # if not a POST, then render the confirmaton page, which will return to this function with a POST.
+        return render(request, "taskdatabase/validation/confirm_discard.html",
+                      {'task': task, 'my_form': my_form, 'page': page, 'sas_id': sas_id, 'count': count})
+
+
 # set a filter value in the session, used later by the 'get_searched_tasks' mechanism
 def TaskSetFilter(request, filter, redirect_to_page):
     request.session['task_filter'] = filter
-- 
GitLab