diff --git a/project/dalia/api_models/api_models.py b/project/dalia/api_models/api_models.py index 2eb2d4daa0cb4514519d37a76a51587d92616527..8e6e81a6127212e6f82199f106231b6724514108 100644 --- a/project/dalia/api_models/api_models.py +++ b/project/dalia/api_models/api_models.py @@ -38,11 +38,6 @@ UniqueId = str UniqueSlug = str -class Language(Enum): - en = 'en' - de = 'de' - - @dataclass class Version: version_title: Optional[str] = None @@ -168,7 +163,7 @@ class ResourceSpecial: license: Optional[License] = None publication_date: Optional[str] = None links: Optional[List[str]] = None - languages: Optional[List[Language]] = None + languages: Optional[List[str]] = None file_size: Optional[str] = None publisher: Optional[str] = None doi: Optional[str] = None diff --git a/project/dalia/query/items/metadata/items.py b/project/dalia/query/items/metadata/items.py index d42e8703c81cf5b3d3b84b40b429a4231462c52a..6c2e2920f6517b979ddbe902d3dc311ee23153aa 100644 --- a/project/dalia/query/items/metadata/items.py +++ b/project/dalia/query/items/metadata/items.py @@ -8,6 +8,7 @@ from project.dalia.query.items.metadata.authors import get_authors_metadata_for_ from project.dalia.query.items.metadata.format import get_format_metadata_for_resources from project.dalia.query.items.metadata.item_communities import get_communities_for_resources from project.dalia.query.items.metadata.keywords import get_keywords_metadata_for_resources +from project.dalia.query.items.metadata.languages import get_languages_for_resources from project.dalia.query.items.metadata.one_to_one_metadata import get_one_to_one_metadata_for_resources from project.dalia.rdf.prefix import LEARNING_RESOURCE_BASE_URI @@ -32,6 +33,7 @@ def get_metadata_for_learning_resources(resource_uri_refs: List[URIRef]) -> List items_keywords = get_keywords_metadata_for_resources(resource_uri_refs) items_authors = get_authors_metadata_for_resources(resource_uri_refs) items_communities = get_communities_for_resources(resource_uri_refs) + items_languages = get_languages_for_resources(resource_uri_refs) results = [] for resource_uri_ref in resource_uri_refs: @@ -43,19 +45,22 @@ def get_metadata_for_learning_resources(resource_uri_refs: List[URIRef]) -> List item_keywords = items_keywords.get(resource_uri_ref) item_authors = items_authors.get(resource_uri_ref) item_communities = items_communities.get(resource_uri_ref) + item_languages = items_languages.get(resource_uri_ref) - _add_metadata_to_item(item, item_format, item_keywords, item_authors, item_communities) + _add_metadata_to_item(item, item_format, item_keywords, item_authors, item_communities, item_languages) results.append(item) return results +# TODO: replace the growing list of parameters with kwargs and use get() with reasonable defaults def _add_metadata_to_item( item: Resource, item_format: Optional[str], item_keywords: Optional[List[str]], item_authors: Optional[List[Union[PersonAuthor, OrganizationAuthor]]], item_communities: Optional[List[Community]], + item_languages: Optional[List[str]], ) -> None: if item_format: item.format = item_format @@ -67,7 +72,7 @@ def _add_metadata_to_item( item.comments = 0 item.image = None item.links = None - item.languages = [] + item.languages = item_languages if item_languages else [] item.publisher = None item.doi = None item.learning_time = 10 diff --git a/project/dalia/query/items/metadata/languages.py b/project/dalia/query/items/metadata/languages.py new file mode 100644 index 0000000000000000000000000000000000000000..7f7f2b5a604288547b04c512d34d5a88688d7b45 --- /dev/null +++ b/project/dalia/query/items/metadata/languages.py @@ -0,0 +1,56 @@ +from collections import defaultdict +from typing import Dict, List + +from rdflib import DCTERMS, Literal, RDF, URIRef, Variable + +from project.dalia.query.items.facets.facet_objects import LANGUAGE_FACET +from project.dalia.query.utils import query_dalia_dataset +from project.dalia.query_builder.query_builder import QueryBuilder, VALUES +from project.dalia.rdf.namespace import educor + +_VARIABLES = { + "lr": Variable("lr"), + "language": Variable("language") +} + + +def prepare_query_for_languages_for_resources(resource_uri_refs: List[URIRef]) -> str: + var_lr = _VARIABLES["lr"] + + resource_uri_ref_blocks = [[uri_ref] for uri_ref in resource_uri_refs] + + return QueryBuilder().SELECT( + *_VARIABLES.values() + ).WHERE( + VALUES( + [var_lr], + resource_uri_ref_blocks + ), + (var_lr, RDF.type, educor.EducationalResource), + (var_lr, DCTERMS.language, _VARIABLES["language"]) + ).build() + + +LANGUAGE_LABEL_MAPPING = LANGUAGE_FACET.items + + +def languages_from_results(results) -> Dict[URIRef, List[str]]: + lr_languages = defaultdict(list) + + for result in results: + lr_languages[result.lr].append(LANGUAGE_LABEL_MAPPING[result.language]) + + return lr_languages + + +def get_languages_for_resources(resource_uri_refs: List[URIRef]) -> Dict[URIRef, List[str]]: + """ + Retrieve the languages for each of the given learning resource URIRefs. + + :param resource_uri_refs: List of learning resource URIRefs + :return: Associations between the learning resource URIRefs and their respective list of languages. + """ + query = prepare_query_for_languages_for_resources(resource_uri_refs) + + results = query_dalia_dataset(query) + return languages_from_results(results) diff --git a/tests/project/dalia/query/items/metadata/test_languages.py b/tests/project/dalia/query/items/metadata/test_languages.py new file mode 100644 index 0000000000000000000000000000000000000000..0e1addad546abbe32518ae7b0a2333b27d81fcd7 --- /dev/null +++ b/tests/project/dalia/query/items/metadata/test_languages.py @@ -0,0 +1,45 @@ +from rdflib import URIRef + +from project.dalia.query.items.metadata.languages import ( + get_languages_for_resources, + prepare_query_for_languages_for_resources, +) +from tests.project.dalia.utils import dedent_and_normalize, normalize + + +def test_prepare_query_for_languages_for_resources(): + query = prepare_query_for_languages_for_resources([URIRef("abc"), URIRef("def")]) + + assert normalize(query) == dedent_and_normalize(""" + SELECT ?lr ?language + WHERE { + VALUES ( ?lr ) { + ( <abc> ) + ( <def> ) + } + ?lr <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://github.com/tibonto/educor#EducationalResource> . + ?lr <http://purl.org/dc/terms/language> ?language . + } + """) + + +def test_get_languages_for_resources(triplestore): + lr_languages = get_languages_for_resources([ + URIRef("https://id.dalia.education/learning-resource/b9eb08a4-82d2-43f5-b690-1896b6c0509f"), + URIRef("https://id.dalia.education/learning-resource/0d70949d-e46e-4459-be3d-edd4d4ef6098"), + URIRef("https://id.dalia.education/learning-resource/4c45f536-2719-426e-bdfc-1c41da3dd381"), + URIRef("http://does-not-exist/123"), + ]) + + assert lr_languages == { + URIRef('https://id.dalia.education/learning-resource/b9eb08a4-82d2-43f5-b690-1896b6c0509f'): [ + 'German', + ], + URIRef('https://id.dalia.education/learning-resource/0d70949d-e46e-4459-be3d-edd4d4ef6098'): [ + 'English', + ], + URIRef('https://id.dalia.education/learning-resource/4c45f536-2719-426e-bdfc-1c41da3dd381'): [ + 'English', + 'German', + ], + }