Source code for inspirehep.modules.pidstore.providers.recid
# -*- 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.
"""INSPIRE Record Id provider."""
from __future__ import absolute_import, division, print_function
import requests
from flask import current_app
from invenio_pidstore.models import PIDStatus, RecordIdentifier
from invenio_pidstore.providers.base import BaseProvider
def _get_next_pid_from_legacy():
"""Reserve the next pid on legacy.
Sends a request to a legacy instance to reserve the next available
identifier, and returns it to the caller.
"""
headers = {
'User-Agent': 'invenio_webupload'
}
url = current_app.config.get('LEGACY_PID_PROVIDER')
next_pid = requests.get(url, headers=headers).json()
return next_pid
[docs]class InspireRecordIdProvider(BaseProvider):
"""Record identifier provider."""
pid_type = None
"""Type of persistent identifier."""
pid_provider = None
"""Provider name.
The provider name is not recorded in the PID since the provider does not
provide any additional features besides creation of record ids.
"""
default_status = PIDStatus.RESERVED
"""Record IDs are by default registered immediately."""
@classmethod
[docs] def create(cls, object_type=None, object_uuid=None, **kwargs):
"""Create a new record identifier."""
# Request next integer in recid sequence.
if 'pid_value' not in kwargs:
if current_app.config.get('LEGACY_PID_PROVIDER'):
kwargs['pid_value'] = _get_next_pid_from_legacy()
RecordIdentifier.insert(kwargs['pid_value'])
else:
kwargs['pid_value'] = RecordIdentifier.next()
else:
RecordIdentifier.insert(kwargs['pid_value'])
kwargs.setdefault('status', cls.default_status)
if object_type and object_uuid:
kwargs['status'] = PIDStatus.REGISTERED
return super(InspireRecordIdProvider, cls).create(
object_type=object_type, object_uuid=object_uuid, **kwargs)