From a59ccae6d504981a283c50a5f33025147d738812 Mon Sep 17 00:00:00 2001 From: Zaki Benaissa Date: Fri, 5 Jan 2024 18:24:58 +0100 Subject: [PATCH] Make lecturers fiterable --- accounts/filters.py | 31 +++++++++++++++++++++++++++ accounts/views.py | 5 ++++- templates/accounts/lecturer_list.html | 8 +++---- 3 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 accounts/filters.py diff --git a/accounts/filters.py b/accounts/filters.py new file mode 100644 index 0000000..79dbfe0 --- /dev/null +++ b/accounts/filters.py @@ -0,0 +1,31 @@ +from django.db.models import Q +import django_filters +from .models import User + + +class LecturerFilter(django_filters.FilterSet): + username = django_filters.CharFilter(lookup_expr="exact", label="") + name = django_filters.CharFilter(method="filter_by_name", label="") + email = django_filters.CharFilter(lookup_expr="icontains", label="") + + class Meta: + model = User + fields = ["username", "email"] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Change html classes and placeholders + self.filters["username"].field.widget.attrs.update({"class": "au-input"}) + self.filters["username"].field.widget.attrs.update({"placeholder": "ID No."}) + + self.filters["name"].field.widget.attrs.update({"class": "au-input"}) + self.filters["name"].field.widget.attrs.update({"placeholder": "Name"}) + + self.filters["email"].field.widget.attrs.update({"class": "au-input"}) + self.filters["email"].field.widget.attrs.update({"placeholder": "Email"}) + + def filter_by_name(self, queryset, name, value): + return queryset.filter( + Q(first_name__icontains=value) | Q(last_name__icontains=value) + ) diff --git a/accounts/views.py b/accounts/views.py index 3c4aa18..9574ef1 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -7,12 +7,14 @@ from django.views.generic import CreateView, ListView from django.db.models import Q from django.utils.decorators import method_decorator from django.contrib.auth.forms import PasswordChangeForm +from django_filters.views import FilterView from core.models import Session, Semester from course.models import Course from result.models import TakenCourse from .decorators import admin_required from .forms import StaffAddForm, StudentAddForm, ProfileUpdateForm, ParentAddForm from .models import User, Student, Parent +from .filters import LecturerFilter def validate_username(request): @@ -259,7 +261,8 @@ def edit_staff(request, pk): @method_decorator([login_required, admin_required], name="dispatch") -class LecturerListView(ListView): +class LecturerListView(FilterView): + filterset_class = LecturerFilter queryset = User.objects.filter(is_lecturer=True) template_name = "accounts/lecturer_list.html" paginate_by = 10 # if pagination is desired diff --git a/templates/accounts/lecturer_list.html b/templates/accounts/lecturer_list.html index 25be0c2..eb97ddc 100644 --- a/templates/accounts/lecturer_list.html +++ b/templates/accounts/lecturer_list.html @@ -29,11 +29,9 @@
- - - + {{ filter.form }}
@@ -55,7 +53,7 @@ - {% for lecturer in object_list %} + {% for lecturer in filter.qs %} {{ forloop.counter }}. {{ lecturer.username }}