From dbd4f30f9b2d70d2acc7277ca317b0cb9a6d00ed Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Fri, 27 Feb 2026 16:00:19 +0100 Subject: [PATCH 1/2] Fix ROR API v2 --- rdmo_ror/handlers.py | 32 ++++++++++++++++---------------- rdmo_ror/providers.py | 20 ++++++-------------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/rdmo_ror/handlers.py b/rdmo_ror/handlers.py index 22f173f..a50ba23 100644 --- a/rdmo_ror/handlers.py +++ b/rdmo_ror/handlers.py @@ -1,6 +1,7 @@ from django.conf import settings from django.db.models.signals import post_save from django.dispatch import receiver +from django.utils.translation import get_language import requests @@ -10,6 +11,8 @@ @receiver(post_save, sender=Value) def ror_handler(sender, instance=None, **kwargs): + lang = get_language() + # check for ROR_PROVIDER_MAP if not getattr(settings, 'ROR_PROVIDER_MAP', None): return @@ -27,7 +30,7 @@ def ror_handler(sender, instance=None, **kwargs): if 'ror' in attribute_map and instance.attribute.uri == attribute_map['ror']: # query the orcid api for the record for this orcid try: - url = getattr(settings, 'ROR_PROVIDER_URL', 'https://api.ror.org/v1/').rstrip('/') + url = getattr(settings, 'ROR_PROVIDER_URL', 'https://api.ror.org/v2/').rstrip('/') headers = getattr(settings, 'ROR_PROVIDER_HEADERS', {}) response = requests.get(f'{url}/organizations/{instance.external_id}', headers=headers) @@ -37,7 +40,16 @@ def ror_handler(sender, instance=None, **kwargs): except (requests.exceptions.RequestException, requests.exceptions.HTTPError): return - acronym = next(iter(data.get('acronyms', [])), None) + acronym = next(iter([ + name['value'] for name in data.get('names', []) if 'acronym' in name['types'] + ]), None) + + name = next(iter([ + name['value'] for name in data.get('names', []) if 'label' in name['types'] and name['lang'] == lang + ]), None) or next(iter([ + name['value'] for name in data.get('names', []) if 'ror_display' in name['types'] + ]), None) + if acronym and 'acronym' in attribute_map: Value.objects.update_or_create( project=instance.project, @@ -49,25 +61,13 @@ def ror_handler(sender, instance=None, **kwargs): } ) - alias = next(iter(data.get('aliases', [])), None) - if alias and 'alias' in attribute_map: - Value.objects.update_or_create( - project=instance.project, - attribute=Attribute.objects.get(uri=attribute_map['alias']), - set_prefix=instance.set_prefix, - set_index=instance.set_index, - defaults={ - 'text': alias - } - ) - - if 'name' in attribute_map: + if name and 'name' in attribute_map: Value.objects.update_or_create( project=instance.project, attribute=Attribute.objects.get(uri=attribute_map['name']), set_prefix=instance.set_prefix, set_index=instance.set_index, defaults={ - 'text': data.get('name') + 'text': name } ) diff --git a/rdmo_ror/providers.py b/rdmo_ror/providers.py index cc5c5da..14754f3 100644 --- a/rdmo_ror/providers.py +++ b/rdmo_ror/providers.py @@ -50,21 +50,13 @@ def get_text(self, item): return f'{ror_name} {ror_link}' if ror_name else ror_link def get_name(self, item): - current_language = get_language() - labels = [ - name - for name in item.get('names', []) - if 'label' in name.get('types', []) - ] + lang = get_language() - if not labels: - return None - - for name in labels: - if name.get('lang') == current_language: - return name.get('value') - - return labels[0].get('value') + return next(iter([ + name['value'] for name in item.get('names', []) if 'label' in name['types'] and name['lang'] == lang + ]), None) or next(iter([ + name['value'] for name in item.get('names', []) if 'ror_display' in name['types'] + ]), None) def get_search(self, search): # reverse get_text to perform the search, remove everything after [ From b642059ef7c111610be2ccfb6a2d9c27aa9c5de9 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 26 Feb 2026 12:25:39 +0100 Subject: [PATCH 2/2] Use value signals and fix snapshot creation (#2) --- rdmo_ror/handlers.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rdmo_ror/handlers.py b/rdmo_ror/handlers.py index a50ba23..6267375 100644 --- a/rdmo_ror/handlers.py +++ b/rdmo_ror/handlers.py @@ -1,5 +1,4 @@ from django.conf import settings -from django.db.models.signals import post_save from django.dispatch import receiver from django.utils.translation import get_language @@ -7,10 +6,12 @@ from rdmo.domain.models import Attribute from rdmo.projects.models import Value +from rdmo.projects.signals import value_created, value_updated -@receiver(post_save, sender=Value) -def ror_handler(sender, instance=None, **kwargs): +@receiver(value_created, sender=Value) +@receiver(value_updated, sender=Value) +def ror_handler(signal, sender, instance=None, **kwargs): lang = get_language() # check for ROR_PROVIDER_MAP @@ -53,6 +54,7 @@ def ror_handler(sender, instance=None, **kwargs): if acronym and 'acronym' in attribute_map: Value.objects.update_or_create( project=instance.project, + snapshot=None, attribute=Attribute.objects.get(uri=attribute_map['acronym']), set_prefix=instance.set_prefix, set_index=instance.set_index, @@ -64,6 +66,7 @@ def ror_handler(sender, instance=None, **kwargs): if name and 'name' in attribute_map: Value.objects.update_or_create( project=instance.project, + snapshot=None, attribute=Attribute.objects.get(uri=attribute_map['name']), set_prefix=instance.set_prefix, set_index=instance.set_index,