diff --git a/config/settings/base.py b/config/settings/base.py index 56c6f5e..451f115 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -94,6 +94,7 @@ "rules.apps.AutodiscoverRulesConfig", "organizations", "taggit", + "django_filters", ] LOCAL_APPS = [ diff --git a/metadata_catalogue/nina/filters.py b/metadata_catalogue/nina/filters.py new file mode 100644 index 0000000..9d6b3d8 --- /dev/null +++ b/metadata_catalogue/nina/filters.py @@ -0,0 +1,22 @@ +import django_filters +from taggit.forms import TagField + +from .forms import ProjectSearchForm +from .models import Project + + +class TagFilter(django_filters.CharFilter): + field_class = TagField + + def __init__(self, *args, **kwargs): + kwargs.setdefault("lookup_expr", "in") + super().__init__(*args, **kwargs) + + +class ProjectFilter(django_filters.FilterSet): + tags = TagFilter(field_name="tags__name") + + class Meta: + model = Project + form = ProjectSearchForm + fields = ["status", "topics", "category", "departments", "customer"] diff --git a/metadata_catalogue/nina/forms.py b/metadata_catalogue/nina/forms.py new file mode 100644 index 0000000..46f1632 --- /dev/null +++ b/metadata_catalogue/nina/forms.py @@ -0,0 +1,18 @@ +from crispy_forms.helper import FormHelper +from crispy_forms.layout import Submit +from django import forms + +from .models import Project + + +class ProjectSearchForm(forms.ModelForm): + class Meta: + model = Project + fields = ["status", "topics", "category", "departments", "customer"] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.helper = FormHelper() + self.helper.form_method = "get" + + self.helper.add_input(Submit("submit", "Search")) diff --git a/metadata_catalogue/nina/views.py b/metadata_catalogue/nina/views.py index 72f078f..35eca99 100644 --- a/metadata_catalogue/nina/views.py +++ b/metadata_catalogue/nina/views.py @@ -1,15 +1,18 @@ from typing import Any -from django.core.exceptions import ObjectDoesNotExist from django.views.generic import DetailView, ListView +from django_filters.views import FilterView from metadata_catalogue.projects import views -from .models import Department +from .filters import ProjectFilter +from .models import Department, Project -class ProjectListView(views.ProjectListView): +class ProjectListView(FilterView): + model = Project paginate_by = 20 + filterset_class = ProjectFilter class ProjectUpdateView(views.ProjectUpdateView): diff --git a/metadata_catalogue/templates/nina/project_filter.html b/metadata_catalogue/templates/nina/project_filter.html new file mode 100644 index 0000000..2c9e443 --- /dev/null +++ b/metadata_catalogue/templates/nina/project_filter.html @@ -0,0 +1,23 @@ +{% extends 'base.html' %} + +{% load crispy_forms_tags %} + +{% block content %} +

Projects

+
+
{% crispy filter.form %}
+
+ +
{% include 'includes/pagination.html' %}
+
+
+{% endblock content %} diff --git a/metadata_catalogue/templates/nina/project_list.html b/metadata_catalogue/templates/nina/project_list.html deleted file mode 100644 index 3caad68..0000000 --- a/metadata_catalogue/templates/nina/project_list.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends 'base.html' %} - -{% block content %} -

Projects

-
- -
{% include 'includes/pagination.html' %}
-
-{% endblock content %} diff --git a/pdm.lock b/pdm.lock index f9abc90..4bc8f0c 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev", "docs"] strategy = ["cross_platform"] lock_version = "4.4" -content_hash = "sha256:7ca2b3503bdc7f3cbd1693495c1b46b38ed7332aa7c32d1e70a1030559ce6182" +content_hash = "sha256:f6ba5f395509aa64d27f299177c3a448670ce3c43ce92e504a735f20fe22bf59" [[package]] name = "affine" @@ -786,6 +786,19 @@ files = [ {file = "django_extensions-3.2.3-py3-none-any.whl", hash = "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401"}, ] +[[package]] +name = "django-filter" +version = "23.5" +requires_python = ">=3.7" +summary = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." +dependencies = [ + "Django>=3.2", +] +files = [ + {file = "django-filter-23.5.tar.gz", hash = "sha256:67583aa43b91fe8c49f74a832d95f4d8442be628fd4c6d65e9f811f5153a4e5c"}, + {file = "django_filter-23.5-py3-none-any.whl", hash = "sha256:99122a201d83860aef4fe77758b69dda913e874cc5e0eaa50a86b0b18d708400"}, +] + [[package]] name = "django-health-check" version = "3.17.0" diff --git a/pyproject.toml b/pyproject.toml index fb96362..9049f69 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -173,6 +173,7 @@ dependencies = [ "django-organizations>=2.3.1", "swapper>=1.3.0", "django-taggit>=5.0.1", + "django-filter>=23.5", ] requires-python = ">=3.10" name = ""