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"
from rest_framework import serializers
from ..models import Publication
class PublicationSerializer(serializers.ModelSerializer):
url = serializers.URLField(source='get_absolute_url')
class Meta:
model = Publication
fields = [
'title',
'author_list',
'abstract',
'doi_label',
'publication_date',
'url'
]
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed (from DRF docs).
"""
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
......
......@@ -7,8 +7,15 @@ from django.urls import include, path
from rest_framework import routers
from journals.viewsets import PublicationViewSet, PubFractionViewSet
from organizations.api.viewsets import OrganizationViewSet, OrganizationNAPViewSet
from journals.api.viewsets import (
PublicationPublicAPIViewSet,
PubFractionPublicAPIViewSet
)
from organizations.api.viewsets import (
OrganizationViewSet,
OrganizationNAPViewSet
)
# The non-api viewsets below should be deprecated:
from submissions.viewsets import SubmissionViewSet
# Next two: old style, to be deprecated:
......@@ -23,8 +30,8 @@ app_name = 'api'
router = routers.SimpleRouter()
# journals
router.register('publications', PublicationViewSet)
router.register('pubfractions', PubFractionViewSet)
router.register('publications', PublicationPublicAPIViewSet)
router.register('pubfractions', PubFractionPublicAPIViewSet)
# organizations
router.register('organizations', OrganizationViewSet)
......@@ -49,6 +56,6 @@ urlpatterns += [
name='omniauth_userinfo'
),
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)"
__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"
from django_filters import rest_framework as df_filters
from rest_framework import viewsets
from rest_framework.permissions import AllowAny
from ...models import Publication
from api.viewsets.mixins import FilteringOptionsActionMixin
from ..models import Publication
from ..serializers import PublicationSerializer
class PublicationFilterSet(df_filters.FilterSet):
class PublicationPublicFilterSet(df_filters.FilterSet):
class Meta:
model = Publication
fields = {
......@@ -31,19 +25,3 @@ class PublicationFilterSet(df_filters.FilterSet):
'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'
]
......@@ -2,5 +2,6 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from .publication import PublicationViewSet
from .pubfraction import PubFractionViewSet
from .publication import PublicationPublicSerializer
from .pubfraction import PubFractionPublicSerializer
......@@ -4,16 +4,16 @@ __license__ = "AGPL v3"
from rest_framework import serializers
from ..models import OrgPubFraction
from journals.serializers import PublicationSerializer
from journals.models import OrgPubFraction
from journals.api.serializers import PublicationPublicSerializer
from organizations.api.serializers import OrganizationSerializer
class PubFractionSerializer(serializers.ModelSerializer):
class PubFractionPublicSerializer(serializers.ModelSerializer):
organization = OrganizationSerializer(
fields=['url', 'name', 'acronym', 'country']
)
publication = PublicationSerializer(
publication = PublicationPublicSerializer(
fields=[
'url',
'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
from django.db.models import Sum
from ..models import Publication, OrgPubFraction
from .serializers import PublicationSerializer, OrgPubFractionSerializer
from .serializers_deprec import PublicationSerializer, OrgPubFractionSerializer
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
from api.viewsets.mixins import FilteringOptionsActionMixin
from ..models import OrgPubFraction
from ..serializers import PubFractionSerializer
class PubFractionFilterSet(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']
}
class PubFractionViewSet(FilteringOptionsActionMixin,
viewsets.ReadOnlyModelViewSet):
from journals.models import OrgPubFraction
from journals.api.serializers import PubFractionPublicSerializer
from journals.api.filtersets import PubFractionPublicFilterSet
class PubFractionPublicAPIViewSet(
FilteringOptionsActionMixin,
viewsets.ReadOnlyModelViewSet):
queryset = OrgPubFraction.objects.all()
permission_classes = [AllowAny,]
serializer_class = PubFractionSerializer
serializer_class = PubFractionPublicSerializer
search_fields = [
'organization__name',
'publication__publication_date__year'
]
ordering_fields = ['-publication_date',]
filterset_class = PubFractionFilterSet
filterset_class = PubFractionPublicFilterSet
default_filtering_fields = [
'organization__name__icontains',
'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
from api.viewsets.mixins import FilteringOptionsActionMixin
from ..models import Organization
from journals.api.serializers import OrgPubFractionSerializer
from journals.api.serializers import PubFractionPublicSerializer
from .serializers import (
OrganizationSerializer,
OrganizationNAPSerializer,
......@@ -53,7 +53,7 @@ class OrganizationViewSet(FilteringOptionsActionMixin,
@action(detail=True)
def pubfractions(self, request, pk=None):
pubfractions = self.get_object().pubfractions.all()
serializer = OrgPubFractionSerializer(
serializer = PubFractionPublicSerializer(
pubfractions,
many=True,
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