SciPost Code Repository

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

Consolidate api views in new (trivial) app

parent 8280df11
No related branches found
No related tags found
No related merge requests found
......@@ -85,6 +85,7 @@ INSTALLED_APPS = (
'django_countries',
'django_extensions',
'haystack',
'api',
'careers',
'colleges',
'commentaries',
......
......@@ -8,11 +8,8 @@ from django.conf.urls import include, url
from django.conf.urls.static import static
from django.contrib import admin
from rest_framework import routers
# from rest_framework import routers
from conflicts.viewsets import ConflictOfInterestViewSet
from journals.viewsets import PublicationViewSetForGoogleScholar
from news.viewsets import NewsItemViewSet
from journals.regexes import JOURNAL_DOI_LABEL_REGEX
from scipost import views as scipost_views
from organizations.views import OrganizationListView
......@@ -21,12 +18,6 @@ from organizations.views import OrganizationListView
JOURNAL_REGEX = '(?P<doi_label>%s)' % JOURNAL_DOI_LABEL_REGEX
# API Routing
router = routers.SimpleRouter()
router.register(r'news', NewsItemViewSet)
router.register(r'conflicts', ConflictOfInterestViewSet)
router.register(r'publications/GoogleScholar', PublicationViewSetForGoogleScholar)
# Disable admin login view which is essentially a 2FA workaround.
admin.site.login = login_required(admin.site.login)
......@@ -35,7 +26,7 @@ urlpatterns = [
url(r'^sitemap.xml$', scipost_views.sitemap_xml, name='sitemap_xml'),
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/', admin.site.urls),
url(r'^api/', include((router.urls, 'api'))),
url(r'^api/', include('api.urls', namespace='api')),
url(r'^10.21468/%s/' % JOURNAL_REGEX,
include('journals.urls.journal', namespace="prefixed_journal")),
url(r'^%s/' % JOURNAL_REGEX, include('journals.urls.journal', namespace="journal")),
......
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.conf.urls import url
from django.urls import include, path
from rest_framework import routers
from conflicts.viewsets import ConflictOfInterestViewSet
from news.viewsets import NewsItemViewSet
from journals.api import views as journal_api_views
router = routers.SimpleRouter()
router.register(r'news', NewsItemViewSet)
router.register(r'conflicts', ConflictOfInterestViewSet)
app_name = 'api'
urlpatterns = router.urls
urlpatterns += [
path('journals/', include('journals.api.urls')),
]
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from rest_framework import serializers
from ..models import Publication
class StringListField(serializers.ListField):
child = serializers.CharField()
class PublicationSerializer(serializers.BaseSerializer):
title = serializers.CharField(max_length=512)
authors = StringListField()
doi = serializers.CharField(max_length=256)
publication_date = serializers.DateField()
journal_title = serializers.CharField(max_length=128)
issn = serializers.CharField(max_length=16)
volume = serializers.IntegerField()
issue = serializers.IntegerField()
pdf_url = serializers.URLField()
def to_representation(self, instance):
"""
Convert publication information to a JSON format.
"""
authors = []
for author in instance.authors.all():
authors.append('%s, %s' % (author.profile.last_name,
author.profile.first_name))
rep = {
'title': instance.title,
'authors': authors,
'doi': instance.doi_string,
'publication_date': instance.publication_date.strftime('%Y/%m/%d'),
'journal_title': str(instance.get_journal()),
'issn': instance.get_journal().issn,
}
if instance.in_issue:
if instance.in_issue.in_volume:
rep['volume'] = instance.in_issue.in_volume.number
rep['issue'] = instance.in_issue.number
rep['pdf_url'] = 'https://scipost.org%s/pdf' % instance.get_absolute_url()
return rep
_copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.urls import path
from journals.api import views as api_views
urlpatterns = [
path( # /api/journals/publications
'publications',
api_views.PublicationListAPIView.as_view(),
name='publications'
),
path( # /api/journals/publications/<doi_label>
'publications/<str:doi_label>',
api_views.PublicationRetrieveAPIView.as_view(),
name='publication-detail'
),
]
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from rest_framework.generics import ListAPIView, RetrieveAPIView
from ..models import Publication
from .serializers import PublicationSerializer
class PublicationListAPIView(ListAPIView):
queryset = Publication.objects.published().order_by('-publication_date')
serializer_class = PublicationSerializer
lookup_field = 'doi_label'
class PublicationRetrieveAPIView(RetrieveAPIView):
queryset = Publication.objects.published()
serializer_class = PublicationSerializer
lookup_url_kwarg = 'doi_label'
lookup_field = 'doi_label'
__copyright__ = "Copyright © 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():
authors.append('%s, %s' % (author.profile.last_name,
author.profile.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
__copyright__ = "Copyright © 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
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