From 2676cb49a18c2b49911a3890a70740c93d128403 Mon Sep 17 00:00:00 2001 From: Ross Date: Tue, 28 Oct 2025 08:40:21 +0000 Subject: [PATCH] Add advanced filtering options to question overview page --- sbas/templates/sbas/question_overview.html | 6 ++ sbas/views.py | 72 ++++------------------ 2 files changed, 19 insertions(+), 59 deletions(-) diff --git a/sbas/templates/sbas/question_overview.html b/sbas/templates/sbas/question_overview.html index 01376885..914d6b2a 100644 --- a/sbas/templates/sbas/question_overview.html +++ b/sbas/templates/sbas/question_overview.html @@ -43,6 +43,12 @@

+ {% if qfilter %} +
+
Full filter form
+ {{ qfilter.form.as_p }} +
+ {% endif %}
diff --git a/sbas/views.py b/sbas/views.py index 5c7e3225..41a62ea5 100644 --- a/sbas/views.py +++ b/sbas/views.py @@ -531,71 +531,24 @@ def question_overview(request): status = request.GET.get("status") or QuestionReview.StatusChoices.ACCEPTED group_by = request.GET.get("group_by") or "category" - # allow multi-selects for category and atlas filters - category_filters = request.GET.getlist("category") - open_access = request.GET.get("open_access") + # Use django-filter to build the base filtered queryset. QuestionFilter + # already applies permission filters when given the request. + from .filters import QuestionFilter + + qfilter = QuestionFilter(data=request.GET or None, queryset=Question.objects.all().order_by("pk"), request=request) + qs = qfilter.qs + + # We'll still support a top-level status filter (review status) via a GET param + # and advanced atlas filters are provided by the QuestionFilter form. + # Preserve selected values for building links (use getlist for multi-selects) + category_filters = request.GET.getlist("category") finding_filters = request.GET.getlist("finding") structure_filters = request.GET.getlist("structure") condition_filters = request.GET.getlist("condition") subspecialty_filters = request.GET.getlist("subspecialty") presentation_filters = request.GET.getlist("presentation") - - qs = Question.objects.all().order_by("pk") - - # Permission filter: non-checkers see open_access or their own questions - try: - if not request.user.groups.filter(name="sbas_checker").exists(): - from django.db.models import Q - - qs = qs.filter(Q(open_access=True) | Q(author__id=request.user.id)) - except Exception: - pass - - # Optional category filter (multi) - if category_filters: - try: - ids = [int(x) for x in category_filters if x] - if ids: - qs = qs.filter(category__id__in=ids) - except Exception: - pass - - # Optional open_access filter - if open_access in ("0", "1"): - qs = qs.filter(open_access=(open_access == "1")) - - # Optional atlas M2M filters (multi-select) - try: - finding_ids = [int(x) for x in finding_filters if x] - if finding_ids: - qs = qs.filter(finding__id__in=finding_ids) - except Exception: - finding_ids = [] - try: - structure_ids = [int(x) for x in structure_filters if x] - if structure_ids: - qs = qs.filter(structure__id__in=structure_ids) - except Exception: - structure_ids = [] - try: - condition_ids = [int(x) for x in condition_filters if x] - if condition_ids: - qs = qs.filter(condition__id__in=condition_ids) - except Exception: - condition_ids = [] - try: - subspecialty_ids = [int(x) for x in subspecialty_filters if x] - if subspecialty_ids: - qs = qs.filter(subspecialty__id__in=subspecialty_ids) - except Exception: - subspecialty_ids = [] - try: - presentation_ids = [int(x) for x in presentation_filters if x] - if presentation_ids: - qs = qs.filter(presentation__id__in=presentation_ids) - except Exception: - presentation_ids = [] + open_access = request.GET.get("open_access") # Optimize status filtering with a DB subquery to get latest review status per question from django.contrib.contenttypes.models import ContentType @@ -697,6 +650,7 @@ def question_overview(request): "selected_conditions": selected_conditions, "selected_subspecialties": selected_subspecialties, "selected_presentations": selected_presentations, + "qfilter": qfilter, } return render(request, "sbas/question_overview.html", context)