From ad9b1e29fbea671126ee0862d7ed0e1035985875 Mon Sep 17 00:00:00 2001 From: Jon Froehlich Date: Wed, 24 Jun 2026 06:43:25 -0700 Subject: [PATCH] Filter advisor/mentor autocomplete dropdowns by role (#1126) The advisor field's plain , but ``co_advisor`` and ``grad_mentor`` are ``autocomplete_fields``: + their options come from this endpoint (``AutocompleteJsonView``), which + bypasses ``formfield_for_foreignkey``. Without this, the autocomplete search + would offer every person (e.g. undergrads as co-advisors). We narrow the + queryset to the same role-appropriate sets used for the plain dropdowns, + keyed off the requesting Position field passed by the autocomplete view. + """ + queryset, may_have_duplicates = super().get_search_results( + request, queryset, search_term) + + if request.GET.get('model_name') == 'position': + field_name = request.GET.get('field_name') + if field_name in ('advisor', 'co_advisor'): + allowed = get_active_professors_queryset() + elif field_name == 'grad_mentor': + allowed = get_active_mentors_queryset() + else: + allowed = None + + if allowed is not None: + queryset = queryset.filter( + pk__in=allowed.values_list('pk', flat=True)) + + return queryset, may_have_duplicates + # The list display lets us control what is shown in the default persons table at Home > Website > People # info on displaying multiple entries comes from http://stackoverflow.com/questions/9164610/custom-columns-using-django-admin # The count columns (project_count / pub_count / talk_count) read annotations diff --git a/website/tests/test_advisor_mentor_autocomplete.py b/website/tests/test_advisor_mentor_autocomplete.py new file mode 100644 index 00000000..c06c6912 --- /dev/null +++ b/website/tests/test_advisor_mentor_autocomplete.py @@ -0,0 +1,85 @@ +""" +Regression tests for issue #1126. + +When an admin edits a Person and sets an advisor / co-advisor / mentor on an +inline Position, the dropdown must only offer role-appropriate people: + + - advisor / co_advisor -> currently active professors only + - grad_mentor ("Mentor") -> currently active senior lab members only + +The plain ``advisor``