diff --git a/invenio_rdm_records/resources/serializers/signposting/__init__.py b/invenio_rdm_records/resources/serializers/signposting/__init__.py index 66689ae3f..93404b76f 100644 --- a/invenio_rdm_records/resources/serializers/signposting/__init__.py +++ b/invenio_rdm_records/resources/serializers/signposting/__init__.py @@ -35,6 +35,8 @@ def fair_signposting_tostring(cls, record): link = f'<{value["href"]}> ; rel="{rel}"' if "type" in value: link += f' ; type="{value["type"]}"' + if "profile" in value: + link += f' ; profile="{value["profile"]}"' links.append(link) return " , ".join(links) diff --git a/invenio_rdm_records/resources/serializers/signposting/schema.py b/invenio_rdm_records/resources/serializers/signposting/schema.py index f3e9d0a80..d00e1effd 100644 --- a/invenio_rdm_records/resources/serializers/signposting/schema.py +++ b/invenio_rdm_records/resources/serializers/signposting/schema.py @@ -69,12 +69,20 @@ def serialize_describedby(self, obj, **kwargs): # Has to be placed here to prevent circular dependency. from invenio_rdm_records.resources.config import record_serializers - result = [ - {"href": obj["links"]["self"], "type": mimetype} - for mimetype in sorted(record_serializers) + result = [] + for mimetype in sorted(record_serializers): # Remove the linkset serializer, so that the linkset does not link to itself. - if mimetype != "application/linkset+json" - ] + if mimetype == "application/linkset+json": + continue + if ";" in mimetype: + media_type, _, params = mimetype.partition(";") + entry = {"href": obj["links"]["self"], "type": media_type.strip()} + params = params.strip() + if params.startswith('profile="') and params.endswith('"'): + entry["profile"] = params[len('profile="'):-1] + else: + entry = {"href": obj["links"]["self"], "type": mimetype} + result.append(entry) return result or missing diff --git a/tests/resources/serializers/test_signposting_serializer.py b/tests/resources/serializers/test_signposting_serializer.py index 5fe66f0f4..602873c68 100644 --- a/tests/resources/serializers/test_signposting_serializer.py +++ b/tests/resources/serializers/test_signposting_serializer.py @@ -131,7 +131,8 @@ def test_signposting_serializer_full( }, { "href": "https://127.0.0.1:5000/api/records/12345-abcde", - "type": 'application/ld+json;profile="https://datapackage.org/profiles/2.0/datapackage.json"', + "type": "application/ld+json", + "profile": "https://datapackage.org/profiles/2.0/datapackage.json", }, { "href": "https://127.0.0.1:5000/api/records/12345-abcde", @@ -326,7 +327,7 @@ def test_signposting_lvl1_serializer_full_collections_size_ok( f'<{api_url}> ; rel="describedby" ; type="application/dcat+xml"', f'<{api_url}> ; rel="describedby" ; type="application/json"', f'<{api_url}> ; rel="describedby" ; type="application/ld+json"', - f'<{api_url}> ; rel="describedby" ; type="application/ld+json;profile="https://datapackage.org/profiles/2.0/datapackage.json""', + f'<{api_url}> ; rel="describedby" ; type="application/ld+json" ; profile="https://datapackage.org/profiles/2.0/datapackage.json"', f'<{api_url}> ; rel="describedby" ; type="application/marcxml+xml"', f'<{api_url}> ; rel="describedby" ; type="application/vnd.citationstyles.csl+json"', f'<{api_url}> ; rel="describedby" ; type="application/vnd.datacite.datacite+json"', @@ -383,7 +384,8 @@ def test_signposting_serializer_minimal(running_app, minimal_record_to_dict): }, { "href": "https://127.0.0.1:5000/api/records/67890-fghij", - "type": 'application/ld+json;profile="https://datapackage.org/profiles/2.0/datapackage.json"', + "type": "application/ld+json", + "profile": "https://datapackage.org/profiles/2.0/datapackage.json", }, { "href": "https://127.0.0.1:5000/api/records/67890-fghij", @@ -464,7 +466,7 @@ def test_signposting_lvl1_serializer_minimal(running_app, minimal_record_to_dict f'<{api_url}> ; rel="describedby" ; type="application/dcat+xml"', f'<{api_url}> ; rel="describedby" ; type="application/json"', f'<{api_url}> ; rel="describedby" ; type="application/ld+json"', - f'<{api_url}> ; rel="describedby" ; type="application/ld+json;profile="https://datapackage.org/profiles/2.0/datapackage.json""', + f'<{api_url}> ; rel="describedby" ; type="application/ld+json" ; profile="https://datapackage.org/profiles/2.0/datapackage.json"', f'<{api_url}> ; rel="describedby" ; type="application/marcxml+xml"', f'<{api_url}> ; rel="describedby" ; type="application/vnd.citationstyles.csl+json"', f'<{api_url}> ; rel="describedby" ; type="application/vnd.datacite.datacite+json"',