SciPost Code Repository

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

Add admin-level view to fetch AffiliatePublications from Crossref

parent bce364a7
No related branches found
No related tags found
No related merge requests found
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
import logging
import requests
from scipost.services import extract_publication_date_from_Crossref_data
from .models import AffiliatePublication
doi_logger = logging.getLogger('scipost.services.doi')
def get_affiliatejournal_publications_from_Crossref(journal):
"""
For the given journal, get publication items via the Crossref API.
Parameters
----------
journal :
An instance of AffiliateJournal
"""
rows = 20 # we get results in packs of 20 (Crossref default)
offset = 0 # we keep querying until we hit known publications
nr_created = 20
total_nr_created = 0
# Check number of available results:
response = requests.get(
('http://api.crossref.org/works/'
'?filter=container-title:%s&rows=0') % journal.name,
).json()
try:
total_results = response['message']['total-results']
except KeyError:
return
if not (type(total_results) == int and total_results > 0):
doi_logger.error(
('Incorrect total_results in '
'affiliates.get_affiliatejournal_publications_from_Crossref '
'for journal %s: total_results = %s') % (
journal.name, str(total_results)))
return
while nr_created > 0 and total_nr_created < total_results:
nr_created = 0
response = requests.get(
('http://api.crossref.org/works/'
'?filter=container-title:%s&sort=issued&order=desc'
'&offset=%d') % (journal.name, offset),
).json()
try:
items = response['message']['items']
for item in items:
if not AffiliatePublication.objects.filter(
doi=item['DOI']).exists():
publication_date = extract_publication_date_from_Crossref_data(item)
afp = AffiliatePublication(
doi=item['DOI'],
_metadata_crossref=item,
journal=journal,
publication_date=publication_date)
afp.save()
nr_created += 1
total_nr_created += nr_created
offset += rows
except KeyError:
pass
return total_nr_created
......@@ -47,8 +47,14 @@
{% endif %}
<h3 class="highlight">Publications</h3>
{% if 'manage_journal_content' in user_perms %}
<div class="row p-2">
<div class="row p-2">
{% if perms.affiliates.can_edit_affiliatedjournal %}
<div class="col">
<h4>Update publications from Crossref</h4>
<a class="btn btn-primary" href="{% url 'affiliates:journal_update_publications_from_Crossref' slug=object.slug %}">Run full update</a>
</div>
{% endif %}
{% if 'manage_journal_content' in user_perms %}
<div class="col">
<h4>Add a publication</h4>
<form action="{% url 'affiliates:journal_add_publication' slug=object.slug %}" method="post">
......@@ -57,23 +63,23 @@
<input type="submit" value="Submit" class="btn btn-primary">
</form>
</div>
</div>
{% endif %}
<div class="row p-2">
<div class="col">
<h4>Recent publications <small>(ten most recent)</small>
&emsp;
<a class="btn btn-sm btn-primary" href="{% url 'affiliates:publication_list' %}?journal={{ object.slug }}">
{% include 'bi/arrow-right.html' %}&nbsp;View all publications in this Journal</a>
</h4>
{% if 'manage_journal_content' in user_perms %}
{% include 'affiliates/_affiliatepublication_table.html' with publications=object.publications.all|slice:":10" can_manage_journal_content=True %}
{% else %}
{% include 'affiliates/_affiliatepublication_table.html' with publications=object.publications.all|slice:":10" %}
{% endif %}
</div>
{% endif %}
</div>
<h3 class="highlight">Benefitting Organizations</h3>
<div class="row p-2">
<div class="col">
<h4>Recent publications <small>(ten most recent)</small>
&emsp;
<a class="btn btn-sm btn-primary" href="{% url 'affiliates:publication_list' %}?journal={{ object.slug }}">
{% include 'bi/arrow-right.html' %}&nbsp;View all publications in this Journal</a>
</h4>
{% if 'manage_journal_content' in user_perms %}
{% include 'affiliates/_affiliatepublication_table.html' with publications=object.publications.all|slice:":10" can_manage_journal_content=True %}
{% else %}
{% include 'affiliates/_affiliatepublication_table.html' with publications=object.publications.all|slice:":10" %}
{% endif %}
</div>
</div>
<h3 class="highlight">Benefitting Organizations</h3>
<div class="row p-2">
<div class="col">
<a class="btn btn-sm btn-primary" href="{% url 'affiliates:journal_organizations' slug=object.slug %}">
......
......@@ -40,6 +40,11 @@ urlpatterns = [
views.affiliatejournal_add_publication,
name='journal_add_publication'
),
path( # /affiliates/journals/<slug>/update_publications_from_Crossref
'journals/<slug:slug>/update_publications_from_Crossref',
views.affiliatejournal_update_publications_from_Crossref,
name='journal_update_publications_from_Crossref'
),
path( # /affiliates/journals/<slug:slug>/publications/<doi:doi>/pubfractions/add
'journals/<slug:slug>/publications/<doi:doi>/pubfractions/add',
views.add_pubfraction,
......
......@@ -20,6 +20,7 @@ from .models import AffiliateJournal, AffiliatePublication, AffiliatePubFraction
from .forms import (
AffiliateJournalAddManagerForm, AffiliateJournalAddPublicationForm,
AffiliatePublicationAddPubFractionForm)
from .services import get_affiliatejournal_publications_from_Crossref
class AffiliateJournalListView(ListView):
......@@ -75,7 +76,19 @@ def affiliatejournal_add_publication(request, slug):
kwargs={'slug': slug}))
@permission_required_or_403('affiliates.change_affiliatejournal',
(AffiliateJournal, 'slug', 'slug'))
def affiliatejournal_update_publications_from_Crossref(request, slug):
journal = get_object_or_404(AffiliateJournal, slug=slug)
total_nr_created = get_affiliatejournal_publications_from_Crossref(journal)
messages.success(request, 'Created %d entries.' % total_nr_created)
return redirect(reverse('affiliates:journal_detail',
kwargs={'slug': slug}))
class AffiliatePublicationListView(PaginationMixin, ListView):
paginate_by = 10
class Meta:
model = AffiliatePublication
......
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