SciPost Code Repository

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

Refactor API

parent 8bd4106f
No related branches found
No related tags found
No related merge requests found
Showing
with 156 additions and 51 deletions
...@@ -4,22 +4,12 @@ __license__ = "AGPL v3" ...@@ -4,22 +4,12 @@ __license__ = "AGPL v3"
from rest_framework import serializers from rest_framework import serializers
from ..models import Publication
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
class PublicationSerializer(serializers.ModelSerializer): """
url = serializers.URLField(source='get_absolute_url') A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed (from DRF docs).
class Meta: """
model = Publication
fields = [
'title',
'author_list',
'abstract',
'doi_label',
'publication_date',
'url'
]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass # Don't pass the 'fields' arg up to the superclass
......
...@@ -7,8 +7,15 @@ from django.urls import include, path ...@@ -7,8 +7,15 @@ from django.urls import include, path
from rest_framework import routers from rest_framework import routers
from journals.viewsets import PublicationViewSet, PubFractionViewSet from journals.api.viewsets import (
from organizations.api.viewsets import OrganizationViewSet, OrganizationNAPViewSet PublicationPublicAPIViewSet,
PubFractionPublicAPIViewSet
)
from organizations.api.viewsets import (
OrganizationViewSet,
OrganizationNAPViewSet
)
# The non-api viewsets below should be deprecated:
from submissions.viewsets import SubmissionViewSet from submissions.viewsets import SubmissionViewSet
# Next two: old style, to be deprecated: # Next two: old style, to be deprecated:
...@@ -23,8 +30,8 @@ app_name = 'api' ...@@ -23,8 +30,8 @@ app_name = 'api'
router = routers.SimpleRouter() router = routers.SimpleRouter()
# journals # journals
router.register('publications', PublicationViewSet) router.register('publications', PublicationPublicAPIViewSet)
router.register('pubfractions', PubFractionViewSet) router.register('pubfractions', PubFractionPublicAPIViewSet)
# organizations # organizations
router.register('organizations', OrganizationViewSet) router.register('organizations', OrganizationViewSet)
...@@ -49,6 +56,6 @@ urlpatterns += [ ...@@ -49,6 +56,6 @@ urlpatterns += [
name='omniauth_userinfo' name='omniauth_userinfo'
), ),
path('finances/', include('finances.api.urls')), path('finances/', include('finances.api.urls')),
path('journals/', include('journals.api.urls')), path('deprec/journals/', include('journals.api.urls')), # TODO remove
] ]
...@@ -2,6 +2,6 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" ...@@ -2,6 +2,6 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3" __license__ = "AGPL v3"
from .publication import PublicationSerializer from .publication import PublicationPublicFilterSet
from .pubfraction import PubFractionSerializer from .pubfraction import PubFractionPublicFilterSet
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django_filters import rest_framework as df_filters
from journals.models import OrgPubFraction
class PubFractionPublicFilterSet(df_filters.FilterSet):
class Meta:
model = OrgPubFraction
fields = {
'organization__name': ['icontains', 'istartswith', 'exact'],
'organization__country': ['exact',],
'publication__publication_date': [
'year', 'month', 'exact',
'year__gte', 'year__lte', 'year__range',
'gte', 'lte', 'range'
],
'fraction': ['gte', 'lte', 'exact']
}
...@@ -4,16 +4,10 @@ __license__ = "AGPL v3" ...@@ -4,16 +4,10 @@ __license__ = "AGPL v3"
from django_filters import rest_framework as df_filters from django_filters import rest_framework as df_filters
from rest_framework import viewsets from ...models import Publication
from rest_framework.permissions import AllowAny
from api.viewsets.mixins import FilteringOptionsActionMixin
from ..models import Publication class PublicationPublicFilterSet(df_filters.FilterSet):
from ..serializers import PublicationSerializer
class PublicationFilterSet(df_filters.FilterSet):
class Meta: class Meta:
model = Publication model = Publication
fields = { fields = {
...@@ -31,19 +25,3 @@ class PublicationFilterSet(df_filters.FilterSet): ...@@ -31,19 +25,3 @@ class PublicationFilterSet(df_filters.FilterSet):
'specialties__name': ['icontains',], 'specialties__name': ['icontains',],
'topics__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'
]
...@@ -2,5 +2,6 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" ...@@ -2,5 +2,6 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3" __license__ = "AGPL v3"
from .publication import PublicationViewSet from .publication import PublicationPublicSerializer
from .pubfraction import PubFractionViewSet
from .pubfraction import PubFractionPublicSerializer
...@@ -4,16 +4,16 @@ __license__ = "AGPL v3" ...@@ -4,16 +4,16 @@ __license__ = "AGPL v3"
from rest_framework import serializers from rest_framework import serializers
from ..models import OrgPubFraction from journals.models import OrgPubFraction
from journals.serializers import PublicationSerializer from journals.api.serializers import PublicationPublicSerializer
from organizations.api.serializers import OrganizationSerializer from organizations.api.serializers import OrganizationSerializer
class PubFractionSerializer(serializers.ModelSerializer): class PubFractionPublicSerializer(serializers.ModelSerializer):
organization = OrganizationSerializer( organization = OrganizationSerializer(
fields=['url', 'name', 'acronym', 'country'] fields=['url', 'name', 'acronym', 'country']
) )
publication = PublicationSerializer( publication = PublicationPublicSerializer(
fields=[ fields=[
'url', 'url',
'title', 'author_list', 'title', 'author_list',
......
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from rest_framework import serializers
from api.serializers import DynamicFieldsModelSerializer
from ...models import Publication
class PublicationPublicSerializer(DynamicFieldsModelSerializer):
url = serializers.URLField(source='get_absolute_url')
class Meta:
model = Publication
fields = [
'title',
'author_list',
'abstract',
'doi_label',
'publication_date',
'url'
]
...@@ -7,7 +7,7 @@ from rest_framework.generics import ListAPIView, RetrieveAPIView ...@@ -7,7 +7,7 @@ from rest_framework.generics import ListAPIView, RetrieveAPIView
from django.db.models import Sum from django.db.models import Sum
from ..models import Publication, OrgPubFraction from ..models import Publication, OrgPubFraction
from .serializers import PublicationSerializer, OrgPubFractionSerializer from .serializers_deprec import PublicationSerializer, OrgPubFractionSerializer
class PublicationListAPIView(ListAPIView): class PublicationListAPIView(ListAPIView):
......
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from .publication import PublicationPublicAPIViewSet
from .pubfraction import PubFractionPublicAPIViewSet
...@@ -9,36 +9,24 @@ from rest_framework.permissions import AllowAny ...@@ -9,36 +9,24 @@ from rest_framework.permissions import AllowAny
from api.viewsets.mixins import FilteringOptionsActionMixin from api.viewsets.mixins import FilteringOptionsActionMixin
from ..models import OrgPubFraction from journals.models import OrgPubFraction
from ..serializers import PubFractionSerializer from journals.api.serializers import PubFractionPublicSerializer
from journals.api.filtersets import PubFractionPublicFilterSet
class PubFractionFilterSet(df_filters.FilterSet):
class Meta:
model = OrgPubFraction class PubFractionPublicAPIViewSet(
fields = { FilteringOptionsActionMixin,
'organization__name': ['icontains', 'istartswith', 'exact'], viewsets.ReadOnlyModelViewSet):
'organization__country': ['exact',],
'publication__publication_date': [
'year', 'month', 'exact',
'year__gte', 'year__lte', 'year__range',
'gte', 'lte', 'range'
],
'fraction': ['gte', 'lte', 'exact']
}
class PubFractionViewSet(FilteringOptionsActionMixin,
viewsets.ReadOnlyModelViewSet):
queryset = OrgPubFraction.objects.all() queryset = OrgPubFraction.objects.all()
permission_classes = [AllowAny,] permission_classes = [AllowAny,]
serializer_class = PubFractionSerializer serializer_class = PubFractionPublicSerializer
search_fields = [ search_fields = [
'organization__name', 'organization__name',
'publication__publication_date__year' 'publication__publication_date__year'
] ]
ordering_fields = ['-publication_date',] ordering_fields = ['-publication_date',]
filterset_class = PubFractionFilterSet filterset_class = PubFractionPublicFilterSet
default_filtering_fields = [ default_filtering_fields = [
'organization__name__icontains', 'organization__name__icontains',
'publication__publication_date__year__exact', 'publication__publication_date__year__exact',
......
__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 journals.models import Publication
from journals.api.filtersets import PublicationPublicFilterSet
from journals.api.serializers import PublicationPublicSerializer
class PublicationPublicAPIViewSet(
FilteringOptionsActionMixin,
viewsets.ReadOnlyModelViewSet):
queryset = Publication.objects.published()
permission_classes = [AllowAny,]
serializer_class = PublicationPublicSerializer
search_fields = ['title', 'author_list', 'abstract', 'doi_label']
ordering_fields = ['publication_date',]
filterset_class = PublicationPublicFilterSet
default_filtering_fields = [
'title__icontains',
'author_list__icontains',
'abstract__icontains',
'doi_label__icontains'
]
...@@ -16,7 +16,7 @@ from rest_framework_csv import renderers as r ...@@ -16,7 +16,7 @@ from rest_framework_csv import renderers as r
from api.viewsets.mixins import FilteringOptionsActionMixin from api.viewsets.mixins import FilteringOptionsActionMixin
from ..models import Organization from ..models import Organization
from journals.api.serializers import OrgPubFractionSerializer from journals.api.serializers import PubFractionPublicSerializer
from .serializers import ( from .serializers import (
OrganizationSerializer, OrganizationSerializer,
OrganizationNAPSerializer, OrganizationNAPSerializer,
...@@ -53,7 +53,7 @@ class OrganizationViewSet(FilteringOptionsActionMixin, ...@@ -53,7 +53,7 @@ class OrganizationViewSet(FilteringOptionsActionMixin,
@action(detail=True) @action(detail=True)
def pubfractions(self, request, pk=None): def pubfractions(self, request, pk=None):
pubfractions = self.get_object().pubfractions.all() pubfractions = self.get_object().pubfractions.all()
serializer = OrgPubFractionSerializer( serializer = PubFractionPublicSerializer(
pubfractions, pubfractions,
many=True, many=True,
context={'request': self.request} context={'request': self.request}
......
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