From a6da0a2f26af80d9dd9b686641b016ffa6a77512 Mon Sep 17 00:00:00 2001 From: Zaki Benaissa Date: Sun, 7 Jan 2024 21:20:58 +0100 Subject: [PATCH] Add filter to course allocation --- course/filters.py | 32 +++++++++++++++++++- course/urls.py | 6 +++- course/views.py | 22 ++++++-------- templates/course/course_allocation_view.html | 9 +++--- 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/course/filters.py b/course/filters.py index 2358ad1..8025629 100644 --- a/course/filters.py +++ b/course/filters.py @@ -1,5 +1,6 @@ +from django.db.models import Q import django_filters -from .models import Program +from .models import Program, CourseAllocation, Course class ProgramFilter(django_filters.FilterSet): @@ -16,3 +17,32 @@ class ProgramFilter(django_filters.FilterSet): self.filters["title"].field.widget.attrs.update( {"class": "au-input", "placeholder": "Program name"} ) + + +class CourseAllocationFilter(django_filters.FilterSet): + lecturer = django_filters.CharFilter(method="filter_by_lecturer", label="") + course = django_filters.filters.CharFilter(method="filter_by_course", label="") + + class Meta: + model = CourseAllocation + fields = [] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Change html classes and placeholders + self.filters["lecturer"].field.widget.attrs.update( + {"class": "au-input", "placeholder": "Lecturer"} + ) + self.filters["course"].field.widget.attrs.update( + {"class": "au-input", "placeholder": "Course"} + ) + + def filter_by_lecturer(self, queryset, name, value): + return queryset.filter( + Q(lecturer__first_name__icontains=value) + | Q(lecturer__last_name__icontains=value) + ) + + def filter_by_course(self, queryset, name, value): + return queryset.filter(courses__title__icontains=value) diff --git a/course/urls.py b/course/urls.py index 87df578..d2b1e0f 100644 --- a/course/urls.py +++ b/course/urls.py @@ -18,7 +18,11 @@ urlpatterns = [ path( "course/assign/", CourseAllocationFormView.as_view(), name="course_allocation" ), - path("course/allocated/", course_allocation_view, name="course_allocation_view"), + path( + "course/allocated/", + CourseAllocationFilterView.as_view(), + name="course_allocation_view", + ), path( "allocated_course//edit/", edit_allocated_course, diff --git a/course/views.py b/course/views.py index 6781622..8cd4f80 100644 --- a/course/views.py +++ b/course/views.py @@ -21,7 +21,7 @@ from .forms import ( UploadFormFile, UploadFormVideo, ) -from .filters import ProgramFilter +from .filters import ProgramFilter, CourseAllocationFilter from .models import Program, Course, CourseAllocation, Upload, UploadVideo @@ -260,17 +260,15 @@ class CourseAllocationFormView(CreateView): return context -@login_required -def course_allocation_view(request): - allocated_courses = CourseAllocation.objects.all() - return render( - request, - "course/course_allocation_view.html", - { - "title": "Course Allocations", - "allocated_courses": allocated_courses, - }, - ) +@method_decorator([login_required], name="dispatch") +class CourseAllocationFilterView(FilterView): + filterset_class = CourseAllocationFilter + template_name = "course/course_allocation_view.html" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["title"] = "Course Allocations" + return context @login_required diff --git a/templates/course/course_allocation_view.html b/templates/course/course_allocation_view.html index 2bc45a7..781adf3 100644 --- a/templates/course/course_allocation_view.html +++ b/templates/course/course_allocation_view.html @@ -27,11 +27,10 @@ {% endif %}
-
{% csrf_token %} - - + + {{ filter.form }}
@@ -48,7 +47,7 @@ {% endif %} - {% for course in allocated_courses %} + {% for course in filter.qs %} {{ forloop.counter }}.