Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Program search #418

Merged
merged 3 commits into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions core/filters.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import django_filters
from django import forms
from django.conf import settings
from django.db.models import Count

from programs.models import College

class ProgramListFilterSet(django_filters.FilterSet):
missing_choices = [
('', ''),
Expand All @@ -10,7 +13,25 @@ class ProgramListFilterSet(django_filters.FilterSet):
('Career Paths Missing', 'jobs_missing')
]

name = django_filters.CharFilter(lookup_expr='icontains')
colleges_choices = []

for college in College.objects.all():
colleges_choices.append(
(college.id, college.full_name.replace('College of ', ''))
)

name = django_filters.CharFilter(
lookup_expr='icontains',
widget=forms.TextInput({'class': 'form-control mb-4' })
)
colleges = django_filters.MultipleChoiceFilter(
field_name='colleges',
lookup_expr='in',
choices=colleges_choices,
widget=forms.CheckboxSelectMultiple({
'class': 'list-unstyled'
})
)
missing = django_filters.CharFilter(
method='missing_descriptions'
)
Expand All @@ -31,7 +52,6 @@ def __init__(self, data, *args, **kwargs):
data = data.copy()
super().__init__(data, *args, **kwargs)


def missing_descriptions(self, queryset, name, value):
"""
Filter for displaying missing descriptions
Expand Down
119 changes: 66 additions & 53 deletions templates/dashboard/program-list.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,6 @@
{% load core_extras %}
{% block body %}
<div class="container mt-4">
<!-- <form class="mb-4" action="" method="get">
<div class="form-group">
<label for="{{ filterset.form.name.label }}" class="form-label">Name: </label>
<input class="form-control" id="name" name="name" type="text" />
</div>
<input class="btn btn-primary" type="submit" />
</form> -->
<div class="row custom-row-sm-cards">
<div class="d-flex flex-wrap justify-content-around mb-4">
<a href="?{% param_replace missing='' %}" role="button" class="card m-1 border-0 custom-shadow-box d-flex align-items-center justify-content-center custom-sm-card {% if not request.GET.missing %}active-card{% endif %}">
Expand Down Expand Up @@ -49,53 +42,73 @@
</a>
</div>
</div>
<div class="custom-shadow-box card-block p-4 lv-mob-table">
<table class="table table-borderless">
<thead class="text-center">
<tr class="font-size-sm border-bottom">
<th scope="col lv-cell-p">
{% sortable_field_header fieldname='Name' field='name' %}
</th>
<th scope="col lv-cell-p">
Descriptions
</th>
<th>
Custom Description
</th>
<th scope="col lv-cell-p">
Career Path
</th>
<th scope="col lv-cell-p">
{% sortable_field_header fieldname='Modified' field='modified' %}
</th>
</tr>
</thead>
<tbody>
{% for obj in object_list %}
<tr>
<td class="p-3 lv-cell-p">
<a href="{% url 'dashboard.programs.edit' obj.pk %}">{{ obj.name }}</a>
</td>
<td class="p-3 lv-cell-p text-center">{{ obj.has_descriptions|check|safe }}</td>
<td class="p-3 lv-cell-p text-center">{{ obj.has_custom_description|check|safe }}</td>
<td class="p-3 lv-cell-p text-center">{{ obj.has_jobs|check|safe }}</span></td>
<td class="p-3 lv-cell-p text-center">{{ obj.modified|date:"F j, Y" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="btn-group mb-5">
{% if page_obj.has_previous %}
<a class="btn btn-default" href="?{% param_replace page=1 %}">&laquo; <span class="sr-only">First</span></a>
<a class="btn btn-default" href="?{% param_replace page=page_obj.previous_page_number %}">&lt; <span class="sr-only">Previous</span></a>
{% endif %}
<span class="btn btn-default">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
</span>
{% if page_obj.has_next %}
<a class="btn btn-default" href="?{% param_replace page=page_obj.next_page_number %}"><span class="sr-only">Next</span> &gt;</a>
<a class="btn btn-default" href="?{% param_replace page=page_obj.paginator.num_pages %}"><span class="sr-only">Last</span> &raquo;</a>
<div class="row">
<div class="col-12 col-md-3 order-1 order-md-2">
<form class="mb-4" action="" method="get">
<div class="form-group">
<label for="{{ filterset.form.name.label }}" class="form-label">Search by Program Name: </label>
{{ filterset.form.name }}
</div>
<div class="form-group">
<label for="{{ filterset.form.colleges.label }}" class="form-label d-block">College: </label>
{{ filterset.form.colleges }}
</div>
<input class="btn btn-primary" type="submit" value="Filter Results" />
</form>
</div>
<div class="col-12 col-md-9 order-2 order-md-1">
<div class="custom-shadow-box card-block p-4 lv-mob-table">
{% if filterset.form.name.value %}
<p class="text-muted">Showing {{ object_list.count }} programs with the keyword <strong>&ldquo;{{ filterset.form.name.value }}&rdquo;</strong>:</p>
{% endif %}
<table class="table table-borderless">
<thead class="text-center">
<tr class="font-size-sm border-bottom">
<th scope="col lv-cell-p">
{% sortable_field_header fieldname='Name' field='name' %}
</th>
<th scope="col lv-cell-p">
Descriptions
</th>
<th>
Custom Description
</th>
<th scope="col lv-cell-p">
Career Path
</th>
<th scope="col lv-cell-p">
{% sortable_field_header fieldname='Modified' field='modified' %}
</th>
</tr>
</thead>
<tbody>
{% for obj in object_list %}
<tr>
<td class="p-3 lv-cell-p">
<a href="{% url 'dashboard.programs.edit' obj.pk %}">{{ obj.name }}</a>
</td>
<td class="p-3 lv-cell-p text-center">{{ obj.has_descriptions|check|safe }}</td>
<td class="p-3 lv-cell-p text-center">{{ obj.has_custom_description|check|safe }}</td>
<td class="p-3 lv-cell-p text-center">{{ obj.has_jobs|check|safe }}</span></td>
<td class="p-3 lv-cell-p text-center">{{ obj.modified|date:"F j, Y" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="btn-group mb-5">
{% if page_obj.has_previous %}
<a class="btn btn-default" href="?{% param_replace page=1 %}">&laquo; <span class="sr-only">First</span></a>
<a class="btn btn-default" href="?{% param_replace page=page_obj.previous_page_number %}">&lt; <span class="sr-only">Previous</span></a>
{% endif %}
<span class="btn btn-default">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
</span>
{% if page_obj.has_next %}
<a class="btn btn-default" href="?{% param_replace page=page_obj.next_page_number %}"><span class="sr-only">Next</span> &gt;</a>
<a class="btn btn-default" href="?{% param_replace page=page_obj.paginator.num_pages %}"><span class="sr-only">Last</span> &raquo;</a>
{% endif %}
</div>
</div>
</div>
</div>
</div>
Expand Down