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
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()
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)
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)
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 )
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
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)
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
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, )
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
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
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)
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)
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)
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
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
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 )
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)
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
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)
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