From c2fd1c1aebc3065dd5ec6fba8aa523a0395c22ac Mon Sep 17 00:00:00 2001
From: Nico Vermaas <vermaas@astron.nl>
Date: Fri, 22 Apr 2022 14:23:29 +0200
Subject: [PATCH] SDC-512 - improving filter mechanism

---
 .../filter/clear_filter_button.html           |   6 +-
 .../taskdatabase/filter/filter_buttons.html   |  49 ++--
 .../templates/taskdatabase/index.html         |   2 +-
 .../quality/clear_filter_button.html          |   5 +
 .../taskdatabase/quality/filter_buttons.html  |  49 ++++
 .../taskdatabase/quality/quality_page.html    |   2 +-
 .../query/clear_filter_button.html            |   5 +
 .../templates/taskdatabase/query/index.html   |   2 +-
 atdb/taskdatabase/urls.py                     |   9 +-
 atdb/taskdatabase/views.py                    | 221 +++++++-----------
 10 files changed, 181 insertions(+), 169 deletions(-)
 create mode 100644 atdb/taskdatabase/templates/taskdatabase/quality/clear_filter_button.html
 create mode 100644 atdb/taskdatabase/templates/taskdatabase/quality/filter_buttons.html
 create mode 100644 atdb/taskdatabase/templates/taskdatabase/query/clear_filter_button.html

diff --git a/atdb/taskdatabase/templates/taskdatabase/filter/clear_filter_button.html b/atdb/taskdatabase/templates/taskdatabase/filter/clear_filter_button.html
index bcbe5e9e..d1619aa7 100644
--- a/atdb/taskdatabase/templates/taskdatabase/filter/clear_filter_button.html
+++ b/atdb/taskdatabase/templates/taskdatabase/filter/clear_filter_button.html
@@ -1 +1,5 @@
-<a href="{% url 'clear-filter' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-window-close"></i> Clear Filter</a>
+{% if request.session.filtered == True %}
+   <a href="{% url 'clear-filter' 'index' %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-window-close"></i> Clear Filter</a>
+{% else %}
+   <a href="{% url 'clear-filter' 'index' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-window-close"></i> Clear Filter</a>
+{% endif %}
diff --git a/atdb/taskdatabase/templates/taskdatabase/filter/filter_buttons.html b/atdb/taskdatabase/templates/taskdatabase/filter/filter_buttons.html
index 0c20c676..3c811a82 100644
--- a/atdb/taskdatabase/templates/taskdatabase/filter/filter_buttons.html
+++ b/atdb/taskdatabase/templates/taskdatabase/filter/filter_buttons.html
@@ -3,29 +3,38 @@
         <div class="card">
          <div class="card-body">
            <table>
-             <tr><td>Click to Filter</td></tr>
+
+             <tr>
+
+                 {% if request.session.task_filter == "all" %}
+                    <td>Click to Filter</td>
+                 {% else %}
+                    <td>Click to Filter ({{request.session.task_filter}})</td>
+                 {% endif %}
+             </tr>
+
              <tr>
                <td>
                    {% include "taskdatabase/filter/clear_filter_button.html" %}
-                <a href="{% url 'task-set-active-filter' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-layer-group"></i> Active</a>
-                <a href="{% url 'task-set-filter' 'failed' %}" 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 %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-layer-group"></i> On Hold</a>
-
-                <a href="{% url 'task-set-filter' 'defined' %}" class="btn btn-secondary btn-sm" role="button">defined</a>
-                <a href="{% url 'task-set-filter' 'staging' %}" class="btn btn-secondary btn-sm" role="button"><i>staging</i></a>
-                <a href="{% url 'task-set-filter' 'staged' %}" class="btn btn-secondary btn-sm" role="button">staged</a>
-                <a href="{% url 'task-set-filter' 'fetching' %}" class="btn btn-secondary btn-sm" role="button"><i>fetching</i></a>
-                <a href="{% url 'task-set-filter' 'fetched' %}" class="btn btn-secondary btn-sm" role="button">fetched</a>
-                <a href="{% url 'task-set-filter' 'processing' %}" class="btn btn-secondary btn-sm" role="button"><i>processing</i></a>
-                <a href="{% url 'task-set-filter' 'processed' %}" class="btn btn-secondary btn-sm" role="button">processed</a>
-                <a href="{% url 'task-set-filter' 'storing' %}" class="btn btn-secondary btn-sm" role="button"><i>storing</i></a>
-                <a href="{% url 'task-set-filter' 'stored' %}" class="btn btn-secondary btn-sm" role="button">stored</a>
-                <a href="{% url 'task-set-filter' 'validated' %}" class="btn btn-secondary btn-sm" role="button">validated</a>
-                <a href="{% url 'task-set-filter' 'scrubbing' %}" class="btn btn-secondary btn-sm" role="button"><i>scrubbing</i></a>
-                <a href="{% url 'task-set-filter' 'scrubbed' %}" class="btn btn-secondary btn-sm" role="button">scrubbed</a>
-                <a href="{% url 'task-set-filter' 'archiving' %}" class="btn btn-secondary btn-sm" role="button"><i>archiving</i></a>
-                <a href="{% url 'task-set-filter' 'archived' %}" class="btn btn-secondary btn-sm" role="button">archived</a>
-                <a href="{% url 'task-set-filter' 'finished' %}" class="btn btn-secondary btn-sm" role="button">finished</a>
+                <a href="{% url 'task-set-active-filter' 'tasks' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-layer-group"></i> Active</a>
+                <a href="{% url 'task-set-filter' 'failed' 'tasks' %}" 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 'tasks' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-layer-group"></i> On Hold</a>
+
+                <a href="{% url 'task-set-filter' 'defined' 'tasks' %}" class="btn btn-secondary btn-sm" role="button">defined</a>
+                <a href="{% url 'task-set-filter' 'staging' 'tasks' %}" class="btn btn-secondary btn-sm" role="button"><i>staging</i></a>
+                <a href="{% url 'task-set-filter' 'staged' 'tasks' %}" class="btn btn-secondary btn-sm" role="button">staged</a>
+                <a href="{% url 'task-set-filter' 'fetching' 'tasks' %}" class="btn btn-secondary btn-sm" role="button"><i>fetching</i></a>
+                <a href="{% url 'task-set-filter' 'fetched' 'tasks' %}" class="btn btn-secondary btn-sm" role="button">fetched</a>
+                <a href="{% url 'task-set-filter' 'processing' 'tasks' %}" class="btn btn-secondary btn-sm" role="button"><i>processing</i></a>
+                <a href="{% url 'task-set-filter' 'processed' 'tasks' %}" class="btn btn-secondary btn-sm" role="button">processed</a>
+                <a href="{% url 'task-set-filter' 'storing' 'tasks' %}" class="btn btn-secondary btn-sm" role="button"><i>storing</i></a>
+                <a href="{% url 'task-set-filter' 'stored' 'tasks' %}" class="btn btn-secondary btn-sm" role="button">stored</a>
+                <a href="{% url 'task-set-filter' 'validated' 'tasks' %}" class="btn btn-secondary btn-sm" role="button">validated</a>
+                <a href="{% url 'task-set-filter' 'scrubbing' 'tasks' %}" class="btn btn-secondary btn-sm" role="button"><i>scrubbing</i></a>
+                <a href="{% url 'task-set-filter' 'scrubbed' 'tasks' %}" class="btn btn-secondary btn-sm" role="button">scrubbed</a>
+                <a href="{% url 'task-set-filter' 'archiving' 'tasks' %}" class="btn btn-secondary btn-sm" role="button"><i>archiving</i></a>
+                <a href="{% url 'task-set-filter' 'archived' 'tasks' %}" class="btn btn-secondary btn-sm" role="button">archived</a>
+                <a href="{% url 'task-set-filter' 'finished' 'tasks' %}" class="btn btn-secondary btn-sm" role="button">finished</a>
 
                </td>
                  <td>
diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html
index ea9b66c7..d8dd5264 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 (21 apr 2021 - 13:00)
+    <p class="footer"> Version 1.0.0 (22 apr 2021 - 14:00)
 
 </div>
 
diff --git a/atdb/taskdatabase/templates/taskdatabase/quality/clear_filter_button.html b/atdb/taskdatabase/templates/taskdatabase/quality/clear_filter_button.html
new file mode 100644
index 00000000..82490543
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/quality/clear_filter_button.html
@@ -0,0 +1,5 @@
+{% if request.session.filtered == True %}
+   <a href="{% url 'clear-filter' 'quality' %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-window-close"></i> Clear Filter</a>
+{% else %}
+   <a href="{% url 'clear-filter' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-window-close"></i> Clear Filter</a>
+{% endif %}
diff --git a/atdb/taskdatabase/templates/taskdatabase/quality/filter_buttons.html b/atdb/taskdatabase/templates/taskdatabase/quality/filter_buttons.html
new file mode 100644
index 00000000..67877b8d
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/quality/filter_buttons.html
@@ -0,0 +1,49 @@
+
+
+        <div class="card">
+         <div class="card-body">
+           <table>
+
+             <tr>
+
+                 {% if request.session.task_filter == "all" %}
+                    <td>Click to Filter</td>
+                 {% else %}
+                    <td>Click to Filter ({{request.session.task_filter}})</td>
+                 {% endif %}
+             </tr>
+
+             <tr>
+               <td>
+                   {% include "taskdatabase/quality/clear_filter_button.html" %}
+                <a href="{% url 'task-set-active-filter' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-layer-group"></i> Active</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' 'defined' 'quality' %}" class="btn btn-secondary btn-sm" role="button">defined</a>
+                <a href="{% url 'task-set-filter' 'staging' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i>staging</i></a>
+                <a href="{% url 'task-set-filter' 'staged' 'quality' %}" class="btn btn-secondary btn-sm" role="button">staged</a>
+                <a href="{% url 'task-set-filter' 'fetching' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i>fetching</i></a>
+                <a href="{% url 'task-set-filter' 'fetched' 'quality' %}" class="btn btn-secondary btn-sm" role="button">fetched</a>
+                <a href="{% url 'task-set-filter' 'processing' 'quality' %}" class="btn btn-secondary btn-sm" role="button"><i>processing</i></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>
+
+               </td>
+                 <td>
+                     {% include 'taskdatabase/filter/search.html' %}
+                 </td>
+             </tr>
+
+           </table>
+         </div>
+        </div>
+
+
diff --git a/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html b/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html
index 01c9c4c7..905758f4 100644
--- a/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html
+++ b/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html
@@ -11,7 +11,7 @@
                 <h3>Quality Diagnostics</h3>
                 This overview shows the Quality Diagnostics of all the task that have this information.
                 <hr>
-                {% include 'taskdatabase/filter/filter_buttons.html' %}&nbsp;
+                {% include 'taskdatabase/quality/filter_buttons.html' %}&nbsp;
             </div>
         </div>
         <div class="row">
diff --git a/atdb/taskdatabase/templates/taskdatabase/query/clear_filter_button.html b/atdb/taskdatabase/templates/taskdatabase/query/clear_filter_button.html
new file mode 100644
index 00000000..a42b2965
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/query/clear_filter_button.html
@@ -0,0 +1,5 @@
+{% if request.session.filtered == True %}
+   <a href="{% url 'clear-filter' 'query' %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-window-close"></i> Clear Filter</a>
+{% else %}
+   <a href="{% url 'clear-filter' 'query' %}" class="btn btn-secondary btn-sm" role="button"><i class="fas fa-window-close"></i> Clear Filter</a>
+{% endif %}
diff --git a/atdb/taskdatabase/templates/taskdatabase/query/index.html b/atdb/taskdatabase/templates/taskdatabase/query/index.html
index de6aedab..65e1fd4d 100644
--- a/atdb/taskdatabase/templates/taskdatabase/query/index.html
+++ b/atdb/taskdatabase/templates/taskdatabase/query/index.html
@@ -15,7 +15,7 @@
         <form action="" method="get" class="form form-inline">
             {% bootstrap_form filter.form layout='inline' %}
             &nbsp;<button type="submit" class="btn-secondary  btn-sm" title="Filter"><i class="fas fa-filter"></i> Filter</button>
-            {% include "taskdatabase/filter/clear_filter_button.html" %}
+            {% include "taskdatabase/query/clear_filter_button.html" %}
          </form>
     </div>
     {% endif %}
diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py
index 4c2fb8db..50f9df5a 100644
--- a/atdb/taskdatabase/urls.py
+++ b/atdb/taskdatabase/urls.py
@@ -95,11 +95,10 @@ urlpatterns = [
     path('tasks/<int:pk>/change_priority/<priority_change>', views.ChangePriority, name='task-change-priority'),
     path('tasks/sort-tasks/<sort>/<redirect_to_page>', views.SortTasks, name='sort-tasks'),
 
-
-    path('tasks/set_filter/<filter>', views.TaskSetFilter, name='task-set-filter'),
-    path('tasks/set_active_filter', views.TaskSetActiveFilter, name='task-set-active-filter'),
-    path('tasks/task-set-onhold-filter/<onhold>', views.TaskSetOnHoldFilter, name='task-set-onhold-filter'),
-    path('tasks/clear_filter/', views.TaskClearFilter, name='clear-filter'),
+    path('tasks/set_filter/<filter>/<redirect_to_page>', views.TaskSetFilter, name='task-set-filter'),
+    path('tasks/set_active_filter/<redirect_to_page>', views.TaskSetActiveFilter, name='task-set-active-filter'),
+    path('tasks/task-set-onhold-filter/<onhold>/<redirect_to_page>', views.TaskSetOnHoldFilter, name='task-set-onhold-filter'),
+    path('tasks/clear_filter/<redirect_to_page>', views.TaskClearFilter, name='clear-filter'),
 
     path('tasks/<int:pk>/set_status/<new_status>/<query_params>', views.TaskSetStatusTables2, name = 'task-setstatus'),
     path('tasks/set_status_multi/<new_status>/<query_params>', views.TaskMultiStatus, name='task-multi-setstatus'),
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index 02b3fbf6..d3eb018e 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -210,39 +210,8 @@ class IndexView(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
-        try:
-            sort = self.request.session['sort']
-        except:
-            sort = '-creationTime'
-
-        tasks = Task.objects.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_filtered_tasks(filter, sort)
-        except:
-            pass
-
-        # check if there is a 'task_onhold_filter' put on the session
-        try:
-            onhold = self.request.session['task_onhold_filter']
-            if onhold != None:
-                tasks = tasks.filter(resume=not onhold)
-
-        except:
-            pass
-
-        if (search_box is not None):
-            tasks = get_filtered_tasks(search_box, sort)
-
-        # only return the 'regular' tasks, and not the 'postprocessing' tasks in the GUI
-        # tasks = tasks.filter(task_type='regular')
+        tasks = get_filtered_tasks(self.request)
 
         paginator = Paginator(tasks, config.TASKS_PER_PAGE)  # Show 50 tasks per page
         page = self.request.GET.get('page')
@@ -278,38 +247,9 @@ class PostProcessingTasksView(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
-        try:
-            sort = self.request.session['sort']
-        except:
-            sort = '-creationTime'
-
-        tasks = Task.objects.order_by(sort)
+        tasks = get_filtered_tasks(self.request)
 
-        # check if there is a 'task_filter' put on the session
-        try:
-            filter = self.request.session['task_filter']
-            if filter != 'all':
-                tasks = get_filtered_tasks(filter, sort)
-        except:
-            pass
-
-        # check if there is a 'task_onhold_filter' put on the session
-        try:
-            onhold = self.request.session['task_onhold_filter']
-            if onhold != None:
-                tasks = tasks.filter(resume=not onhold)
-
-        except:
-            pass
-
-        if (search_box is not None):
-            tasks = get_filtered_tasks(search_box, sort)
-
-        # only return the 'regular' tasks, and not the 'postprocessing' tasks in the GUI
+        # only return the 'postprocessing' tasks, and not the 'regular' tasks in the GUI
         tasks = tasks.filter(task_type='postprocessing')
 
         paginator = Paginator(tasks, config.TASKS_PER_PAGE)  # Show 50 tasks per page
@@ -347,26 +287,8 @@ class ShowQualityPage(ListView):
     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.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_filtered_tasks(filter, sort)
-        except:
-            pass
-
-        if (search_box is not None):
-            tasks = get_filtered_tasks(search_box, sort)
+        tasks = get_filtered_tasks(self.request)
 
         # exclude the tasks without quality information
         tasks = tasks.exclude(outputs__quality__isnull=True)
@@ -407,26 +329,9 @@ class ShowValidationPage(ListView):
     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'
-
-        stored_tasks = Task.objects.filter(status__icontains='stored').order_by(sort)
-        tasks = stored_tasks
-        # check if there is a 'task_filter' put on the session
-        try:
-            filter = self.request.session['task_filter']
-            if filter != 'all':
-                tasks = get_filtered_tasks(filter, sort, stored_tasks)
-        except:
-            pass
-
-        if (search_box is not None):
-            tasks = get_filtered_tasks(search_box, sort, stored_tasks)
+        stored_tasks = Task.objects.filter(status__icontains='stored')
+        tasks = get_filtered_tasks(self.request, stored_tasks)
 
         # exclude the failed tasks
         tasks = tasks.exclude(status__icontains="failed")
@@ -466,27 +371,9 @@ class ShowFailuresPage(ListView):
     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'
-
-        failed_tasks = Task.objects.filter(status__icontains='failed').order_by(sort)
-        tasks = failed_tasks
-
-        # check if there is a 'task_filter' put on the session
-        try:
-            filter = self.request.session['task_filter']
-            if filter != 'all':
-                tasks = get_filtered_tasks(filter, sort, failed_tasks)
-        except:
-            pass
-
-        if (search_box is not None):
-            tasks = get_filtered_tasks(search_box, sort, failed_tasks)
+        failed_tasks = Task.objects.filter(status__icontains='failed')
+        tasks = get_filtered_tasks(self.request, failed_tasks)
 
         paginator = Paginator(tasks, config.TASKS_PER_PAGE)  # Show 50 tasks per page
         page = self.request.GET.get('page')
@@ -512,21 +399,58 @@ class ShowFailuresPage(ListView):
 
 
 # this provides a broad range of filters for the search_box in the GUI
-def get_filtered_tasks(search, sort, tasks=None):
-    if tasks:
-        tasks_to_filter = tasks
+def get_filtered_tasks(request, pre_filtered_tasks=None):
+    filtered_tasks=[]
+
+    try:
+        my_sort = request.session['sort']
+    except:
+        my_sort = '-creationTime'
+
+    # if there is already a 'filtered_tasks_as_list' on the session, then show that.
+    filtered_tasks_as_list = request.session['filtered_tasks_as_list']
+    if filtered_tasks_as_list:
+        if pre_filtered_tasks:
+            filtered_tasks = pre_filtered_tasks.filter(id__in=filtered_tasks_as_list)
+        else:
+            filtered_tasks = Task.objects.filter(id__in=filtered_tasks_as_list)
     else:
-        tasks_to_filter = Task.objects.all()
+        if pre_filtered_tasks:
+            filtered_tasks = pre_filtered_tasks
+        else:
+            filtered_tasks = Task.objects.all()
+
+        # check if there is a status filter active
+        status_filter = request.session['task_filter']
+        if status_filter != 'all':
+            if type(status_filter) is list:
+                filtered_tasks = filtered_tasks.filter(status__in=status_filter)
+            else:
+                filtered_tasks = filtered_tasks.filter(status__icontains=status_filter)
+
+        # check if the on_hold filter is active
+        onhold = request.session['task_onhold_filter']
+        if onhold != None:
+            filtered_tasks = filtered_tasks.filter(resume=not onhold)
+
+        search = request.GET.get('search_box', None)
+        if (search is not None):
+            filtered_tasks = filtered_tasks.filter(
+                Q(id__contains=search) |
+                Q(sas_id__contains=search) |
+                Q(creationTime__icontains=search) |
+                Q(filter__icontains=search) |
+                Q(status__icontains=search) |
+                Q(status__in=search) |
+                Q(project__icontains=search))
+
+
+    if (Task.objects.all().count() == filtered_tasks.count()):
+        request.session['filtered'] = False
+    else:
+        request.session['filtered'] = True
 
-    filtered_tasks = tasks_to_filter.filter(
-        Q(id__contains=search) |
-        Q(sas_id__contains=search) |
-        Q(creationTime__icontains=search) |
-        Q(filter__icontains=search) |
-        Q(status__icontains=search) |
-        Q(status__in=search) |
-        Q(project__icontains=search)).order_by(sort)
-    return filtered_tasks
+    return filtered_tasks.order_by(my_sort)
 
 
 class TaskTables2View(SingleTableView):
@@ -540,7 +464,7 @@ def TaskDetails(request, id=0, page=0):
         task = Task.objects.get(id=id)
 
         # store the requested task_id on the session
-        request.session['task_id'] = task.id
+        request.session['task_id'] = task.idg
 
     except:
         # when an invalid id is given, like '/atdb/task_details/0/',
@@ -952,6 +876,7 @@ def HoldQuery(request, pk, hold_it, query_params):
     current_query_params = convert_query_params_to_url(query_params)
     return redirect('/atdb/query/?' + current_query_params)
 
+
 @login_required
 def ServiceHoldResume(request, name, hostname, enabled):
     model = LatestMonitor
@@ -1014,34 +939,51 @@ def TaskRetry(request, pk, new_status, page=0):
 
 
 # set a filter value in the session, used later by the 'get_searched_tasks' mechanism
-def TaskSetFilter(request, filter):
+def TaskSetFilter(request, filter, redirect_to_page):
     request.session['task_filter'] = filter
 
     # switch off the other filters
     if filter == 'all':
         request.session['task_onhold_filter'] = None
 
+    if redirect_to_page == 'quality':
+        return redirect('/atdb/quality')
+
     return redirect('/atdb/?page=1')
 
 
 # set the defined list of ACTIVE_STATUSSES on the session, used later by the 'get_searched_tasks' mechanism
-def TaskSetActiveFilter(request):
+def TaskSetActiveFilter(request, redirect_to_page):
     request.session['task_filter'] = settings.ACTIVE_STATUSSES
     request.session['task_onhold_filter'] = None
+
+    if redirect_to_page == 'quality':
+        return redirect('/atdb/quality')
     return redirect('/atdb/?page=1')
 
 
-def TaskSetOnHoldFilter(request, onhold):
+def TaskSetOnHoldFilter(request, onhold, redirect_to_page):
     request.session['task_onhold_filter'] = onhold
+
+    if redirect_to_page == 'quality':
+        return redirect('/atdb/quality')
     return redirect('/atdb/?page=1')
 
-def TaskClearFilter(request):
+
+def TaskClearFilter(request, redirect_to_page):
     request.session['task_filter'] = 'all'
     request.session['task_onhold_filter'] = None
     request.session['filtered_tasks_as_list'] = None
     request.session['search_box'] = ''
+    request.session['filtered'] = False
+
+    if redirect_to_page == 'quality':
+        return redirect('/atdb/quality')
+    if redirect_to_page == 'query':
+        return redirect('/atdb/query')
     return redirect('/atdb/?page=1')
 
+
 @login_required
 def ChangePriority(request, pk, priority_change, page=0):
     model = Task
@@ -1071,7 +1013,6 @@ def SortTasks(request, sort, redirect_to_page):
         return redirect(redirect_to_page)
 
 
-
 def convert_query_params_to_url(query_params):
     # to keep the state of the current query,
     # loop through the current query_params and send them back into the next request
-- 
GitLab