From 11cd0444855f04969d69243c9dc07f7237a1d4f0 Mon Sep 17 00:00:00 2001 From: Ross Date: Tue, 28 Oct 2025 17:51:37 +0000 Subject: [PATCH] Add category filtering options to search functionality --- atlas/templates/atlas/categories_list.html | 50 +++++++++++++++++++++- atlas/views.py | 38 +++++++++------- 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/atlas/templates/atlas/categories_list.html b/atlas/templates/atlas/categories_list.html index e7839b4d..48643a84 100644 --- a/atlas/templates/atlas/categories_list.html +++ b/atlas/templates/atlas/categories_list.html @@ -20,12 +20,60 @@
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ {# Spinner shown while HTMX request is in-flight (selector matched by hx-indicator) #} diff --git a/atlas/views.py b/atlas/views.py index bd32d00c..d59de28f 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -2001,24 +2001,26 @@ class SubspecialtyAutocomplete(autocomplete.Select2QuerySetView): def categories_list(request): # Allow an optional global search across category models via GET `q`. query = request.GET.get("q", "").strip() + # Optional `types` GET parameter (can be repeated) to restrict which category + # models to search. Expected values: 'conditions','findings','structures', + # 'subspecialties','presentations'. If omitted, search all. + types = request.GET.getlist("types") results = None if query: from .models import Condition, Finding, Structure, Subspecialty, Presentation - # Simple case-insensitive contains search on `name` field for each model - conditions = Condition.objects.filter(name__icontains=query).order_by("name") - findings = Finding.objects.filter(name__icontains=query).order_by("name") - structures = Structure.objects.filter(name__icontains=query).order_by("name") - subspecialties = Subspecialty.objects.filter(name__icontains=query).order_by("name") - presentations = Presentation.objects.filter(name__icontains=query).order_by("name") + # Helper to conditionally populate each result list only when the + # corresponding type is requested (or when no types filter provided). + def include(name: str) -> bool: + return not types or name in types results = { - "conditions": conditions, - "findings": findings, - "structures": structures, - "subspecialties": subspecialties, - "presentations": presentations, + "conditions": Condition.objects.filter(name__icontains=query).order_by("name") if include("conditions") else (), + "findings": Finding.objects.filter(name__icontains=query).order_by("name") if include("findings") else (), + "structures": Structure.objects.filter(name__icontains=query).order_by("name") if include("structures") else (), + "subspecialties": Subspecialty.objects.filter(name__icontains=query).order_by("name") if include("subspecialties") else (), + "presentations": Presentation.objects.filter(name__icontains=query).order_by("name") if include("presentations") else (), } return render(request, "atlas/categories_list.html", {"query": query, "results": results}) @@ -2031,16 +2033,20 @@ def categories_search_partial(request): Expects GET param `q`. """ query = request.GET.get("q", "").strip() + types = request.GET.getlist("types") results = {"conditions": (), "findings": (), "structures": (), "subspecialties": (), "presentations": ()} if query: from .models import Condition, Finding, Structure, Subspecialty, Presentation + def include(name: str) -> bool: + return not types or name in types + results = { - "conditions": Condition.objects.filter(name__icontains=query).order_by("name"), - "findings": Finding.objects.filter(name__icontains=query).order_by("name"), - "structures": Structure.objects.filter(name__icontains=query).order_by("name"), - "subspecialties": Subspecialty.objects.filter(name__icontains=query).order_by("name"), - "presentations": Presentation.objects.filter(name__icontains=query).order_by("name"), + "conditions": Condition.objects.filter(name__icontains=query).order_by("name") if include("conditions") else (), + "findings": Finding.objects.filter(name__icontains=query).order_by("name") if include("findings") else (), + "structures": Structure.objects.filter(name__icontains=query).order_by("name") if include("structures") else (), + "subspecialties": Subspecialty.objects.filter(name__icontains=query).order_by("name") if include("subspecialties") else (), + "presentations": Presentation.objects.filter(name__icontains=query).order_by("name") if include("presentations") else (), } return render(request, "atlas/_categories_search_results.html", {"query": query, "results": results})