From f44fb38acf0172ca1dc1e034d14dc54e9b018e3c Mon Sep 17 00:00:00 2001 From: Krzysztof Nowak Date: Fri, 2 Sep 2016 16:17:01 +0200 Subject: [PATCH] deposit: handling missing recids * Missing record IDs are created in reserved state and deposit is marked as unsubmitted. Signed-off-by: Krzysztof Nowak --- invenio_migrator/tasks/deposit.py | 20 ++++++++++++++++++-- tests/unit/test_deposit_load.py | 16 ++++++++++++---- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/invenio_migrator/tasks/deposit.py b/invenio_migrator/tasks/deposit.py index de735e7..9336d23 100644 --- a/invenio_migrator/tasks/deposit.py +++ b/invenio_migrator/tasks/deposit.py @@ -79,7 +79,7 @@ def create_record_and_pid(data): def create_files_and_sip(deposit, dep_pid): """Create deposit Bucket, Files and SIPs.""" from invenio_pidstore.errors import PIDDoesNotExistError - from invenio_pidstore.models import PersistentIdentifier + from invenio_pidstore.models import PersistentIdentifier, PIDStatus from invenio_sipstore.errors import SIPUserDoesNotExist from invenio_sipstore.models import SIP, RecordSIP, SIPFile from invenio_files_rest.models import Bucket, FileInstance, ObjectVersion @@ -162,7 +162,23 @@ def create_files_and_sip(deposit, dep_pid): logger.exception('Record {recid} referred in ' 'Deposit {depid} does not exists.'.format( recid=recid, depid=dep_pid.pid_value)) - raise DepositRecidDoesNotExist(dep_pid.pid_value, recid) + if deposit['_p']['submitted'] == True: + logger.exception('Pair {recid}/{depid} was submitted,' + ' setting to unpublished.'.format( + recid=recid, depid=dep_pid.pid_value)) + deposit['_p']['submitted'] = False + else: + logger.exception('Pair {recid}/{depid} was not submitted.'. + format(recid=recid, depid=dep_pid.pid_value)) + + # Reserve recid + pid = PersistentIdentifier.create( + pid_type='recid', + pid_value=str(recid), + object_type='rec', + object_uuid=str(deposit.id), + status=PIDStatus.RESERVED + ) if idx == 0: for fp, fi in dep_file_instances: sipf = SIPFile(sip_id=sip.id, filepath=fp, file_id=fi.id) diff --git a/tests/unit/test_deposit_load.py b/tests/unit/test_deposit_load.py index 1779c5a..fb707cc 100644 --- a/tests/unit/test_deposit_load.py +++ b/tests/unit/test_deposit_load.py @@ -28,14 +28,14 @@ import pytest from invenio_pidstore.resolver import Resolver +from invenio_pidstore.models import PersistentIdentifier, PIDStatus from invenio_records.api import Record from invenio_records.models import RecordMetadata from invenio_records_files.api import Record as RecordFiles from invenio_sipstore.models import SIP, RecordSIP, SIPFile from invenio_migrator.tasks.deposit import load_deposit -from invenio_migrator.tasks.errors import DepositMultipleRecids, \ - DepositRecidDoesNotExist +from invenio_migrator.tasks.errors import DepositMultipleRecids def test_deposit_load(dummy_location, deposit_user, deposit_record_pid): @@ -47,7 +47,7 @@ def test_deposit_load(dummy_location, deposit_user, deposit_record_pid): dep2 = dict(sips=[dict(metadata=dict(recid='50'), agents=[dict(user_id=1), ], package='Content2'), ], - _p=dict(id='2')) + _p=dict(id='2', submitted=True)) dep3 = dict(sips=[dict(metadata=dict(recid='10'), agents=[dict(user_id=5), ], package='Content3'), ], @@ -60,13 +60,21 @@ def test_deposit_load(dummy_location, deposit_user, deposit_record_pid): package='Content5'), ], _p=dict(id='4')) load_deposit(dep1) - pytest.raises(DepositRecidDoesNotExist, load_deposit, dep2) pytest.raises(DepositMultipleRecids, load_deposit, dep4) # Should set user to null because user_id does not exist load_deposit(dep3) assert SIP.query.filter_by(content="Content3").one().user_id is None + # Should create reserved recid and leave deposit unsubmitted + load_deposit(dep2) + assert PersistentIdentifier.query.filter_by( + pid_type='recid', pid_value='50').one().status == PIDStatus.RESERVED + + pid, dep = Resolver(pid_type='depid', object_type='rec', + getter=Record.get_record).resolve('2') + assert not dep['_p']['submitted'] + def test_deposit_load_task(dummy_location, deposit_dump, deposit_user, deposit_record_pid):