Skip to content

Commit

Permalink
resolver: object getter fix
Browse files Browse the repository at this point in the history
* FIX Fixes issue with resolver not catching errors thrown by the
  object getter, which meant that e.g. a deleted record would throw
  a NoResultFound error when resolving a deleted PID (used by e.g.
  tombstones).

Signed-off-by: Lars Holm Nielsen <lars.holm.nielsen@cern.ch>
  • Loading branch information
lnielsen committed Feb 11, 2016
1 parent be50bcf commit 0e7fed7
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
12 changes: 9 additions & 3 deletions invenio_pidstore/resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

from __future__ import absolute_import, print_function

from flask import current_app

from .errors import PIDDeletedError, PIDMissingObjectError, \
PIDRedirectedError, PIDUnregistered
from .models import PersistentIdentifier
Expand Down Expand Up @@ -62,9 +64,13 @@ def resolve(self, pid_value):

if pid.is_deleted():
obj_id = pid.get_assigned_object(object_type=self.object_type)
raise PIDDeletedError(
pid,
self.object_getter(obj_id) if obj_id else None)
try:
obj = self.object_getter(obj_id) if obj_id else None
except Exception:
current_app.logger.exception("Failed to get object {0}".format(
obj_id))
obj = None
raise PIDDeletedError(pid, obj)

if pid.is_redirected():
raise PIDRedirectedError(pid, pid.get_redirect())
Expand Down
22 changes: 22 additions & 0 deletions tests/test_resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@

import pytest
from invenio_db import db
from invenio_records.api import Record

from invenio_pidstore.errors import PIDDeletedError, PIDDoesNotExistError, \
PIDMissingObjectError, PIDRedirectedError, PIDUnregistered
Expand Down Expand Up @@ -122,3 +123,24 @@ def test_resolver(app):
pytest.raises(PIDDoesNotExistError, doiresolver.resolve, '1')
pid, obj = doiresolver.resolve('10.1234/foo')
assert pid and obj == rec_a


def test_resolver_deleted_object(app):
"""Test the class methods of PersistentIdentifier class."""
with app.app_context():
rec_uuid = uuid.uuid4()
with db.session.begin_nested():
record = Record.create({'title': 'test'})

pid = PersistentIdentifier.create(
'recid', '1', status=PIDStatus.REGISTERED,
object_type='rec', object_uuid=rec_uuid)

with db.session.begin_nested():
pid.delete()
record.delete()

resolver = Resolver(
pid_type='recid', object_type='rec', getter=Record.get_record)

assert pytest.raises(PIDDeletedError, resolver.resolve, '1')

0 comments on commit 0e7fed7

Please sign in to comment.