diff --git a/scipost_django/api/viewsets/mixins.py b/scipost_django/api/viewsets/mixins.py index 6513810235903b992cfba2d475a0db249baa7cc1..fdb3c5cdd7e6b16404e5613de9852c4db9f61650 100644 --- a/scipost_django/api/viewsets/mixins.py +++ b/scipost_django/api/viewsets/mixins.py @@ -17,6 +17,11 @@ class FilteringOptionsActionMixin: """ Translate the filterset base filters into list of filtering options. """ + advanced_fields_dict = { **self.filterset_class.get_fields() } + if hasattr(self, 'extra_filters'): + for (label, queryspec) in self.extra_filters.items(): + advanced_fields_dict[label] = queryspec['lookups'] + filtering_options = { 'ordering': self.ordering_fields, 'basic': [ @@ -27,7 +32,7 @@ class FilteringOptionsActionMixin: 'label': key.replace('__', '/').replace('_', ' ').title(), 'field': key, 'lookups': val - } for (key, val) in self.filterset_class.get_fields().items() + } for (key, val) in advanced_fields_dict.items() ] } return Response(filtering_options) diff --git a/scipost_django/journals/api/filtersets/publication.py b/scipost_django/journals/api/filtersets/publication.py index 7033a2cbf3050b2e347a0b6ab0ef8c9fb7dfe724..83a30d765a41891522caddd679c7f7d685c1b463 100644 --- a/scipost_django/journals/api/filtersets/publication.py +++ b/scipost_django/journals/api/filtersets/publication.py @@ -11,7 +11,6 @@ class PublicationPublicAPIFilterSet(df_filters.FilterSet): class Meta: model = Publication fields = { - 'in_journal__name': ['icontains', 'istartswith', 'exact'], 'title': ['icontains', 'contains', 'istartswith', 'iregex', 'regex'], 'author_list': ['icontains', 'contains', 'iregex', 'regex'], 'abstract': ['icontains', 'contains', 'iregex', 'regex'], diff --git a/scipost_django/journals/api/viewsets/publication.py b/scipost_django/journals/api/viewsets/publication.py index 2e5e798ee990bcc2ffca4f9fdd98083451ebc15c..0c8ed2bee8be42d21b8b79b77ba0d10375d8aef2 100644 --- a/scipost_django/journals/api/viewsets/publication.py +++ b/scipost_django/journals/api/viewsets/publication.py @@ -2,11 +2,11 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" __license__ = "AGPL v3" -from django_filters import rest_framework as df_filters +from django.db.models import Q -from rest_framework import viewsets from rest_framework.permissions import AllowAny +from api.viewsets.base import ExtraFilteredReadOnlyModelViewSet from api.viewsets.mixins import FilteringOptionsActionMixin from journals.models import Publication @@ -17,7 +17,7 @@ from journals.api.serializers import PublicationPublicSerializer class PublicationPublicAPIViewSet( FilteringOptionsActionMixin, - viewsets.ReadOnlyModelViewSet): + ExtraFilteredReadOnlyModelViewSet): queryset = Publication.objects.published() permission_classes = [AllowAny,] serializer_class = PublicationPublicSerializer @@ -26,6 +26,16 @@ class PublicationPublicAPIViewSet( search_fields = ['title', 'author_list', 'abstract', 'doi_label'] ordering_fields = ['publication_date',] filterset_class = PublicationPublicAPIFilterSet + extra_filters = { + 'journal__name': { + 'fields': [ + 'in_journal__name', + 'in_issue__in_journal__name', + 'in_issue__in_volume__in_journal__name' + ], + 'lookups': ['icontains', 'istartswith', 'iexact', 'exact'], + } + } default_filtering_fields = [ 'title__icontains', 'author_list__icontains',