From b9fa01373b80ea43dc9f85d8ac4f1afed690de12 Mon Sep 17 00:00:00 2001 From: amercader Date: Thu, 17 Oct 2024 14:02:22 +0200 Subject: [PATCH] Add liability statement property --- ckanext/dcat/profiles/dcat_us_3.py | 14 ++++++++ ckanext/dcat/schemas/dcat_us_full.yaml | 5 +++ .../dcat_us_3/test_dcat_us_3_profile_parse.py | 34 ++++++++++++++++--- .../test_dcat_us_3_profile_serialize.py | 4 +++ ...kan_full_dataset_dcat_us_vocabularies.json | 1 + 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/ckanext/dcat/profiles/dcat_us_3.py b/ckanext/dcat/profiles/dcat_us_3.py index d3cf6511..82194d78 100644 --- a/ckanext/dcat/profiles/dcat_us_3.py +++ b/ckanext/dcat/profiles/dcat_us_3.py @@ -158,6 +158,11 @@ def _parse_dataset_v3_us(self, dataset_dict, dataset_ref): # Data dictionary self._data_dictionary_parse(dataset_dict, dataset_ref) + # Liability statement + value = self._object_value(dataset_ref, DCATUS.liabilityStatement) + if value: + dataset_dict["liability"] = value + for distribution_ref in self._distributions(dataset_ref): for resource_dict in dataset_dict.get("resources", []): @@ -235,6 +240,15 @@ def add_bounding(predicate, value): # Data dictionary self._data_dictionary_graph(dataset_dict, dataset_ref) + # Liability statement + self._add_statement_to_graph( + dataset_dict, + "liability", + dataset_ref, + DCATUS.liabilityStatement, + DCATUS.LiabilityStatement, + ) + for resource_dict in dataset_dict.get("resources", []): distribution_ref = CleanedURIRef(resource_uri(resource_dict)) diff --git a/ckanext/dcat/schemas/dcat_us_full.yaml b/ckanext/dcat/schemas/dcat_us_full.yaml index a6c5b7eb..8b0c0776 100644 --- a/ckanext/dcat/schemas/dcat_us_full.yaml +++ b/ckanext/dcat/schemas/dcat_us_full.yaml @@ -226,6 +226,11 @@ dataset_fields: label: Access rights validators: ignore_missing unicode_safe help_text: Information that indicates whether the dataset is Open Data, has access restrictions or is not public. +- field_name: liability + label: Liability statement + form_snippet: markdown.html + display_snippet: markdown.html + help_text: A statement intended to limit the legal exposure of the data provider by disclaiming warranties or guarantees. - field_name: alternate_identifier label: Other identifier diff --git a/ckanext/dcat/tests/profiles/dcat_us_3/test_dcat_us_3_profile_parse.py b/ckanext/dcat/tests/profiles/dcat_us_3/test_dcat_us_3_profile_parse.py index 0c09c0c5..bb72d455 100644 --- a/ckanext/dcat/tests/profiles/dcat_us_3/test_dcat_us_3_profile_parse.py +++ b/ckanext/dcat/tests/profiles/dcat_us_3/test_dcat_us_3_profile_parse.py @@ -237,8 +237,6 @@ def test_data_dictionary_dataset(self): @prefix dcat: . @prefix dcat-us: . @prefix dcterms: . - @prefix locn: . - @prefix gsp: . a dcat:Dataset ; @@ -277,8 +275,6 @@ def test_data_dictionary_distribution(self): @prefix dcat: . @prefix dcat-us: . @prefix dcterms: . - @prefix locn: . - @prefix gsp: . a dcat:Dataset ; @@ -288,7 +284,6 @@ def test_data_dictionary_distribution(self): dcat:distribution . - a dcat:Distribution ; dcat-us:describedBy [ a dcat:Distribution ; dcterms:format ; @@ -315,3 +310,32 @@ def test_data_dictionary_distribution(self): resource["data_dictionary"][0]["license"] == "https://resources.data.gov/vocab/license/TODO/CC_BYNC_4_0" ) + + def test_data_liability_statement(self): + + data = """ + @prefix dcat: . + @prefix dcat-us: . + @prefix dcterms: . + @prefix rdfs: . + + + a dcat:Dataset ; + dcterms:title "Dataset 1" ; + dcterms:description "This is a dataset" ; + dcterms:publisher ; + dcat-us:liabilityStatement [ + a dcat-us:LiabilityStatement; + rdfs:label "This dataset is provided 'as-is'." + ] + . + """ + p = RDFParser() + + p.parse(data, _format="ttl") + + datasets = [d for d in p.datasets()] + + dataset = datasets[0] + + assert dataset["liability"] == "This dataset is provided 'as-is'." diff --git a/ckanext/dcat/tests/profiles/dcat_us_3/test_dcat_us_3_profile_serialize.py b/ckanext/dcat/tests/profiles/dcat_us_3/test_dcat_us_3_profile_serialize.py index f521fc95..2efb6521 100644 --- a/ckanext/dcat/tests/profiles/dcat_us_3/test_dcat_us_3_profile_serialize.py +++ b/ckanext/dcat/tests/profiles/dcat_us_3/test_dcat_us_3_profile_serialize.py @@ -228,6 +228,10 @@ def test_e2e_ckan_to_dcat(self): ids.append(str(g.value(subject, SKOS.notation))) assert ids == dataset["alternate_identifier"] + # Liability statement + statement = [s for s in g.objects(dataset_ref, DCATUS.liabilityStatement)][0] + assert self._triple(g, statement, RDFS.label, dataset["liability"]) + # Resources distribution_ref = self._triple(g, dataset_ref, DCAT.distribution, None)[2] diff --git a/examples/ckan/ckan_full_dataset_dcat_us_vocabularies.json b/examples/ckan/ckan_full_dataset_dcat_us_vocabularies.json index f4d7563a..b91f2adb 100644 --- a/examples/ckan/ckan_full_dataset_dcat_us_vocabularies.json +++ b/examples/ckan/ckan_full_dataset_dcat_us_vocabularies.json @@ -20,6 +20,7 @@ "dcat_type": "http://purl.org/dc/dcmitype/Dataset", "version_notes": "Some version notes", "access_rights": "https://resources.data.gov/vocab/access-right/TODO/PUBLIC", + "liability": "Some statement about liability", "alternate_identifier": [ "https://org1.example.org/datasets/alt-id-1", "https://org2.example.org/datasets/alt-id-2"