Source code for inspirehep.modules.literaturesuggest.tasks
# -*- coding: utf-8 -*-
#
# This file is part of INSPIRE.
# Copyright (C) 2014-2017 CERN.
#
# INSPIRE is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# INSPIRE is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with INSPIRE. If not, see <http://www.gnu.org/licenses/>.
#
# In applying this license, CERN does not waive the privileges and immunities
# granted to it by virtue of its status as an Intergovernmental Organization
# or submit itself to any jurisdiction.
from __future__ import absolute_import, division, print_function
import copy
import datetime
from flask import current_app
from idutils import is_arxiv_post_2007
from inspire_schemas.api import LiteratureBuilder
from inspire_utils.helpers import force_list
from inspire_utils.record import get_value
from inspirehep.modules.forms.utils import filter_empty_elements
from inspirehep.modules.workflows.utils import with_debug_logging
from inspirehep.utils.record import get_title
[docs]def formdata_to_model(obj, formdata):
"""Manipulate form data to match literature data model."""
def _is_arxiv_url(url):
return 'arxiv.org' in url
form_fields = copy.deepcopy(formdata)
filter_empty_elements(
form_fields, ['authors', 'supervisors', 'report_numbers']
)
builder = LiteratureBuilder(source='submitter')
for author in form_fields.get('authors', []):
builder.add_author(builder.make_author(
author['full_name'],
affiliations=force_list(author['affiliation'])
if author['affiliation'] else None,
roles=['author']
))
for supervisor in form_fields.get('supervisors', []):
builder.add_author(builder.make_author(
supervisor['full_name'],
affiliations=force_list(supervisor['affiliation'])
if author['affiliation'] else None,
roles=['supervisor']
))
builder.add_title(title=form_fields.get('title'))
document_type = 'conference paper' if form_fields.get('conf_name') \
else form_fields.get('type_of_doc', [])
if document_type == 'chapter':
document_type = 'book chapter'
builder.add_document_type(
document_type=document_type
)
builder.add_abstract(
abstract=form_fields.get('abstract'),
source='arXiv' if form_fields.get('categories') else None
)
if form_fields.get('arxiv_id') and form_fields.get('categories'):
builder.add_arxiv_eprint(
arxiv_id=form_fields.get('arxiv_id'),
arxiv_categories=form_fields.get('categories').split()
)
builder.add_doi(doi=form_fields.get('doi'))
builder.add_inspire_categories(
subject_terms=form_fields.get('subject_term'),
source='user'
)
for key in ('extra_comments', 'nonpublic_note',
'hidden_notes', 'conf_name'):
builder.add_private_note(
private_notes=form_fields.get(key)
)
year = form_fields.get('year')
try:
year = int(year)
except (TypeError, ValueError):
year = None
builder.add_preprint_date(
preprint_date=form_fields.get('preprint_created')
)
if form_fields.get('type_of_doc') == 'thesis':
builder.add_thesis(
defense_date=form_fields.get('defense_date'),
degree_type=form_fields.get('degree_type'),
institution=form_fields.get('institution'),
date=form_fields.get('thesis_date')
)
if form_fields.get('type_of_doc') == 'chapter':
if not form_fields.get('journal_title'):
builder.add_book_series(title=form_fields.get('series_title'))
if form_fields.get('type_of_doc') == 'book':
if form_fields.get('journal_title'):
form_fields['volume'] = form_fields.get('series_volume')
else:
builder.add_book_series(title=form_fields.get('series_title'),
volume=form_fields.get('series_volume')
)
builder.add_book(
publisher=form_fields.get('publisher_name'),
place=form_fields.get('publication_place'),
date=form_fields.get('publication_date'))
builder.add_publication_info(
year=year,
cnum=form_fields.get('conference_id'),
journal_issue=form_fields.get('issue'),
journal_title=form_fields.get('journal_title'),
journal_volume=form_fields.get('volume'),
page_start=form_fields.get('start_page'),
page_end=form_fields.get('end_page'),
artid=form_fields.get('artid'),
parent_record=form_fields.get('parent_book')
)
builder.add_accelerator_experiments_legacy_name(
legacy_name=form_fields.get('experiment')
)
language = form_fields.get('other_language') \
if form_fields.get('language') == 'oth' \
else form_fields.get('language')
builder.add_language(language=language)
if form_fields.get('title_translation'):
builder.add_title_translation(
title=form_fields['title_translation'],
language='en',
)
builder.add_title(
title=form_fields.get('title_arXiv'),
source='arXiv'
)
builder.add_title(
title=form_fields.get('title_crossref'),
source='crossref'
)
builder.add_license(url=form_fields.get('license_url'))
builder.add_public_note(public_note=form_fields.get('public_notes'))
builder.add_public_note(
public_note=form_fields.get('note'),
source='arXiv' if form_fields.get('categories') else 'CrossRef'
)
form_url = form_fields.get('url')
form_additional_url = form_fields.get('additional_url')
if form_url and not _is_arxiv_url(form_url):
obj.extra_data['submission_pdf'] = form_url
if not form_additional_url:
builder.add_url(url=form_url)
if form_additional_url and not _is_arxiv_url(form_additional_url):
builder.add_url(url=form_additional_url)
[builder.add_report_number(
report_number=report_number.get('report_number')
) for report_number in form_fields.get('report_numbers', [])]
builder.add_collaboration(collaboration=form_fields.get('collaboration'))
builder.add_acquisition_source(
datetime=datetime.datetime.utcnow().isoformat(),
submission_number=obj.id,
internal_uid=int(obj.id_user),
email=form_fields.get('email'),
orcid=form_fields.get('orcid'),
method='submitter'
)
return builder.record
[docs]def new_ticket_context(user, obj):
"""Context for literature new tickets."""
title = get_title(obj.data)
subject = u"Your suggestion to INSPIRE: {0}".format(title)
user_comment = obj.extra_data.get('formdata', {}).get('extra_comments', '')
identifiers = get_value(obj.data, "external_system_numbers.value") or []
return dict(
email=user.email,
title=title,
identifier=identifiers or "",
user_comment=user_comment,
references=obj.extra_data.get('formdata', {}).get('references'),
object=obj,
subject=subject
)
[docs]def reply_ticket_context(user, obj):
"""Context for literature replies."""
return dict(
object=obj,
user=user,
title=get_title(obj.data),
reason=obj.extra_data.get("reason", ""),
record_url=obj.extra_data.get("url", ""),
)
[docs]def curation_ticket_context(user, obj):
recid = obj.extra_data.get('recid')
record_url = obj.extra_data.get('url')
server_name = current_app.config['SERVER_NAME']
arxiv_ids = get_value(obj.data, 'arxiv_eprints.value') or []
for index, arxiv_id in enumerate(arxiv_ids):
if arxiv_id and is_arxiv_post_2007(arxiv_id):
arxiv_ids[index] = 'arXiv:{0}'.format(arxiv_id)
report_numbers = get_value(obj.data, 'report_numbers.value') or []
dois = [
"doi:{0}".format(doi)
for doi in get_value(obj.data, 'dois.value') or []
]
link_to_pdf = obj.extra_data.get('formdata', {}).get('url')
subject = ' '.join(filter(
lambda x: x is not None,
arxiv_ids + dois + report_numbers + ['(#{0})'.format(recid)]
))
references = obj.extra_data.get('formdata', {}).get('references')
user_comment = obj.extra_data.get('formdata', {}).get('extra_comments', '')
return dict(
email=user.email if user else '',
link_to_pdf=link_to_pdf,
recid=recid,
record_url=record_url,
references=references,
server_name=server_name,
subject=subject,
user_comment=user_comment,
)
@with_debug_logging
[docs]def curation_ticket_needed(obj, eng):
"""Check if the a curation ticket is needed."""
return obj.extra_data.get("core", False)