Skip to content

Commit 709bef4

Browse files
committed
Add new task to update node metadata with verified_links
1 parent b98ecce commit 709bef4

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

osf/metadata/serializers/datacite/datacite_tree_walker.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ def walk(self, doi_override=None):
113113
self._visit_rights(self.root)
114114
self._visit_descriptions(self.root, self.basket.focus.iri)
115115
self._visit_funding_references(self.root)
116+
self._visit_verified_links(self.root)
116117
self._visit_related(self.root)
117118

118119
def _visit_identifier(self, parent_el, *, doi_override=None):
@@ -432,3 +433,20 @@ def _get_resource_type_general(self, focus_iri):
432433
if isinstance(type_term, rdflib.URIRef) and type_term.startswith(DATACITE):
433434
return without_namespace(type_term, DATACITE)
434435
return 'Text'
436+
437+
def _visit_verified_links(self, parent_el):
438+
osf_item = self.basket.focus.dbmodel
439+
verified_links = getattr(osf_item, 'verified_links', None)
440+
resource_type = getattr(osf_item, 'link_resource_type', 'Text')
441+
442+
if verified_links and isinstance(verified_links, list):
443+
related_identifiers_el = self.visit(parent_el, 'relatedIdentifiers', is_list=True)
444+
for link in verified_links:
445+
if link and isinstance(link, str) and smells_like_iri(link):
446+
self.visit(related_identifiers_el, 'relatedIdentifier', text=link, attrib={
447+
'relatedIdentifierType': 'URL',
448+
'relationType': 'IsReferencedBy',
449+
'resourceTypeGeneral': resource_type
450+
})
451+
else:
452+
logger.warning('skipping non-URL verified link "%s"', link)

website/identifiers/tasks.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,32 @@ def task__update_doi_metadata_on_change(self, target_guid):
1717
@celery_app.task(ignore_results=True)
1818
def update_doi_metadata_on_change(target_guid):
1919
task__update_doi_metadata_on_change(target_guid)
20+
21+
@celery_app.task(bind=True, max_retries=5, acks_late=True)
22+
def task__update_doi_metadata_with_verified_links(self, target_guid, verified_links=None, link_resource_type='Text'):
23+
sentry.log_message('Updating DOI with verified links for guid',
24+
extra_data={'guid': target_guid, 'verified_links': verified_links, 'link_resource_type': link_resource_type},
25+
level=logging.INFO)
26+
27+
Guid = apps.get_model('osf.Guid')
28+
target_object = Guid.load(target_guid).referent
29+
try:
30+
if verified_links is not None:
31+
target_object.verified_links = verified_links
32+
target_object.link_resource_type = link_resource_type
33+
34+
target_object.request_identifier_update(category='doi')
35+
36+
sentry.log_message('DOI metadata with verified links updated for guid',
37+
extra_data={'guid': target_guid},
38+
level=logging.INFO)
39+
except Exception as exc:
40+
sentry.log_message('Failed to update DOI metadata with verified links',
41+
extra_data={'guid': target_guid, 'error': str(exc)},
42+
level=logging.ERROR)
43+
raise self.retry(exc=exc)
44+
45+
@queued_task
46+
@celery_app.task(ignore_results=True)
47+
def update_doi_metadata_with_verified_links(target_guid, verified_links=None, resource_type='Text'):
48+
task__update_doi_metadata_with_verified_links.apply_async((target_guid, verified_links, resource_type))

0 commit comments

Comments
 (0)