From ca2b7feb5baa469dad09d11e2c9ca498008d910b Mon Sep 17 00:00:00 2001 From: Ross Date: Fri, 14 Nov 2025 20:56:49 +0000 Subject: [PATCH] Add Resource filtering and table display functionality --- atlas/filters.py | 21 +++++++++++++++++++++ atlas/tables.py | 13 +++++++++++++ atlas/templates/atlas/resource_list.html | 14 +++++++------- atlas/views.py | 10 ++++++++-- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/atlas/filters.py b/atlas/filters.py index f173e7ae..1da6b22f 100755 --- a/atlas/filters.py +++ b/atlas/filters.py @@ -12,6 +12,8 @@ from .models import ( Structure, Subspecialty, NormalCase, + Resource, + Site, ) from django.contrib.auth.models import User from django.db.models import Q @@ -335,6 +337,25 @@ class NormalCaseFilter(django_filters.FilterSet): return queryset return queryset.filter(age_days__lte=days) + +class ResourceFilter(django_filters.FilterSet): + name = django_filters.CharFilter(field_name='name', lookup_expr='icontains') + site = django_filters.ModelMultipleChoiceFilter(field_name='sites', queryset=lambda request: Site.objects.all() if True else Site.objects.none()) + subspecialty = django_filters.ModelMultipleChoiceFilter(field_name='subspecialty', queryset=Subspecialty.objects.all()) + author = django_filters.ModelMultipleChoiceFilter(queryset=get_authors, null_label='No author') + has_file = django_filters.BooleanFilter(method='filter_has_file', label='Has file') + + class Meta: + model = Resource + fields = ('name', 'site', 'subspecialty', 'author') + + def filter_has_file(self, queryset, name, value): + if value is True: + return queryset.exclude(file__isnull=True).exclude(file__exact='') + elif value is False: + return queryset.filter(file__isnull=True) | queryset.filter(file__exact='') + return queryset + class QuestionSchemaFilter(django_filters.FilterSet): class Meta: model = QuestionSchema diff --git a/atlas/tables.py b/atlas/tables.py index b6f8db6b..60eabac8 100755 --- a/atlas/tables.py +++ b/atlas/tables.py @@ -14,6 +14,7 @@ from .models import ( Structure, Finding, Subspecialty, + Resource, ) from django.utils.html import format_html @@ -414,6 +415,18 @@ class SubspecialtyTable(SelectionTable): return format_html(record.get_synonym_link()) return f"{record.get_synonym_link()}" + +class ResourceTable(SelectionTable): + name = tables.Column(linkify=("atlas:resource_detail", {"pk": tables.A("pk")}), verbose_name="Resource") + + edit = tables.LinkColumn("atlas:resource_update", text="Edit", args=[A("pk")], orderable=False) + delete = tables.LinkColumn("atlas:resource_delete", text="Delete", args=[A("pk")], orderable=False) + + class Meta(SelectionTable.Meta): + model = Resource + template_name = "django_tables2/bootstrap4.html" + fields = ("name", "description") + class CaseCollectionTable(SelectionTable): edit = tables.LinkColumn( "atlas:exam_update", text="Edit", args=[A("pk")], orderable=False diff --git a/atlas/templates/atlas/resource_list.html b/atlas/templates/atlas/resource_list.html index 7a4747f2..5af2cf52 100755 --- a/atlas/templates/atlas/resource_list.html +++ b/atlas/templates/atlas/resource_list.html @@ -1,16 +1,16 @@ {% extends 'atlas/base.html' %} +{% load render_table from django_tables2 %} {% block content %} Create a new resource

Resources

- +
+ {% render_table table %} +
+ + {% include "generic/partials/page_size_form.html" %} + {% include "generic/partials/filter_bar.html" with filter=filter app_name=app_name collapse_id="bottom-filter-body" %} {% endblock %} diff --git a/atlas/views.py b/atlas/views.py index f7356be3..f128d405 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -33,6 +33,10 @@ from generic.mixins import SuperuserRequiredMixin, UserConfigurablePaginationMix from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView from django.views.generic import ListView +from django_filters.views import FilterView +from django_tables2 import SingleTableMixin +from .filters import ResourceFilter +from .tables import ResourceTable from django.views.decorators.csrf import csrf_exempt from django.urls import reverse_lazy, reverse @@ -1311,9 +1315,11 @@ class ResourceCreate(LoginRequiredMixin, CreateView): return super().form_valid(form) -class ResourceView(LoginRequiredMixin, ListView): +class ResourceView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView): model = Resource - # form_class = ResourceForm + table_class = ResourceTable + template_name = "atlas/resource_list.html" + filterset_class = ResourceFilter class CaseCollectionCreate(RevisionMixin, LoginRequiredMixin, CreateView):