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