From 9226568b925be15970993e2161821ee829fe8f60 Mon Sep 17 00:00:00 2001 From: Boris Ponsioen <b.g.t.ponsioen@uva.nl> Date: Wed, 2 May 2018 12:44:55 +0200 Subject: [PATCH] Adds metacore admin task to add journals to citables after import --- metacore/admin.py | 15 ++++++++---- metacore/managers.py | 2 +- metacore/services.py | 24 +++++++++++++++++++ .../partials/citable_card_content.html | 6 ++--- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/metacore/admin.py b/metacore/admin.py index fd747960c..f92ab1026 100644 --- a/metacore/admin.py +++ b/metacore/admin.py @@ -1,22 +1,22 @@ from django.contrib import admin from django.contrib import messages from .models import Citable, CitableWithDOI, Journal -from .services import get_crossref_test, import_journal_full, get_crossref_work_count +from .services import get_crossref_test, import_journal_full, get_crossref_work_count, add_journal_to_existing # Register your models here. class JournalAdmin(admin.ModelAdmin): fields = ('name', 'ISSN_digital', 'last_full_sync') list_display = ('name', 'ISSN_digital', 'last_full_sync', 'count_metacore', 'count_crossref') - actions = ['import_full', 'update_counts'] + actions = ['import_full', 'update_counts', 'add_journal_to_items'] def import_full(self, request, queryset): """ Starts background task to import all works by this journal """ for journal in queryset: t = import_journal_full(journal.ISSN_digital) - messages.add_message(request, messages.INFO, 'Import task for journal {} added. Go to Background Tasks -> Tasks in admin to view them'.format(journal.name)) + messages.add_message(request, messages.INFO, 'Import task for journal {} added. Go to Background Tasks -> Tasks in admin to view'.format(journal.name)) - messages.add_message(request, messages.WARNING, 'Make sure to start the tasks by running ./manage.py process_tasks') + messages.add_message(request, messages.WARNING, 'Make sure that "./manage.py process_tasks" is running (otherwise start it).') def update_counts(self, request, queryset): for journal in queryset: journal.count_metacore = Citable.objects(metadata__ISSN=journal.ISSN_digital).count() @@ -25,6 +25,13 @@ class JournalAdmin(admin.ModelAdmin): messages.add_message(request, messages.INFO, 'Counts updated.') + def add_journal_to_items(self, request, queryset): + for journal in queryset: + add_journal_to_existing(journal.ISSN_digital) + messages.add_message(request, messages.INFO, '"Add journal" task for journal {} added. Go to Background Tasks -> Tasks in admin to view'.format(journal.name)) + + messages.add_message(request, messages.WARNING, 'Make sure that "./manage.py process_tasks" is running (otherwise start it).') + def get_actions(self, request): actions = super().get_actions(request) if 'delete_selected' in actions: diff --git a/metacore/managers.py b/metacore/managers.py index 64d164bc7..964a91015 100644 --- a/metacore/managers.py +++ b/metacore/managers.py @@ -10,7 +10,7 @@ class CitableQuerySet(QuerySet): return self.only('references').filter(references=dois) def simple(self): - return self.only('doi', 'title', 'authors', 'metadata.is-referenced-by-count', 'publication_date', 'publisher', 'metadata.container-title') + return self.only('doi', 'title', 'authors', 'metadata.is-referenced-by-count', 'publication_date', 'publisher', 'metadata.container-title', 'journal') def prl(self): return self.filter(metadata__ISSN='0031-9007') diff --git a/metacore/services.py b/metacore/services.py index b202791a7..0d0462df0 100644 --- a/metacore/services.py +++ b/metacore/services.py @@ -151,6 +151,30 @@ def convert_doi_to_lower_case(): if i % 1000 == 0: print(i) +@background() +def add_journal_to_existing(journal_issn=None): + # Take journal from metadata ('container-title') and put it in top-level 'journal' field + # for all existing citables + i = 0 + errors = 0 + if journal_issn: + print('Using given journal ISSN ', journal_issn) + cits = Citable.objects(metadata__ISSN=journal_issn, journal__exists=False) + else: + cits = Citable.objects(journal__exists=False) + + for cit in cits.only('metadata', 'journal'): + i = i + 1 + if 'container-title' in cit.metadata: + journal = cit.metadata['container-title'][0] + cit.modify(journal=journal) + else: + errors = errors + 1 + + if i % 1000 == 0: + print(i) + print(errors, ' errors') + print('-------') def parse_crossref_citable(citable_item): if not citable_item['type'] == 'journal-article': diff --git a/metacore/templates/partials/citable_card_content.html b/metacore/templates/partials/citable_card_content.html index e26872a7e..a704cc518 100644 --- a/metacore/templates/partials/citable_card_content.html +++ b/metacore/templates/partials/citable_card_content.html @@ -11,10 +11,10 @@ Cited {{ citable.crossref_ref_count }} times (CrossRef) / {{ citable.times_cited}} times (SciPost Meta) | DOI <a href='https://doi.org/{{ citable.doi }}'> {{ citable.doi }} </a> <br> - Published {{ citable.publication_date|date:"d-m-Y" }} by {{ citable.publisher }} + Published {{ citable.publication_date|date:"d-m-Y" }} by <b>{{ citable.publisher }}</b> {% if citable.journal %} - <br> - in {{ citable.journal }} + <!-- <br> --> + in <b>{{ citable.journal }}</b> {% endif %} </p> {% endblock %} -- GitLab