Make lecturers fiterable

This commit is contained in:
Zaki Benaissa 2024-01-05 18:24:58 +01:00
parent 222ddab9cb
commit a59ccae6d5
3 changed files with 38 additions and 6 deletions

31
accounts/filters.py Normal file
View File

@ -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)
)

View File

@ -7,12 +7,14 @@ from django.views.generic import CreateView, ListView
from django.db.models import Q from django.db.models import Q
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.contrib.auth.forms import PasswordChangeForm from django.contrib.auth.forms import PasswordChangeForm
from django_filters.views import FilterView
from core.models import Session, Semester from core.models import Session, Semester
from course.models import Course from course.models import Course
from result.models import TakenCourse from result.models import TakenCourse
from .decorators import admin_required from .decorators import admin_required
from .forms import StaffAddForm, StudentAddForm, ProfileUpdateForm, ParentAddForm from .forms import StaffAddForm, StudentAddForm, ProfileUpdateForm, ParentAddForm
from .models import User, Student, Parent from .models import User, Student, Parent
from .filters import LecturerFilter
def validate_username(request): def validate_username(request):
@ -259,7 +261,8 @@ def edit_staff(request, pk):
@method_decorator([login_required, admin_required], name="dispatch") @method_decorator([login_required, admin_required], name="dispatch")
class LecturerListView(ListView): class LecturerListView(FilterView):
filterset_class = LecturerFilter
queryset = User.objects.filter(is_lecturer=True) queryset = User.objects.filter(is_lecturer=True)
template_name = "accounts/lecturer_list.html" template_name = "accounts/lecturer_list.html"
paginate_by = 10 # if pagination is desired paginate_by = 10 # if pagination is desired

View File

@ -29,11 +29,9 @@
<div class="content-center"> <div class="content-center">
<form class="search-form" action="" method="get"> <form class="search-form" action="" method="get">
<input class="au-input" type="text" name="id_no" placeholder="ID No." value="{{ request.GET.id_no }}"/> {{ filter.form }}
<input class="au-input" type="text" name="name" placeholder="Name" value="{{ request.GET.name }}"/>
<input class="au-input" type="text" name="email" placeholder="Email" value="{{ request.GET.email }}"/>
<button class="btn btn-light" type="submit"> <button class="btn btn-light" type="submit">
<i class="fas fa-search"></i> filter <i class="fas fa-search"></i> Filter
</button> </button>
</form> </form>
</div> </div>
@ -55,7 +53,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for lecturer in object_list %} {% for lecturer in filter.qs %}
<tr> <tr>
<td> {{ forloop.counter }}.</td> <td> {{ forloop.counter }}.</td>
<td>{{ lecturer.username }}</td> <td>{{ lecturer.username }}</td>