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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user