Skip to content

Commit

Permalink
deposit: handling missing recids
Browse files Browse the repository at this point in the history
* Missing record IDs are created in reserved state and deposit is
  marked as unsubmitted.

Signed-off-by: Krzysztof Nowak <k.nowak@cern.ch>
  • Loading branch information
Krzysztof Nowak committed Sep 2, 2016
1 parent c28112e commit f44fb38
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
20 changes: 18 additions & 2 deletions invenio_migrator/tasks/deposit.py
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
16 changes: 12 additions & 4 deletions tests/unit/test_deposit_load.py
Expand Up @@ -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):
Expand All @@ -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'), ],
Expand All @@ -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):
Expand Down

0 comments on commit f44fb38

Please sign in to comment.