Add advanced filtering options to question overview page

This commit is contained in:
Ross
2025-10-28 08:40:21 +00:00
parent 15791fa883
commit 2676cb49a1
2 changed files with 19 additions and 59 deletions
+13 -59
View File
@@ -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)