Enhance filtering functionality and UI consistency across user-related views by implementing a generic search filter and updating filter display in templates.

This commit is contained in:
Ross
2025-11-03 10:47:40 +00:00
parent 2d0098b2b6
commit 83a60203f7
5 changed files with 63 additions and 39 deletions
+45
View File
@@ -1,4 +1,6 @@
import django_filters
from django.db.models import Q
from collections import OrderedDict
from django.contrib.auth.models import User
@@ -34,6 +36,8 @@ class CidUserFilter(django_filters.FilterSet):
return parent
class UserUserFilter(django_filters.FilterSet):
# Generic search across name and email/username
q = django_filters.CharFilter(method='filter_search', label='Search')
userprofile__grade = django_filters.ModelChoiceFilter(queryset=UserGrades.objects.all(),label="Grade")
userprofile__supervisor = django_filters.ModelChoiceFilter(queryset=Supervisor.objects.all(), label="Supervisor")
userprofile__peninsula_trainee = django_filters.BooleanFilter(label="Peninsula Trainee")
@@ -69,6 +73,47 @@ class UserUserFilter(django_filters.FilterSet):
super(UserUserFilter, self).__init__(*args, **kwargs)
self.form.initial['is_active'] = True
def filter_search(self, queryset, name, value):
"""
Generic search that matches first name, last name, email or username.
"""
v = (value or "").strip()
if not v:
return queryset
return queryset.filter(
Q(first_name__icontains=v)
| Q(last_name__icontains=v)
| Q(email__icontains=v)
| Q(username__icontains=v)
)
def __post_init_reorder__(self):
"""Internal helper to move the generic search 'q' to the front of the form fields."""
try:
fields = self.form.fields
if 'q' in fields:
new_order = ['q'] + [k for k in fields.keys() if k != 'q']
self.form.fields = OrderedDict((k, fields[k]) for k in new_order)
except Exception:
pass
# Ensure reorder runs after initialization
def __new__(cls, *args, **kwargs):
instance = super(UserUserFilter, cls).__new__(cls)
# attach a post-init hook to reorder form fields
orig_init = instance.__init__
def wrapped_init(*a, **k):
orig_init(*a, **k)
try:
instance.__post_init_reorder__()
except Exception:
pass
instance.__init__ = wrapped_init
return instance
class ExaminationFilter(django_filters.FilterSet):
class Meta: