SciPost Code Repository

Skip to content
Snippets Groups Projects
publication.py 1.66 KiB
Newer Older
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django_filters import rest_framework as df_filters

from rest_framework import viewsets
from rest_framework.permissions import AllowAny

from api.viewsets.mixins import FilteringOptionsActionMixin

from ..models import Publication
from ..serializers import PublicationSerializer


class PublicationFilterSet(df_filters.FilterSet):
    class Meta:
        model = Publication
        fields = {
            'in_journal__name': ['icontains', 'istartswith', 'exact'],
            'title': ['icontains', 'istartswith', 'iregex'],
            'author_list': ['icontains', 'iregex'],
            'abstract': ['icontains', 'iregex'],
            'publication_date': [
                'year', 'month', 'exact',
                'year__gte', 'year__lte', 'year__range',
                'gte', 'lte', 'range'
            ],
            'doi_label': ['icontains',],
            'acad_field__name': ['icontains',],
            'specialties__name': ['icontains',],
            'topics__name': ['icontains',],
        }


class PublicationViewSet(FilteringOptionsActionMixin,
                         viewsets.ReadOnlyModelViewSet):
    queryset = Publication.objects.published().order_by('-publication_date')
    permission_classes = [AllowAny,]
    serializer_class = PublicationSerializer
    search_fields = ['title', 'author_list', 'abstract', 'doi_label']
    ordering_fields = ['publication_date',]
    filterset_class = PublicationFilterSet
    default_filtering_fields = [
        'title__icontains',
        'author_list__icontains',
        'abstract__icontains',
        'doi_label__icontains'