From 3b743bff4988b152232650d8c854b755568bdf82 Mon Sep 17 00:00:00 2001 From: Zaki Benaissa Date: Sun, 7 Jan 2024 14:44:42 +0100 Subject: [PATCH 1/2] Add filter to programs data --- course/filters.py | 18 ++++++++++++++++++ course/urls.py | 2 +- course/views.py | 28 ++++++++++------------------ templates/course/program_list.html | 7 +++---- 4 files changed, 32 insertions(+), 23 deletions(-) create mode 100644 course/filters.py diff --git a/course/filters.py b/course/filters.py new file mode 100644 index 0000000..2358ad1 --- /dev/null +++ b/course/filters.py @@ -0,0 +1,18 @@ +import django_filters +from .models import Program + + +class ProgramFilter(django_filters.FilterSet): + title = django_filters.CharFilter(lookup_expr="icontains", label="") + + class Meta: + model = Program + fields = ["title"] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Change html classes and placeholders + self.filters["title"].field.widget.attrs.update( + {"class": "au-input", "placeholder": "Program name"} + ) diff --git a/course/urls.py b/course/urls.py index 9da1327..87df578 100644 --- a/course/urls.py +++ b/course/urls.py @@ -4,7 +4,7 @@ from .views import * urlpatterns = [ # Program urls - path("", program_view, name="programs"), + path("", ProgramFilterView.as_view(), name="programs"), path("/detail/", program_detail, name="program_detail"), path("add/", program_add, name="add_program"), path("/edit/", program_edit, name="edit_program"), diff --git a/course/views.py b/course/views.py index 1eb4aaa..6781622 100644 --- a/course/views.py +++ b/course/views.py @@ -7,6 +7,7 @@ from django.core.paginator import Paginator from django.conf import settings from django.utils.decorators import method_decorator from django.views.generic import ListView +from django_filters.views import FilterView from accounts.models import User, Student from core.models import Session, Semester @@ -20,28 +21,19 @@ from .forms import ( UploadFormFile, UploadFormVideo, ) +from .filters import ProgramFilter from .models import Program, Course, CourseAllocation, Upload, UploadVideo -# ######################################################## -# Program views -# ######################################################## -@login_required -def program_view(request): - programs = Program.objects.all() +@method_decorator([login_required], name="dispatch") +class ProgramFilterView(FilterView): + filterset_class = ProgramFilter + template_name = "course/program_list.html" - program_filter = request.GET.get("program_filter") - if program_filter: - programs = Program.objects.filter(title__icontains=program_filter) - - return render( - request, - "course/program_list.html", - { - "title": "Programs", - "programs": programs, - }, - ) + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["title"] = "Programs" + return context @login_required diff --git a/templates/course/program_list.html b/templates/course/program_list.html index e257b89..745be26 100644 --- a/templates/course/program_list.html +++ b/templates/course/program_list.html @@ -27,9 +27,8 @@ {% endif %}
-
{% csrf_token %} - + + {{ filter.form }} @@ -72,7 +71,7 @@ - {% for program in programs %} + {% for program in filter.qs %} {{ forloop.counter }}. From a6da0a2f26af80d9dd9b686641b016ffa6a77512 Mon Sep 17 00:00:00 2001 From: Zaki Benaissa Date: Sun, 7 Jan 2024 21:20:58 +0100 Subject: [PATCH 2/2] 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 }}.