Add sorting functionality to normal cases list with user-selected options
This commit is contained in:
@@ -19,7 +19,13 @@
|
||||
<div class="col-12">
|
||||
<form method="get" class="form-inline">
|
||||
{% crispy filter.form %}
|
||||
<div class="mb-2">
|
||||
<div class="mb-2 d-flex flex-wrap gap-2 align-items-center">
|
||||
<label class="mb-0" for="id_sort">Sort by</label>
|
||||
<select class="form-select w-auto" id="id_sort" name="sort">
|
||||
{% for value, label in sort_choices %}
|
||||
<option value="{{ value }}" {% if selected_sort == value %}selected{% endif %}>{{ label }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<button class="btn btn-primary" type="submit">Filter</button>
|
||||
<a class="btn btn-link" href="?">Clear</a>
|
||||
</div>
|
||||
@@ -65,11 +71,11 @@
|
||||
<nav aria-label="Page navigation">
|
||||
<ul class="pagination mt-3">
|
||||
{% if page_obj.has_previous %}
|
||||
<li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}">Previous</a></li>
|
||||
<li class="page-item"><a class="page-link" href="?{% if querystring_without_page %}{{ querystring_without_page }}&{% endif %}page={{ page_obj.previous_page_number }}">Previous</a></li>
|
||||
{% endif %}
|
||||
<li class="page-item disabled"><span class="page-link">Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}</span></li>
|
||||
{% if page_obj.has_next %}
|
||||
<li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}">Next</a></li>
|
||||
<li class="page-item"><a class="page-link" href="?{% if querystring_without_page %}{{ querystring_without_page }}&{% endif %}page={{ page_obj.next_page_number }}">Next</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
+35
-1
@@ -386,13 +386,47 @@ class NormalCaseList(LoginRequiredMixin, FilterView):
|
||||
filterset_class = NormalCaseFilter
|
||||
paginate_by = 25
|
||||
|
||||
SORT_CHOICES = {
|
||||
"newest": "-added_date",
|
||||
"oldest": "added_date",
|
||||
"age_asc": "age_days",
|
||||
"age_desc": "-age_days",
|
||||
"title_asc": "case__title",
|
||||
"title_desc": "-case__title",
|
||||
}
|
||||
|
||||
def get_selected_sort(self):
|
||||
sort_key = self.request.GET.get("sort", "newest")
|
||||
if sort_key not in self.SORT_CHOICES:
|
||||
return "newest"
|
||||
return sort_key
|
||||
|
||||
def get_queryset(self):
|
||||
qs = NormalCase.objects.select_related("case", "examination", "modality")
|
||||
# Restrict similar to CaseFilter: non-editors only see authored or open_access
|
||||
if not self.request.user.groups.filter(name="atlas_editor").exists():
|
||||
qs = qs.filter((Q(case__author__id=self.request.user.id) | Q(case__open_access=True)))
|
||||
|
||||
return qs.order_by("-added_date")
|
||||
order_by = self.SORT_CHOICES[self.get_selected_sort()]
|
||||
return qs.order_by(order_by)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context["selected_sort"] = self.get_selected_sort()
|
||||
context["sort_choices"] = [
|
||||
("newest", "Newest added"),
|
||||
("oldest", "Oldest added"),
|
||||
("age_asc", "Age (youngest first)"),
|
||||
("age_desc", "Age (oldest first)"),
|
||||
("title_asc", "Title (A–Z)"),
|
||||
("title_desc", "Title (Z–A)"),
|
||||
]
|
||||
|
||||
params = self.request.GET.copy()
|
||||
if "page" in params:
|
||||
params.pop("page")
|
||||
context["querystring_without_page"] = params.urlencode()
|
||||
return context
|
||||
|
||||
@login_required
|
||||
@user_has_case_view_access
|
||||
|
||||
Reference in New Issue
Block a user