Source code for conflicts.management.commands.update_coi_via_arxiv

__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django.core.management.base import BaseCommand
from django.db.models import Q

from profiles.models import Profile
from submissions.models import Submission

from ...services import ArxivCaller


[docs]class Command(BaseCommand): """Update Conflict of Interests using arXiv API."""
[docs] def add_arguments(self, parser): parser.add_argument( '--arxiv', action='store', default=0, type=str, dest='arxiv', help='ArXiv id of Submission to force update of conflicts.')
[docs] def handle(self, *args, **options): caller = ArxivCaller() if options['arxiv']: submissions = Submission.objects.filter(preprint__identifier_w_vn_nr=options['arxiv']) else: submissions = Submission.objects.needs_conflicts_update()[:5] n_new_conflicts = 0 for sub in submissions: fellow_ids = sub.fellows.values_list('id', flat=True) fellow_profiles = Profile.objects.filter(contributor__fellowships__id__in=fellow_ids) # Get all possibly relevant Profiles author_str_list = [a.split()[-1] for a in sub.author_list.split(',')] if 'entries' in sub.metadata: author_str_list += [ a['name'].split()[-1] for a in sub.metadata['entries'][0]['authors']] author_str_list = set(author_str_list) # Distinct operator author_profiles = Profile.objects.filter( Q(contributor__in=sub.authors.all()) | Q(last_name__in=author_str_list)).distinct() n_new_conflicts += caller.compare(author_profiles, fellow_profiles, submission=sub) Submission.objects.filter(id=sub.id).update(needs_conflicts_update=False) return str(n_new_conflicts)