From 3daad1b83ba46ac7a70b6769de5be175a0c2808c Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 20 Oct 2025 16:17:07 +0100 Subject: [PATCH] Add Subspecialty autocomplete and filter to QuestionFilter --- atlas/urls.py | 7 ++++++- atlas/views.py | 18 ++++++++++++++++++ sbas/filters.py | 11 ++++++++--- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/atlas/urls.py b/atlas/urls.py index e61c4adf..66b59ce5 100755 --- a/atlas/urls.py +++ b/atlas/urls.py @@ -2,7 +2,7 @@ from django.urls import path, include from django.views.generic import RedirectView, TemplateView -from atlas.models import Condition, Finding, Presentation, Structure +from atlas.models import Condition, Finding, Presentation, Structure, Subspecialty from . import views app_name = "atlas" @@ -528,6 +528,11 @@ urlpatterns = [ views.StructureAutocomplete.as_view(model=Structure, create_field="name", validate_create=True), name="structure-autocomplete", ), + path( + "subspecialty-autocomplete", + views.SubspecialtyAutocomplete.as_view(model=Subspecialty, create_field="name"), + name="subspecialty-autocomplete", + ), path("presentation/", views.PresentationView.as_view(), name="presentation_view"), path( "presentation/", views.presentation_detail, name="presentation_detail" diff --git a/atlas/views.py b/atlas/views.py index cc3af2ca..55e26257 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -1978,6 +1978,24 @@ class StructureAutocomplete(autocomplete.Select2QuerySetView): return qs +class SubspecialtyAutocomplete(autocomplete.Select2QuerySetView): + def get_queryset(self): + # Don't forget to filter out results depending on the visitor ! + if not self.request.user.is_authenticated: + return Subspecialty.objects.none() + + qs = Subspecialty.objects.all() + + if self.q: + # This raises a fielderror which breaks creating a new item if not caught + try: + qs = qs.filter(name__icontains=self.q) + except FieldError: + return Subspecialty.objects.none() + + return qs + + @login_required # @user_is_atlas_editor def categories_list(request): diff --git a/sbas/filters.py b/sbas/filters.py index be98dbec..bd894356 100644 --- a/sbas/filters.py +++ b/sbas/filters.py @@ -2,7 +2,7 @@ import django_filters from dal import autocomplete from .models import Category, Question, UserAnswer, Exam -from atlas.models import Condition, Structure, Finding, Presentation +from atlas.models import Condition, Structure, Finding, Presentation, Subspecialty #from generic.filters import UserAnswerFilter from django.contrib.auth.models import User @@ -34,7 +34,12 @@ def get_authors(request): class QuestionFilter(django_filters.FilterSet): exams = django_filters.ModelMultipleChoiceFilter(queryset=get_exams, null_label="No exam") author = django_filters.ModelMultipleChoiceFilter(queryset=get_authors, null_label="No author") - category = django_filters.ModelChoiceFilter(queryset=Category.objects.all(),null_label="Uncategorised") + category = django_filters.ModelMultipleChoiceFilter(queryset=Category.objects.all(),null_label="Uncategorised") + subspecialty = django_filters.ModelMultipleChoiceFilter( + queryset=Subspecialty.objects.all(), + widget=autocomplete.ModelSelect2Multiple(url='atlas:subspecialty-autocomplete'), + label='Subspecialty', + ) condition = django_filters.ModelMultipleChoiceFilter( queryset=Condition.objects.all(), widget=autocomplete.ModelSelect2Multiple(url='atlas:condition-autocomplete'), @@ -57,7 +62,7 @@ class QuestionFilter(django_filters.FilterSet): ) class Meta: model = Question - fields = ("exams", "created_date", "condition", "structure", "finding", "presentation") + fields = ("exams", "created_date", "condition", "structure", "finding", "presentation", "category", "subspecialty") def __init__(self, data=None, queryset=None, prefix=None, strict=None, user=None, request=None): if not request.user.groups.filter(name="sba_checker").exists():