From d135a397e448dccaa2b0328d0187949d0137a0ad Mon Sep 17 00:00:00 2001 From: "J.-S. Caux" <J.S.Caux@uva.nl> Date: Thu, 18 Oct 2018 21:24:12 +0200 Subject: [PATCH] Install example version of publications API for Google Scholar --- SciPost_v1/settings/base.py | 6 +++++ SciPost_v1/urls.py | 2 ++ journals/api.py | 16 ----------- journals/serializers.py | 53 +++++++++++++++++++++++++++++++++++++ journals/viewsets.py | 16 +++++++++++ 5 files changed, 77 insertions(+), 16 deletions(-) delete mode 100644 journals/api.py create mode 100644 journals/serializers.py create mode 100644 journals/viewsets.py diff --git a/SciPost_v1/settings/base.py b/SciPost_v1/settings/base.py index 6a0dc4632..966b7dd41 100644 --- a/SciPost_v1/settings/base.py +++ b/SciPost_v1/settings/base.py @@ -125,6 +125,12 @@ INSTALLED_APPS = ( SITE_ID = 1 +REST_FRAMEWORK = { + 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', + 'PAGE_SIZE': 25 +} + + HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', diff --git a/SciPost_v1/urls.py b/SciPost_v1/urls.py index 4658eec26..3a2b9914e 100644 --- a/SciPost_v1/urls.py +++ b/SciPost_v1/urls.py @@ -7,6 +7,7 @@ from ajax_select import urls as ajax_select_urls from rest_framework import routers from conflicts.viewsets import ConflictOfInterestViewSet +from journals.viewsets import PublicationViewSetForGoogleScholar from news.viewsets import NewsItemViewSet from journals.constants import REGEX_CHOICES @@ -18,6 +19,7 @@ JOURNAL_REGEX = '(?P<doi_label>%s)' % REGEX_CHOICES router = routers.SimpleRouter() router.register(r'news', NewsItemViewSet) router.register(r'conflicts', ConflictOfInterestViewSet) +router.register(r'publications/GoogleScholar', PublicationViewSetForGoogleScholar) # Base URLs diff --git a/journals/api.py b/journals/api.py deleted file mode 100644 index 2cdb98c69..000000000 --- a/journals/api.py +++ /dev/null @@ -1,16 +0,0 @@ -__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)" -__license__ = "AGPL v3" - - -from rest_framework.generics import ListAPIView - -from .models import Publication -from .serializers import PublicationSerializer - - -class PublicationList(ListAPIView): - """ - List all publications that are published. - """ - queryset = Publication.objects.published() - serializer_class = PublicationSerializer diff --git a/journals/serializers.py b/journals/serializers.py new file mode 100644 index 000000000..9de735e38 --- /dev/null +++ b/journals/serializers.py @@ -0,0 +1,53 @@ +__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)" +__license__ = "AGPL v3" + + +from rest_framework import serializers + +from .models import Publication + + +class StringListField(serializers.ListField): + child = serializers.CharField() + + +class PublicationSerializerForGoogleScholar(serializers.BaseSerializer): + citation_title = serializers.CharField(max_length=512) + citation_authors = StringListField() + citation_doi = serializers.CharField(max_length=256) + citation_publication_date = serializers.DateField() + citation_journal_title = serializers.CharField(max_length=128) + citation_issn = serializers.CharField(max_length=16) + citation_volume = serializers.IntegerField() + citation_issue = serializers.IntegerField() + citation_firstpage = serializers.CharField(max_length=16) + citation_pdf_url = serializers.URLField() + dc_identifier = serializers.CharField(max_length=64) + + def to_representation(self, instance): + """ + Convert to a Google Scholar-appropriate JSON format. + """ + authors = [] + for author in instance.authors.all(): + if author.contributor: + authors.append('%s, %s' % (author.contributor.user.last_name, + author.contributor.user.first_name)) + elif author.unregistered_author: + authors.append('%s, %s' % (author.unregistered_author.last_name, + author.unregistered_author.first_name)) + rep = { + 'citation_title': instance.title, + 'citation_authors': authors, + 'citation_doi': instance.doi_string, + 'citation_publication_date': instance.publication_date.strftime('%Y/%m/%d'), + 'citation_journal_title': str(instance.get_journal()), + 'citation_issn': instance.get_journal().issn, + } + if instance.in_issue: + rep['citation_volume'] = instance.in_issue.in_volume.number + rep['citation_issue'] = instance.in_issue.number + rep['citation_firstpage'] = instance.get_paper_nr() + rep['citation_pdf_url'] = 'https://scipost.org%s/pdf' % instance.get_absolute_url() + rep['dc_identifier'] = instance.doi_string + return rep diff --git a/journals/viewsets.py b/journals/viewsets.py new file mode 100644 index 000000000..c2a283f17 --- /dev/null +++ b/journals/viewsets.py @@ -0,0 +1,16 @@ +__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)" +__license__ = "AGPL v3" + + +from django.http import Http404 + +from rest_framework import viewsets, renderers +from rest_framework.response import Response + +from .models import Publication +from .serializers import PublicationSerializerForGoogleScholar + + +class PublicationViewSetForGoogleScholar(viewsets.ReadOnlyModelViewSet): + queryset = Publication.objects.published().order_by('-publication_date') + serializer_class = PublicationSerializerForGoogleScholar -- GitLab