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 %} +
{{ project.description|default_if_none:'No description' }}
+{{ project.description|default_if_none:'No description' }}
-