def test_record_identifier(app, db):
    """Test base provider."""
    with app.app_context():
        assert RecordIdentifier.next() == 1
        assert RecordIdentifier.next() == 2
        assert RecordIdentifier.max() == 2

        # Mess up the sequence
        with db.session.begin_nested():
            obj = RecordIdentifier(recid=3)
            db.session.add(obj)

        assert RecordIdentifier.max() == 3

        # This tests a particular problem on PostgreSQL which is using
        # sequences to generate auto incrementing columns and doesn't deal
        # nicely with having values inserted in the table.
        assert RecordIdentifier.next() == 4

        RecordIdentifier.insert(10)
        assert RecordIdentifier.next() == 11
        assert RecordIdentifier.max() == 11

        RecordIdentifier.insert(7)
        assert RecordIdentifier.max() == 11
        assert RecordIdentifier.next() == 12
Beispiel #2
0
def minter(pid_type, pid_field, record):
    """Mint the given PID for the given record."""
    PersistentIdentifier.create(
        pid_type=pid_type,
        pid_value=record[pid_field],
        object_type="rec",
        object_uuid=record.id,
        status=PIDStatus.REGISTERED,
    )
    RecordIdentifier.next()
Beispiel #3
0
    def create(cls, object_type=None, object_uuid=None, **kwargs):
        """Create a new record identifier."""
        # Request next integer in recid sequence.
        assert 'pid_value' not in kwargs

        if current_app.config.get('DEBUG'):
            # Don't query external service in DEBUG mode
            kwargs['pid_value'] = str(RecordIdentifier.next())
        else:
            response = requests.get(
                current_app.config['RECORDS_ID_PROVIDER_ENDPOINT'],
                headers={
                    'User-Agent': 'cdslabs'
                }).text

            if response.strip().lower().startswith('[error]'):
                raise PersistentIdentifierError(response)

            kwargs['pid_value'] = response

        kwargs.setdefault('status', cls.default_status)
        if object_type and object_uuid:
            kwargs['status'] = PIDStatus.REGISTERED
        return super(CDSRecordIdProvider, cls).create(object_type=object_type,
                                                      object_uuid=object_uuid,
                                                      **kwargs)
Beispiel #4
0
def weko_deposit_minter(record_uuid, data):
    """Weko deposit."""
    id_ = RecordIdentifier.next()
    recid = PersistentIdentifier.create('recid',
                                        str(id_),
                                        object_type='rec',
                                        object_uuid=record_uuid,
                                        status=PIDStatus.REGISTERED)

    # Create depid with same pid_value of the recid
    depid = PersistentIdentifier.create(
        'depid',
        str(recid.pid_value),
        object_type='rec',
        object_uuid=record_uuid,
        status=PIDStatus.REGISTERED,
    )

    data.update({
        '_deposit': {
            'id': depid.pid_value,
            'status': 'draft',
        },
    })
    return depid
    def create(cls, object_type=None, object_uuid=None, **kwargs):
        """Create a new record identifier."""
        # Request next integer in recid sequence.
        assert 'pid_value' not in kwargs

        provider_url = current_app.config.get('RECORDS_ID_PROVIDER_ENDPOINT',
                                              None)
        if not provider_url:
            # Don't query external service in DEBUG mode
            kwargs['pid_value'] = str(RecordIdentifier.next())
        else:
            response = requests.get(provider_url,
                                    headers={'User-Agent': 'cernsearch'})

            if not response.ok or response.text.strip().startswith('[ERROR]'):
                raise PersistentIdentifierError(response.text)

            kwargs['pid_value'] = response.text

        kwargs.setdefault('status', cls.default_status)
        if object_type and object_uuid:
            kwargs['status'] = PIDStatus.REGISTERED

        return super(CERNSearchRecordIdProvider,
                     cls).create(object_type=object_type,
                                 object_uuid=object_uuid,
                                 **kwargs)
Beispiel #6
0
    def create(cls, object_type=None, object_uuid=None, **kwargs):
        """Create a new record identifier.

        Note: if the object_type and object_uuid values are passed, then the
        PID status will be automatically setted to
        :attr:`invenio_pidstore.models.PIDStatus.REGISTERED`.
        :param object_type: The object type. (Default: None.)
        :param object_uuid: The object identifier. (Default: None).
        :param kwargs: You specify the pid_value.
        """
        # PID value not already exists, generating a new one
        if not kwargs.get('pid_value'):
            kwargs['pid_value'] = str(RecordIdentifier.next())

        kwargs.setdefault('status', cls.default_status)
        if object_type and object_uuid:
            kwargs['status'] = PIDStatus.REGISTERED

        try:
            # Try to retreive PID
            return cls.get(kwargs['pid_value'], cls.pid_type)
        except PIDDoesNotExistError:
            # Set default status
            kwargs.setdefault('status', cls.default_status)

            # if record is registered, change PID status
            if object_type and object_uuid:
                kwargs['status'] = PIDStatus.REGISTERED

            # Call base provider
            return super(Provider, cls).create(
                object_type=object_type, object_uuid=object_uuid, **kwargs
            )
Beispiel #7
0
def weko_deposit_minter(record_uuid, data, recid=None):
    """Weko deposit."""
    if not recid:
        id_ = RecordIdentifier.next()
    else:
        if isinstance(recid, int):
            RecordIdentifier.insert(recid)
        id_ = recid
    recid = PersistentIdentifier.create('recid',
                                        str(id_),
                                        object_type='rec',
                                        object_uuid=record_uuid,
                                        status=PIDStatus.REGISTERED)
    data['recid'] = str(recid.pid_value)

    # Create depid with same pid_value of the recid
    depid = PersistentIdentifier.create(
        'depid',
        str(recid.pid_value),
        object_type='rec',
        object_uuid=record_uuid,
        status=PIDStatus.REGISTERED,
    )

    data.update({
        '_deposit': {
            'id': depid.pid_value,
            'status': 'draft',
        },
    })
    return depid
Beispiel #8
0
 def create(cls, object_type=None, object_uuid=None, **kwargs):
     # Request next integer in recid sequence.
     kwargs['pid_value'] = str(RecordIdentifier.next())
     kwargs.setdefault('status', cls.default_status)
     return super(RecordIdProvider,
                  cls).create(object_type=object_type,
                              object_uuid=object_uuid,
                              **kwargs)
Beispiel #9
0
def zenodo_reserved_record_minter(record_uuid=None, data=None):
    """Reserve a recid."""
    id_ = RecordIdentifier.next()
    recid = PersistentIdentifier.create('recid',
                                        str(id_),
                                        status=PIDStatus.RESERVED)
    data['recid'] = int(recid.pid_value)

    return recid
Beispiel #10
0
def default_parent_minter(record_uuid, data, pid_type, object_type):
    """Basic RecordIdentifier-based minter for parent PIDs."""
    parent_id = RecordIdentifier.next()
    return PersistentIdentifier.create(
        pid_type=pid_type,
        pid_value=str(parent_id),
        object_type=object_type,
        status=PIDStatus.REGISTERED,
    )
Beispiel #11
0
def zenodo_reserved_record_minter(record_uuid=None, data=None):
    """Reserve a recid."""
    id_ = RecordIdentifier.next()
    recid = PersistentIdentifier.create(
        'recid', id_, status=PIDStatus.RESERVED
    )
    data['recid'] = recid.pid_value

    return recid
Beispiel #12
0
def test_record_resolution(app, db):
    """Test resolution of PIDs to records."""
    # OK PID
    pid_ok, record = create_record({'title': 'test'})

    # Deleted PID
    pid_del, record = create_record({'title': 'deleted'})
    pid_del.delete()

    # Missing object PID
    pid_noobj = PersistentIdentifier.create('recid',
                                            str(RecordIdentifier.next()),
                                            status=PIDStatus.REGISTERED)
    db.session.commit()

    # Redirected PID
    pid_red = PersistentIdentifier.create('recid',
                                          '101',
                                          status=PIDStatus.REGISTERED)
    pid_red.redirect(pid_ok)

    # Redirect PID - different endpoint
    pid_doi = PersistentIdentifier.create('doi',
                                          '10.1234/foo',
                                          status=PIDStatus.REGISTERED)
    pid_red_doi = PersistentIdentifier.create('recid',
                                              '102',
                                              status=PIDStatus.REGISTERED)
    pid_red_doi.redirect(pid_doi)
    db.session.commit()

    headers = [('Accept', 'application/json')]
    with app.test_client() as client:
        # PID deleted
        res = client.get(url_for('invenio_records_rest.recid_item',
                                 pid_value=pid_del.pid_value),
                         headers=headers)
        assert res.status_code == 410

        # PID missing object
        res = client.get(url_for('invenio_records_rest.recid_item',
                                 pid_value=pid_noobj.pid_value),
                         headers=headers)
        assert res.status_code == 500

        # Redirected invalid endpoint
        res = client.get(url_for('invenio_records_rest.recid_item',
                                 pid_value=pid_red_doi.pid_value),
                         headers=headers)
        assert res.status_code == 500

        # Redirected
        res = client.get(url_for('invenio_records_rest.recid_item',
                                 pid_value=pid_red.pid_value),
                         headers=headers)
        assert res.status_code == 301
def test_record_resolution(app, db):
    """Test resolution of PIDs to records."""
    # OK PID
    pid_ok, record = create_record({'title': 'test'})

    # Deleted PID
    pid_del, record = create_record({'title': 'deleted'})
    pid_del.delete()

    # Missing object PID
    pid_noobj = PersistentIdentifier.create(
        'recid', str(RecordIdentifier.next()), status=PIDStatus.REGISTERED)
    db.session.commit()

    # Redirected PID
    pid_red = PersistentIdentifier.create(
        'recid', '101', status=PIDStatus.REGISTERED)
    pid_red.redirect(pid_ok)

    # Redirect PID - different endpoint
    pid_doi = PersistentIdentifier.create(
        'doi', '10.1234/foo', status=PIDStatus.REGISTERED)
    pid_red_doi = PersistentIdentifier.create(
        'recid', '102', status=PIDStatus.REGISTERED)
    pid_red_doi.redirect(pid_doi)
    db.session.commit()

    headers = [('Accept', 'application/json')]
    with app.test_client() as client:
        # PID deleted
        res = client.get(
            url_for('invenio_records_rest.recid_item',
                    pid_value=pid_del.pid_value),
            headers=headers)
        assert res.status_code == 410

        # PID missing object
        res = client.get(
            url_for('invenio_records_rest.recid_item',
                    pid_value=pid_noobj.pid_value),
            headers=headers)
        assert res.status_code == 500

        # Redirected invalid endpoint
        res = client.get(
            url_for('invenio_records_rest.recid_item',
                    pid_value=pid_red_doi.pid_value),
            headers=headers)
        assert res.status_code == 500

        # Redirected
        res = client.get(
            url_for('invenio_records_rest.recid_item',
                    pid_value=pid_red.pid_value),
            headers=headers)
        assert res.status_code == 301
Beispiel #14
0
 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:
         kwargs['pid_value'] = str(RecordIdentifier.next())
     kwargs.setdefault('status', cls.default_status)
     if object_type and object_uuid:
         kwargs['status'] = PIDStatus.REGISTERED
     return super(SCOAP3RecordIdProvider, cls).create(
         object_type=object_type, object_uuid=object_uuid, **kwargs)
Beispiel #15
0
 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:
         kwargs['pid_value'] = str(RecordIdentifier.next())
     kwargs.setdefault('status', cls.default_status)
     if object_type and object_uuid:
         kwargs['status'] = PIDStatus.REGISTERED
     return super(SCOAP3RecordIdProvider,
                  cls).create(object_type=object_type,
                              object_uuid=object_uuid,
                              **kwargs)
Beispiel #16
0
def zenodo_deposit_minter(record_uuid, data):
    """Mint a deposit identifier."""
    provider = ZenodoDepositProvider.create(
        object_type='rec',
        object_uuid=record_uuid,
        pid_value=RecordIdentifier.next(),
    )
    data['_deposit'] = {
        'id': provider.pid.pid_value,
        'status': 'draft',
    }
    return provider.pid
 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()
         else:
             kwargs['pid_value'] = str(RecordIdentifier.next())
     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)
Beispiel #18
0
def zenodo_concept_recid_minter(record_uuid=None, data=None):
    """Mint the Concept RECID.

    Reserves the Concept RECID for the record.
    """
    parent_id = RecordIdentifier.next()
    conceptrecid = PersistentIdentifier.create(
        pid_type='recid',
        pid_value=str(parent_id),
        status=PIDStatus.RESERVED,
    )
    data['conceptrecid'] = conceptrecid.pid_value
    return conceptrecid
Beispiel #19
0
def zenodo_concept_recid_minter(record_uuid=None, data=None):
    """Mint the Concept RECID.

    Reserves the Concept RECID for the record.
    """
    parent_id = RecordIdentifier.next()
    conceptrecid = PersistentIdentifier.create(
        pid_type='recid',
        pid_value=str(parent_id),
        status=PIDStatus.RESERVED,
    )
    data['conceptrecid'] = conceptrecid.pid_value
    return conceptrecid
Beispiel #20
0
def _migrate_recid(d):
    """Migrate the recid information."""
    depid = d['_n']['_deposit']['id']
    pid = d['_n']['_deposit'].get('pid')
    if pid:
        d['_n']['recid'] = int(pid['value'])
    else:
        # Create a recid if we don't have one - try to reserve identical
        # number.
        try:
            PersistentIdentifier.get('recid', depid)
            id_ = str(RecordIdentifier.next())
        except PIDDoesNotExistError:
            id_ = str(depid)
        PersistentIdentifier.create('recid', id_, status=PIDStatus.RESERVED)
        d['_n']['recid'] = int(id_)
    return d
Beispiel #21
0
def _migrate_recid(d):
    """Migrate the recid information."""
    depid = d['_n']['_deposit']['id']
    pid = d['_n']['_deposit'].get('pid')
    if pid:
        d['_n']['recid'] = int(pid['value'])
    else:
        # Create a recid if we don't have one - try to reserve identical
        # number.
        try:
            PersistentIdentifier.get('recid', depid)
            id_ = str(RecordIdentifier.next())
        except PIDDoesNotExistError:
            id_ = str(depid)
        PersistentIdentifier.create('recid', id_, status=PIDStatus.RESERVED)
        d['_n']['recid'] = int(id_)
    return d
Beispiel #22
0
    def create(cls, object_type=None, object_uuid=None, **kwargs):
        """Create a new record identifier."""
        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
        )
Beispiel #23
0
 def create(cls, object_type=None, object_uuid=None, **kwargs):
     """Create a new record identifier.
     Note: if the object_type and object_uuid values are passed, then the
     PID status will be automatically setted to
     :attr:`invenio_pidstore.models.PIDStatus.REGISTERED`.
     :param object_type: The object type. (Default: None.)
     :param object_uuid: The object identifier. (Default: None).
     :param kwargs: You specify the pid_value.
     """
     # Request next integer in recid sequence.
     assert 'pid_value' not in kwargs
     kwargs['pid_value'] = str(RecordIdentifier.next())
     kwargs.setdefault('status', cls.default_status)
     if object_type and object_uuid:
         kwargs['status'] = PIDStatus.REGISTERED
     return super(DepositUUIDProvider, cls).create(
         object_type=object_type, object_uuid=object_uuid, **kwargs)
Beispiel #24
0
def zenodo_deposit_minter(record_uuid, data):
    """Mint deposit identifier."""
    id_ = RecordIdentifier.next()
    depid = PersistentIdentifier.create(
        'depid',
        str(id_),
        object_type='rec',
        object_uuid=record_uuid,
        status=PIDStatus.REGISTERED,
    )
    # Reserve recid with same number.
    PersistentIdentifier.create('recid',
                                depid.pid_value,
                                status=PIDStatus.RESERVED)
    data.update({
        '_deposit': {
            'id': depid.pid_value,
            'status': 'draft',
        },
        'recid': id_,
    })
    return depid
Beispiel #25
0
    def create(cls, object_type=None, object_uuid=None, **kwargs):
        """Create a new record identifier."""
        pid_value = kwargs.get("pid_value")
        if pid_value is None:
            if current_app.config.get("LEGACY_PID_PROVIDER"):
                kwargs["pid_value"] = get_next_pid_from_legacy()
                LOGGER.info("Control number from legacy",
                            recid=kwargs["pid_value"])
                RecordIdentifier.insert(kwargs["pid_value"])
            else:
                kwargs["pid_value"] = str(RecordIdentifier.next())
                LOGGER.info("Control number from RecordIdentifier",
                            recid=kwargs["pid_value"])
        else:
            LOGGER.info("Control number provided", recid=kwargs["pid_value"])
            RecordIdentifier.insert(kwargs["pid_value"])

        kwargs.setdefault("status", cls.default_status)
        if object_type and object_uuid:
            kwargs["status"] = PIDStatus.REGISTERED
        return super().create(object_type=object_type,
                              object_uuid=object_uuid,
                              **kwargs)
Beispiel #26
0
def zenodo_deposit_minter(record_uuid, data):
    """Mint deposit identifier."""
    id_ = RecordIdentifier.next()
    depid = PersistentIdentifier.create(
        'depid',
        str(id_),
        object_type='rec',
        object_uuid=record_uuid,
        status=PIDStatus.REGISTERED,
    )
    # Reserve recid with same number.
    PersistentIdentifier.create(
        'recid', depid.pid_value,
        status=PIDStatus.RESERVED
    )
    data.update({
        '_deposit': {
            'id': depid.pid_value,
            'status': 'draft',
        },
        'recid': id_,
    })
    return depid