From a8840290f5e5e84a1236247333294ad07a79e9bb Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 11 Aug 2025 17:12:22 +0100 Subject: [PATCH] Add user-configurable pagination and enhance case view filters --- atlas/templates/atlas/case_view.html | 8 +++++--- atlas/views.py | 20 +++++++++---------- generic/mixins.py | 19 ++++++++++++++++++ .../generic/partials/page_size_form.html | 18 +++++++++++++++++ 4 files changed, 52 insertions(+), 13 deletions(-) create mode 100644 generic/templates/generic/partials/page_size_form.html diff --git a/atlas/templates/atlas/case_view.html b/atlas/templates/atlas/case_view.html index d1c83a98..6b052ccd 100755 --- a/atlas/templates/atlas/case_view.html +++ b/atlas/templates/atlas/case_view.html @@ -7,7 +7,9 @@ {% block content %}
-

My Cases

+

Cases

+ Quick filters:
+ Show my cases only, all cases

Filter

@@ -20,7 +22,6 @@
View my cases. -
@@ -78,7 +79,8 @@
{% render_table table %}
- + +{% include "generic/partials/page_size_form.html" %}
{% endblock %} diff --git a/atlas/views.py b/atlas/views.py index bec2ce55..e72a69a5 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -27,7 +27,7 @@ from django.views.generic import View from django.views.generic.detail import DetailView import pydicom from pydicom.uid import generate_uid -from generic.mixins import SuperuserRequiredMixin +from generic.mixins import SuperuserRequiredMixin, UserConfigurablePaginationMixin from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView from django.views.generic import ListView @@ -1580,7 +1580,7 @@ def get_examination_id(request): return HttpResponse("/") -class CaseView(LoginRequiredMixin, SingleTableMixin, FilterView): +class CaseView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = Case table_class = CaseTable template_name = "atlas/case_view.html" @@ -1588,7 +1588,7 @@ class CaseView(LoginRequiredMixin, SingleTableMixin, FilterView): filterset_class = CaseFilter -class SeriesView(LoginRequiredMixin, SingleTableMixin, FilterView): +class SeriesView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = Series table_class = SeriesTable template_name = "atlas/series_view.html" @@ -1596,7 +1596,7 @@ class SeriesView(LoginRequiredMixin, SingleTableMixin, FilterView): filterset_class = SeriesFilter -class ConditionView(LoginRequiredMixin, SingleTableMixin, FilterView): +class ConditionView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = Condition table_class = ConditionTable template_name = "atlas/view.html" @@ -1604,7 +1604,7 @@ class ConditionView(LoginRequiredMixin, SingleTableMixin, FilterView): filterset_class = ConditionFilter -class QuestionSchemaView(LoginRequiredMixin, SingleTableMixin, FilterView): +class QuestionSchemaView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = QuestionSchema table_class = QuestionSchemaTable template_name = "atlas/schema_table_view.html" @@ -1612,7 +1612,7 @@ class QuestionSchemaView(LoginRequiredMixin, SingleTableMixin, FilterView): filterset_class = QuestionSchemaFilter -class SubspecialtyView(LoginRequiredMixin, SingleTableMixin, FilterView): +class SubspecialtyView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = Subspecialty table_class = SubspecialtyTable template_name = "atlas/view.html" @@ -1620,7 +1620,7 @@ class SubspecialtyView(LoginRequiredMixin, SingleTableMixin, FilterView): filterset_class = SubspecialtyFilter -class PresentationView(LoginRequiredMixin, SingleTableMixin, FilterView): +class PresentationView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = Presentation table_class = PresentationTable template_name = "atlas/view.html" @@ -1628,7 +1628,7 @@ class PresentationView(LoginRequiredMixin, SingleTableMixin, FilterView): filterset_class = PresentationFilter -class PathologicalProcessView(LoginRequiredMixin, SingleTableMixin, FilterView): +class PathologicalProcessView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = PathologicalProcess table_class = PathologicalProcessTable template_name = "atlas/view.html" @@ -1636,7 +1636,7 @@ class PathologicalProcessView(LoginRequiredMixin, SingleTableMixin, FilterView): filterset_class = PathologicalProcessFilter -class StructureView(LoginRequiredMixin, SingleTableMixin, FilterView): +class StructureView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = Structure table_class = StructureTable template_name = "atlas/view.html" @@ -1644,7 +1644,7 @@ class StructureView(LoginRequiredMixin, SingleTableMixin, FilterView): filterset_class = StructureFilter -class FindingView(LoginRequiredMixin, SingleTableMixin, FilterView): +class FindingView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = Finding table_class = FindingTable template_name = "atlas/view.html" diff --git a/generic/mixins.py b/generic/mixins.py index 9b3c9393..872a7fd6 100644 --- a/generic/mixins.py +++ b/generic/mixins.py @@ -62,3 +62,22 @@ class AuthorMixin(): def remove_author(self, user: User): """Remove an author from the object""" self.author.remove(user) + + +class UserConfigurablePaginationMixin: + default_per_page = 25 + allowed_per_page = [25, 50, 100, 250, 500] + + def get_table_pagination(self, table): + try: + per_page = int(self.request.GET.get("per_page", self.default_per_page)) + if per_page not in self.allowed_per_page: + per_page = self.default_per_page + except (TypeError, ValueError): + per_page = self.default_per_page + return {"per_page": per_page} + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["page_sizes"] = [25, 50, 100, 250, 500] + return context \ No newline at end of file diff --git a/generic/templates/generic/partials/page_size_form.html b/generic/templates/generic/partials/page_size_form.html new file mode 100644 index 00000000..65afb72d --- /dev/null +++ b/generic/templates/generic/partials/page_size_form.html @@ -0,0 +1,18 @@ +
+ {# Keep existing filters/searches #} + {% for key, value in request.GET.items %} + {% if key != 'per_page' %} + + {% endif %} + {% endfor %} +
+ +
+
+ +
+
\ No newline at end of file