SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 92199698 authored by Jean-Sébastien Caux's avatar Jean-Sébastien Caux
Browse files

Solve search by journal name bug; introduce extra_filters concept

parent 48bb708c
No related branches found
No related tags found
No related merge requests found
...@@ -17,6 +17,11 @@ class FilteringOptionsActionMixin: ...@@ -17,6 +17,11 @@ class FilteringOptionsActionMixin:
""" """
Translate the filterset base filters into list of filtering options. 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 = { filtering_options = {
'ordering': self.ordering_fields, 'ordering': self.ordering_fields,
'basic': [ 'basic': [
...@@ -27,7 +32,7 @@ class FilteringOptionsActionMixin: ...@@ -27,7 +32,7 @@ class FilteringOptionsActionMixin:
'label': key.replace('__', '/').replace('_', ' ').title(), 'label': key.replace('__', '/').replace('_', ' ').title(),
'field': key, 'field': key,
'lookups': val 'lookups': val
} for (key, val) in self.filterset_class.get_fields().items() } for (key, val) in advanced_fields_dict.items()
] ]
} }
return Response(filtering_options) return Response(filtering_options)
...@@ -11,7 +11,6 @@ class PublicationPublicAPIFilterSet(df_filters.FilterSet): ...@@ -11,7 +11,6 @@ class PublicationPublicAPIFilterSet(df_filters.FilterSet):
class Meta: class Meta:
model = Publication model = Publication
fields = { fields = {
'in_journal__name': ['icontains', 'istartswith', 'exact'],
'title': ['icontains', 'contains', 'istartswith', 'iregex', 'regex'], 'title': ['icontains', 'contains', 'istartswith', 'iregex', 'regex'],
'author_list': ['icontains', 'contains', 'iregex', 'regex'], 'author_list': ['icontains', 'contains', 'iregex', 'regex'],
'abstract': ['icontains', 'contains', 'iregex', 'regex'], 'abstract': ['icontains', 'contains', 'iregex', 'regex'],
......
...@@ -2,11 +2,11 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" ...@@ -2,11 +2,11 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3" __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 rest_framework.permissions import AllowAny
from api.viewsets.base import ExtraFilteredReadOnlyModelViewSet
from api.viewsets.mixins import FilteringOptionsActionMixin from api.viewsets.mixins import FilteringOptionsActionMixin
from journals.models import Publication from journals.models import Publication
...@@ -17,7 +17,7 @@ from journals.api.serializers import PublicationPublicSerializer ...@@ -17,7 +17,7 @@ from journals.api.serializers import PublicationPublicSerializer
class PublicationPublicAPIViewSet( class PublicationPublicAPIViewSet(
FilteringOptionsActionMixin, FilteringOptionsActionMixin,
viewsets.ReadOnlyModelViewSet): ExtraFilteredReadOnlyModelViewSet):
queryset = Publication.objects.published() queryset = Publication.objects.published()
permission_classes = [AllowAny,] permission_classes = [AllowAny,]
serializer_class = PublicationPublicSerializer serializer_class = PublicationPublicSerializer
...@@ -26,6 +26,16 @@ class PublicationPublicAPIViewSet( ...@@ -26,6 +26,16 @@ class PublicationPublicAPIViewSet(
search_fields = ['title', 'author_list', 'abstract', 'doi_label'] search_fields = ['title', 'author_list', 'abstract', 'doi_label']
ordering_fields = ['publication_date',] ordering_fields = ['publication_date',]
filterset_class = PublicationPublicAPIFilterSet 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 = [ default_filtering_fields = [
'title__icontains', 'title__icontains',
'author_list__icontains', 'author_list__icontains',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment