diff --git a/ckanext/dcat/profiles.py b/ckanext/dcat/profiles.py index f3934c4c..b91e4dba 100644 --- a/ckanext/dcat/profiles.py +++ b/ckanext/dcat/profiles.py @@ -164,9 +164,18 @@ def _object_value(self, subject, predicate): If found, the unicode representation is returned, else an empty string ''' + default_lang = config.get('ckan.locale_default', 'en') + fallback = '' for o in self.g.objects(subject, predicate): - return unicode(o) - return '' + if isinstance(o, Literal): + if o.language and o.language == default_lang: + return unicode(o) + # Use first object as fallback if no object with the default language is available + elif fallback == '': + fallback = unicode(o) + else: + return unicode(o) + return fallback def _object_value_int(self, subject, predicate): ''' diff --git a/ckanext/dcat/tests/test_base_profile.py b/ckanext/dcat/tests/test_base_profile.py index 3c1cb48e..0266c0a8 100644 --- a/ckanext/dcat/tests/test_base_profile.py +++ b/ckanext/dcat/tests/test_base_profile.py @@ -3,6 +3,8 @@ from rdflib import Graph, URIRef, Literal from rdflib.namespace import Namespace +from ckantoolkit.tests import helpers + from ckanext.dcat.profiles import RDFProfile, CleanedURIRef from ckanext.dcat.tests.test_base_parser import _default_graph @@ -113,6 +115,60 @@ def test_object_value_not_found(self): eq_(value, '') + @helpers.change_config('ckan.locale_default', 'de') + def test_object_value_default_lang(self): + p = RDFProfile(_default_graph()) + + p.g.add((URIRef('http://example.org/datasets/1'), + DCT.title, Literal('Test Datensatz 1', lang='de'))) + p.g.add((URIRef('http://example.org/datasets/1'), + DCT.title, Literal('Test Dataset 1 (EN)', lang='en'))) + + value = p._object_value(URIRef('http://example.org/datasets/1'), + DCT.title) + + assert isinstance(value, unicode) + eq_(value, 'Test Datensatz 1') + + @helpers.change_config('ckan.locale_default', 'fr') + def test_object_value_default_lang_not_in_graph(self): + p = RDFProfile(_default_graph()) + + p.g.add((URIRef('http://example.org/datasets/1'), + DCT.title, Literal('Test Datensatz 1', lang='de'))) + + value = p._object_value(URIRef('http://example.org/datasets/1'), + DCT.title) + + assert isinstance(value, unicode) + # FR is not in graph, so either node may be used + assert value.startswith('Test D') + assert value.endswith(' 1') + + def test_object_value_default_lang_fallback(self): + p = RDFProfile(_default_graph()) + + p.g.add((URIRef('http://example.org/datasets/1'), + DCT.title, Literal('Test Datensatz 1', lang='de'))) + p.g.add((URIRef('http://example.org/datasets/1'), + DCT.title, Literal('Test Dataset 1 (EN)', lang='en'))) + + value = p._object_value(URIRef('http://example.org/datasets/1'), + DCT.title) + + assert isinstance(value, unicode) + # without config parameter, EN is used as default + eq_(value, 'Test Dataset 1 (EN)') + + def test_object_value_default_lang_missing_lang_param(self): + p = RDFProfile(_default_graph()) + + value = p._object_value(URIRef('http://example.org/datasets/1'), + DCT.title) + + assert isinstance(value, unicode) + eq_(value, 'Test Dataset 1') + def test_object_int(self): p = RDFProfile(_default_graph())