From cfbc50b1a33768f57dba6647ee21a39ade079529 Mon Sep 17 00:00:00 2001
From: Vermaas <vermaas@astron.nl>
Date: Mon, 8 May 2023 13:12:00 +0200
Subject: [PATCH] add discard functionality from filter page

---
 atdb/atdb/static/taskdatabase/style.css       | 11 +++-
 .../static/taskdatabase/style.css             | 11 +++-
 atdb/taskdatabase/tables.py                   |  2 +-
 .../discarded/clear_filter_button.html        |  1 +
 .../taskdatabase/discarded/page.html          |  8 ++-
 .../templates/taskdatabase/index.html         |  2 +-
 .../taskdatabase/quality/filter_buttons.html  | 26 +++++-----
 .../taskdatabase/query/confirm_discard.html   | 31 +++++++++++
 .../query/set_multi_status_panel.html         |  2 +-
 atdb/taskdatabase/urls.py                     |  3 --
 atdb/taskdatabase/views.py                    | 51 +++++++++++--------
 11 files changed, 104 insertions(+), 44 deletions(-)
 create mode 100644 atdb/taskdatabase/templates/taskdatabase/discarded/clear_filter_button.html
 create mode 100644 atdb/taskdatabase/templates/taskdatabase/query/confirm_discard.html

diff --git a/atdb/atdb/static/taskdatabase/style.css b/atdb/atdb/static/taskdatabase/style.css
index b927c966..e3b90a87 100644
--- a/atdb/atdb/static/taskdatabase/style.css
+++ b/atdb/atdb/static/taskdatabase/style.css
@@ -49,7 +49,7 @@ TD {
  font-weight: bold;
 }
 
-.scrubbed, {
+.scrubbed {
   color: darkgray;
   font-style: italic;
 }
@@ -141,4 +141,11 @@ p.title {
 .poor {
  color: red;
  font-weight: bold;
-}
\ No newline at end of file
+}
+
+#search_box
+{
+    color: darkblue;
+  display: inline-block;
+  vertical-align: middle;
+}
diff --git a/atdb/taskdatabase/static/taskdatabase/style.css b/atdb/taskdatabase/static/taskdatabase/style.css
index b927c966..e3b90a87 100644
--- a/atdb/taskdatabase/static/taskdatabase/style.css
+++ b/atdb/taskdatabase/static/taskdatabase/style.css
@@ -49,7 +49,7 @@ TD {
  font-weight: bold;
 }
 
-.scrubbed, {
+.scrubbed {
   color: darkgray;
   font-style: italic;
 }
@@ -141,4 +141,11 @@ p.title {
 .poor {
  color: red;
  font-weight: bold;
-}
\ No newline at end of file
+}
+
+#search_box
+{
+    color: darkblue;
+  display: inline-block;
+  vertical-align: middle;
+}
diff --git a/atdb/taskdatabase/tables.py b/atdb/taskdatabase/tables.py
index 8390b260..b8ad9471 100644
--- a/atdb/taskdatabase/tables.py
+++ b/atdb/taskdatabase/tables.py
@@ -25,7 +25,7 @@ class TaskTable(tables.Table):
     class Meta:
         model = Task
         template_name = "django_tables2/bootstrap4.html"
-        fields = ("id", "workflow","filter","priority","status","quality","project","sas_id","resume","actions","buttons")
+        fields = ("id", "workflow.id","filter","priority","status","quality","project","sas_id","resume","actions","buttons")
 
     # columns that need specific rendering
     status = StatusColumn()
diff --git a/atdb/taskdatabase/templates/taskdatabase/discarded/clear_filter_button.html b/atdb/taskdatabase/templates/taskdatabase/discarded/clear_filter_button.html
new file mode 100644
index 00000000..9e843a84
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/discarded/clear_filter_button.html
@@ -0,0 +1 @@
+<a href="{% url 'clear-filter' 'discarded' %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-window-close"></i> Clear Filter</a>
diff --git a/atdb/taskdatabase/templates/taskdatabase/discarded/page.html b/atdb/taskdatabase/templates/taskdatabase/discarded/page.html
index 79fbe26f..66a827c7 100644
--- a/atdb/taskdatabase/templates/taskdatabase/discarded/page.html
+++ b/atdb/taskdatabase/templates/taskdatabase/discarded/page.html
@@ -10,7 +10,13 @@
             <div class="col-8">
                 <h3>Discarded</h3>
                 These the discarded tasks, invisible in the rest of ATDB.
-                <td>{% include 'taskdatabase/filter/search.html' %}</td>
+                <hr>
+                <table>
+                    <tr>
+                        <td>{% include "taskdatabase/discarded/clear_filter_button.html" %}</td>
+                        <td>{% include 'taskdatabase/filter/search.html' %}</td>
+                    </tr>
+                </table>
                 <hr>
             </div>
         </div>
diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html
index 7a55509e..6b73f0d8 100644
--- a/atdb/taskdatabase/templates/taskdatabase/index.html
+++ b/atdb/taskdatabase/templates/taskdatabase/index.html
@@ -31,7 +31,7 @@
             {% include 'taskdatabase/pagination.html' %}
         </div>
     </div>
-    <p class="footer"> Version 4 May 2023
+    <p class="footer"> Version 8 May 2023
 </div>
 
 {% include 'taskdatabase/refresh.html' %}
diff --git a/atdb/taskdatabase/templates/taskdatabase/quality/filter_buttons.html b/atdb/taskdatabase/templates/taskdatabase/quality/filter_buttons.html
index 31c387bd..106a5044 100644
--- a/atdb/taskdatabase/templates/taskdatabase/quality/filter_buttons.html
+++ b/atdb/taskdatabase/templates/taskdatabase/quality/filter_buttons.html
@@ -16,19 +16,19 @@
              <tr>
                <td>
                    {% include "taskdatabase/quality/clear_filter_button.html" %}
-                <a href="{% url 'task-set-filter' 'failed' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-layer-group"></i> Failed</a>
-                 <a href="{% url 'task-set-onhold-filter' True 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-layer-group"></i> On Hold</a>
-
-                <a href="{% url 'task-set-filter' 'processed' 'quality' %}" class="btn btn-secondary btn-sm" role="button">processed</a>
-                <a href="{% url 'task-set-filter' 'storing' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i>storing</i></a>
-                <a href="{% url 'task-set-filter' 'stored' 'quality' %}" class="btn btn-secondary btn-sm" role="button">stored</a>
-                <a href="{% url 'task-set-filter' 'validated' 'quality' %}" class="btn btn-secondary btn-sm" role="button">validated</a>
-                <a href="{% url 'task-set-filter' 'scrubbing' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i>scrubbing</i></a>
-                <a href="{% url 'task-set-filter' 'scrubbed' 'quality' %}" class="btn btn-secondary btn-sm" role="button">scrubbed</a>
-                <a href="{% url 'task-set-filter' 'archiving' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i>archiving</i></a>
-                <a href="{% url 'task-set-filter' 'archived' 'quality' %}" class="btn btn-secondary btn-sm" role="button">archived</a>
-                <a href="{% url 'task-set-filter' 'finished' 'quality' %}" class="btn btn-secondary btn-sm" role="button">finished</a>
-                <a href="{% url 'task-set-filter' 'suspended' 'quality' %}" class="btn btn-secondary btn-sm" role="button">suspended</a>
+                    <a href="{% url 'task-set-filter' 'failed' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-layer-group"></i> Failed</a>
+                    <a href="{% url 'task-set-onhold-filter' True 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-layer-group"></i> On Hold</a>
+
+                    <a href="{% url 'task-set-filter' 'processed' 'quality' %}" class="btn btn-secondary btn-sm" role="button">processed</a>
+                    <a href="{% url 'task-set-filter' 'storing' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i>storing</i></a>
+                    <a href="{% url 'task-set-filter' 'stored' 'quality' %}" class="btn btn-secondary btn-sm" role="button">stored</a>
+                    <a href="{% url 'task-set-filter' 'validated' 'quality' %}" class="btn btn-secondary btn-sm" role="button">validated</a>
+                    <a href="{% url 'task-set-filter' 'scrubbing' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i>scrubbing</i></a>
+                    <a href="{% url 'task-set-filter' 'scrubbed' 'quality' %}" class="btn btn-secondary btn-sm" role="button">scrubbed</a>
+                    <a href="{% url 'task-set-filter' 'archiving' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i>archiving</i></a>
+                    <a href="{% url 'task-set-filter' 'archived' 'quality' %}" class="btn btn-secondary btn-sm" role="button">archived</a>
+                    <a href="{% url 'task-set-filter' 'finished' 'quality' %}" class="btn btn-secondary btn-sm" role="button">finished</a>
+                    <a href="{% url 'task-set-filter' 'suspended' 'quality' %}" class="btn btn-secondary btn-sm" role="button">suspended</a>
 
                </td>
                  <td>
diff --git a/atdb/taskdatabase/templates/taskdatabase/query/confirm_discard.html b/atdb/taskdatabase/templates/taskdatabase/query/confirm_discard.html
new file mode 100644
index 00000000..a0381cce
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/query/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="./{{ new_value }}" method="POST">{% csrf_token %}
+                <div class="text-center">
+
+                <h5> Are you sure you want to discard ({{ count }}) tasks ?</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 'query' %}" 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/query/set_multi_status_panel.html b/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html
index c84b4981..d0110b2f 100644
--- a/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html
+++ b/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html
@@ -20,7 +20,7 @@
                      <a href="{% url 'task-multi-setstatus' 'archived' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> archived</a>&nbsp;
                      <a href="{% url 'task-multi-setstatus' 'finished' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> finished</a>&nbsp;
                      <a href="{% url 'task-multi-setstatus' 'suspended' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> suspended</a>&nbsp;
-
+                     <a href="{% url 'task-multi-setstatus' 'discarded' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-trash-alt"></i> discard</a>
                     </tr>
                  </table>
                  {% endif %}
diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py
index 102fe1aa..faeda24a 100644
--- a/atdb/taskdatabase/urls.py
+++ b/atdb/taskdatabase/urls.py
@@ -115,8 +115,5 @@ urlpatterns = [
     path('tasks/<int:pk>/hold/<hold_it>/<page>', views.Hold, name='task-hold-resume'),
     path('tasks/<int:pk>/hold/<hold_it>', views.Hold, name='task-hold-resume'),
     path('tasks/<int:pk>/query-hold/<hold_it>/<query_params>', views.HoldQuery, name='query-hold-resume'),
-
     path('tasks/<int:pk>/hold/<hold_it>/<page>', views.Hold, name='service-hold-resume'),
-
-    path('hello/', views.HelloView.as_view(), name='hello'),
 ]
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index b652df00..43041f1a 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -1109,9 +1109,6 @@ def TaskDiscard(request, pk, new_status, page=0):
     if request.method == "POST":
         form = DiscardAnnotationForm(request.POST)
 
-        # set the cleanup_policy, which states what the cleanup service should do with it.
-        task.cleanup_policy = task.status
-
         if form.is_valid():
             try:
                 task.remarks['discard_reason'] = request.POST.get("annotation", "")
@@ -1119,6 +1116,10 @@ def TaskDiscard(request, pk, new_status, page=0):
                 task.remarks = {}
                 task.remarks['discard_reason'] = request.POST.get("annotation", "")
 
+        # currently, the cleanup_policy is set to the old status.
+        # That will tell the cleanup service what to do with it.
+        task.cleanup_policy = task.status
+
         # set the status to discard and save it
         task.new_status = new_status
         task.save()
@@ -1228,6 +1229,8 @@ def TaskClearFilter(request, redirect_to_page):
         return redirect('quality')
     if redirect_to_page == 'query':
         return redirect('query')
+    if redirect_to_page == 'discarded':
+        return redirect('discarded')
     return redirect_with_params('index', '?page=1')
 
 
@@ -1280,7 +1283,6 @@ def convert_query_params_to_url(query_params):
     params = ""
     for key in d:
         params = params + "&" + key + "=" + d[key]
-        print(params)
 
     return params
 
@@ -1304,21 +1306,40 @@ def TaskMultiStatus(request, new_status, query_params):
     count = len(filtered_tasks_as_list)
 
     if request.method == "POST":
+        form = DiscardAnnotationForm(request.POST)
 
         for id in filtered_tasks_as_list:
             task = Task.objects.get(id=id)
+
+            # setting status to discard or discarded uses a different form
+            if 'discard' in new_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", "")
+
+            # currently, the cleanup_policy is set to the old status.
+            # That will tell the cleanup service what to do with it.
+            task.cleanup_policy = task.status
             task.new_status = new_status
             task.save()
 
         current_query_params = request.session['current_query_params']
         return redirect_with_params('query', '?' + current_query_params)
 
-    # add the current query parameters to the session so that they survive
-    # the request/response to the confirmation page (which has other query parameters)
-    current_query_params = convert_query_params_to_url(query_params)
-    request.session['current_query_params'] = current_query_params
-
-    return render(request, "taskdatabase/query/confirm_multi_change.html", {'new_value': new_status, 'count': count})
+    else:
+        # add the current query parameters to the session so that they survive
+        # the request/response to the confirmation page (which has other query parameters)
+        current_query_params = convert_query_params_to_url(query_params)
+        request.session['current_query_params'] = current_query_params
+
+        if 'discard' in new_status:
+            my_form = DiscardAnnotationForm(initial={'annotation': '', 'return_to_page': 0})
+            return render(request, "taskdatabase/query/confirm_discard.html", {'my_form': my_form, 'new_value': new_status,'count': count})
+        else:
+            return render(request, "taskdatabase/query/confirm_multi_change.html", {'new_value': new_status, 'count': count})
 
 
 @login_required
@@ -1427,13 +1448,3 @@ class GetUniqueValuesForKey(generics.ListAPIView):
             })
 
 
-# 4 mar 2022
-# this is a test class to test token authentication
-# can be removed if it all also works in production
-class HelloView(APIView):
-    permission_classes = (IsAuthenticated,)
-    queryset = Task.objects.all()
-
-    def get(self, request):
-        content = {'message': 'Hello, World!'}
-        return Response(content)
-- 
GitLab