Skip to content
Snippets Groups Projects
Commit bfe6083d authored by Frank Lange's avatar Frank Lange
Browse files

add language to learning resource metadata

parent 1d32ceed
No related branches found
No related tags found
No related merge requests found
Pipeline #1508990 passed
...@@ -38,11 +38,6 @@ UniqueId = str ...@@ -38,11 +38,6 @@ UniqueId = str
UniqueSlug = str UniqueSlug = str
class Language(Enum):
en = 'en'
de = 'de'
@dataclass @dataclass
class Version: class Version:
version_title: Optional[str] = None version_title: Optional[str] = None
...@@ -168,7 +163,7 @@ class ResourceSpecial: ...@@ -168,7 +163,7 @@ class ResourceSpecial:
license: Optional[License] = None license: Optional[License] = None
publication_date: Optional[str] = None publication_date: Optional[str] = None
links: Optional[List[str]] = None links: Optional[List[str]] = None
languages: Optional[List[Language]] = None languages: Optional[List[str]] = None
file_size: Optional[str] = None file_size: Optional[str] = None
publisher: Optional[str] = None publisher: Optional[str] = None
doi: Optional[str] = None doi: Optional[str] = None
......
...@@ -8,6 +8,7 @@ from project.dalia.query.items.metadata.authors import get_authors_metadata_for_ ...@@ -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.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.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.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.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 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 ...@@ -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_keywords = get_keywords_metadata_for_resources(resource_uri_refs)
items_authors = get_authors_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_communities = get_communities_for_resources(resource_uri_refs)
items_languages = get_languages_for_resources(resource_uri_refs)
results = [] results = []
for resource_uri_ref in resource_uri_refs: for resource_uri_ref in resource_uri_refs:
...@@ -43,19 +45,22 @@ def get_metadata_for_learning_resources(resource_uri_refs: List[URIRef]) -> List ...@@ -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_keywords = items_keywords.get(resource_uri_ref)
item_authors = items_authors.get(resource_uri_ref) item_authors = items_authors.get(resource_uri_ref)
item_communities = items_communities.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) results.append(item)
return results return results
# TODO: replace the growing list of parameters with kwargs and use get() with reasonable defaults
def _add_metadata_to_item( def _add_metadata_to_item(
item: Resource, item: Resource,
item_format: Optional[str], item_format: Optional[str],
item_keywords: Optional[List[str]], item_keywords: Optional[List[str]],
item_authors: Optional[List[Union[PersonAuthor, OrganizationAuthor]]], item_authors: Optional[List[Union[PersonAuthor, OrganizationAuthor]]],
item_communities: Optional[List[Community]], item_communities: Optional[List[Community]],
item_languages: Optional[List[str]],
) -> None: ) -> None:
if item_format: if item_format:
item.format = item_format item.format = item_format
...@@ -67,7 +72,7 @@ def _add_metadata_to_item( ...@@ -67,7 +72,7 @@ def _add_metadata_to_item(
item.comments = 0 item.comments = 0
item.image = None item.image = None
item.links = None item.links = None
item.languages = [] item.languages = item_languages if item_languages else []
item.publisher = None item.publisher = None
item.doi = None item.doi = None
item.learning_time = 10 item.learning_time = 10
......
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)
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',
],
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment