diff --git a/project/dalia/query/items/facets/facet_objects.py b/project/dalia/query/items/facets/facet_objects.py index 9159df259122a8c284f9748f92c7573823208b57..7bff7c933419cc8eecfc86ec6a689dd933f14fcb 100644 --- a/project/dalia/query/items/facets/facet_objects.py +++ b/project/dalia/query/items/facets/facet_objects.py @@ -1,9 +1,11 @@ from typing import Callable, Dict -from rdflib import DCTERMS, URIRef, XSD -from rdflib.term import Literal, Node +from rdflib import DCTERMS, SKOS, URIRef, XSD +from rdflib.term import Node -from project.dalia.rdf.namespace import MoDalia, SCHEMA, bibo, hcrt +from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL +from project.dalia.query.utils import Dataset, filter_by_lang +from project.dalia.rdf.namespace import MoDalia, SCHEMA, SKOS_last_call, bibo, hcrt class FacetObject: @@ -18,17 +20,22 @@ class FacetObject: This class could not be rewritten as frozen dataclass because the items field is mutable (there are no frozen dicts). """ + def __init__( self, label: str, key: URIRef, predicate: URIRef, + label_dataset: Dataset, + label_graph_pattern: tuple, items: Dict[Node, str], selected_facet_initializer: Callable[[str], Node] ): self.label = label self.key = key self.predicate = predicate + self.label_dataset = label_dataset + self.label_graph_pattern = label_graph_pattern self.items = items self.selected_facet_initializer = selected_facet_initializer @@ -37,6 +44,11 @@ TARGET_AUDIENCE_FACET = FacetObject( label="Target Audience", key=MoDalia.TargetGroup, predicate=MoDalia.hasTargetGroup, + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=( + (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), + filter_by_lang(VAR_LABEL), + ), items={ MoDalia.StudentSchool: "Student (School)", MoDalia.BachelorStudent: "Bachelor Student", @@ -55,6 +67,11 @@ MEDIA_TYPE_FACET = FacetObject( label="Media Type", key=MoDalia.MediaType, predicate=MoDalia.hasMediaType, + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=( + (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), + filter_by_lang(VAR_LABEL), + ), items={ SCHEMA.AudioObject: "Audio", MoDalia.Code: "Code", @@ -71,6 +88,11 @@ LEARNING_RESOURCE_TYPE_FACET = FacetObject( label="Learning Resource Type", key=MoDalia.LearningResourceType, predicate=MoDalia.hasLearningType, + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=( + (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), + filter_by_lang(VAR_LABEL), + ), items={ bibo.Article: "Article", hcrt.assessment: "Assessment", @@ -103,6 +125,11 @@ LANGUAGE_FACET = FacetObject( label="Language", key=XSD.language, predicate=DCTERMS.language, + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=( + (VAR_ITEM, SKOS_last_call.prefLabel, VAR_LABEL), + filter_by_lang(VAR_LABEL), + ), items={ URIRef("http://lexvo.org/id/iso639-3/eng"): "English", URIRef("http://lexvo.org/id/iso639-3/fra"): "French", diff --git a/project/dalia/query/items/metadata/languages.py b/project/dalia/query/items/metadata/languages.py index 37b175b14ce9ae5f589d04f151c3f197841e7b6e..2afd90d3871af59f7f937ccccf7e5cc9675dc09e 100644 --- a/project/dalia/query/items/metadata/languages.py +++ b/project/dalia/query/items/metadata/languages.py @@ -3,9 +3,10 @@ from typing import Collection, Dict, List from rdflib import DCTERMS, URIRef from rdflib.term import Node +from project.dalia.query.items.facets.facet_objects import LANGUAGE_FACET from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources -from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris -from project.dalia.query.utils import Dataset, filter_by_lang +from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris_for_facet +from project.dalia.query.utils import filter_by_lang from project.dalia.rdf.namespace import SKOS_last_call _LABEL_GRAPH_PATTERN = ( @@ -15,7 +16,7 @@ _LABEL_GRAPH_PATTERN = ( def _map_language_uris_to_string_label(items: Collection[Node]) -> Dict[Node, str]: - return get_labels_for_item_uris(items, Dataset.ONTOLOGIES, _LABEL_GRAPH_PATTERN) + return get_labels_for_item_uris_for_facet(items, LANGUAGE_FACET) def get_languages_for_resources(resource_uri_refs: List[URIRef]) -> Dict[URIRef, List[str]]: diff --git a/project/dalia/query/items/metadata/learning_resource_types.py b/project/dalia/query/items/metadata/learning_resource_types.py index 6a3aaa9b032f030bb1ad567504c4d207d0fc88b1..89d9572fd1a46efbbef1853e84488d50d462749f 100644 --- a/project/dalia/query/items/metadata/learning_resource_types.py +++ b/project/dalia/query/items/metadata/learning_resource_types.py @@ -1,23 +1,18 @@ from typing import Collection, Dict, List -from rdflib import SKOS, URIRef +from rdflib import URIRef from rdflib.term import Node from project.dalia.api_models.api_models import LabelValueItem +from project.dalia.query.items.facets.facet_objects import LEARNING_RESOURCE_TYPE_FACET from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources -from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris +from project.dalia.query.labels.label_service import get_labels_for_item_uris_for_facet from project.dalia.query.labels.utils import remap_to_label_value_item -from project.dalia.query.utils import Dataset, filter_by_lang from project.dalia.rdf.namespace import MoDalia -_LABEL_GRAPH_PATTERN = ( - (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), - filter_by_lang(VAR_LABEL), -) - def _map_learning_resource_type_uris_to_label_value_items(items: Collection[Node]) -> Dict[Node, LabelValueItem]: - mapping = get_labels_for_item_uris(items, Dataset.ONTOLOGIES, _LABEL_GRAPH_PATTERN) + mapping = get_labels_for_item_uris_for_facet(items, LEARNING_RESOURCE_TYPE_FACET) return remap_to_label_value_item(mapping) diff --git a/project/dalia/query/items/metadata/media_types.py b/project/dalia/query/items/metadata/media_types.py index 3570481964f44cc2af154eaa265fb7ca75199eab..c2ba0aa83ff1e42177c17dee68864406a400bb54 100644 --- a/project/dalia/query/items/metadata/media_types.py +++ b/project/dalia/query/items/metadata/media_types.py @@ -1,23 +1,18 @@ from typing import Collection, Dict, List -from rdflib import SKOS, URIRef +from rdflib import URIRef from rdflib.term import Node from project.dalia.api_models.api_models import LabelValueItem +from project.dalia.query.items.facets.facet_objects import MEDIA_TYPE_FACET from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources -from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris +from project.dalia.query.labels.label_service import get_labels_for_item_uris_for_facet from project.dalia.query.labels.utils import remap_to_label_value_item -from project.dalia.query.utils import Dataset, filter_by_lang from project.dalia.rdf.namespace import MoDalia -_LABEL_GRAPH_PATTERN = ( - (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), - filter_by_lang(VAR_LABEL), -) - def _map_media_type_uris_to_label_value_items(items: Collection[Node]) -> Dict[Node, LabelValueItem]: - mapping = get_labels_for_item_uris(items, Dataset.ONTOLOGIES, _LABEL_GRAPH_PATTERN) + mapping = get_labels_for_item_uris_for_facet(items, MEDIA_TYPE_FACET) return remap_to_label_value_item(mapping) diff --git a/project/dalia/query/items/metadata/target_groups.py b/project/dalia/query/items/metadata/target_groups.py index a75a354fe56cc72b191ed7b0be31e0a3485ec954..9528e6e1791f897beae59597148d221bc8dfa627 100644 --- a/project/dalia/query/items/metadata/target_groups.py +++ b/project/dalia/query/items/metadata/target_groups.py @@ -1,23 +1,18 @@ from typing import Collection, Dict, List -from rdflib import SKOS, URIRef +from rdflib import URIRef from rdflib.term import Node from project.dalia.api_models.api_models import LabelValueItem +from project.dalia.query.items.facets.facet_objects import TARGET_AUDIENCE_FACET from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources -from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris +from project.dalia.query.labels.label_service import get_labels_for_item_uris_for_facet from project.dalia.query.labels.utils import remap_to_label_value_item -from project.dalia.query.utils import Dataset, filter_by_lang from project.dalia.rdf.namespace import MoDalia -_LABEL_GRAPH_PATTERN = ( - (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), - filter_by_lang(VAR_LABEL), -) - def _map_target_group_uris_to_label_value_items(items: Collection[Node]) -> Dict[Node, LabelValueItem]: - mapping = get_labels_for_item_uris(items, Dataset.ONTOLOGIES, _LABEL_GRAPH_PATTERN) + mapping = get_labels_for_item_uris_for_facet(items, TARGET_AUDIENCE_FACET) return remap_to_label_value_item(mapping) diff --git a/project/dalia/query/labels/label_service.py b/project/dalia/query/labels/label_service.py index 35f0f61e6edcc90572b54aad816335831774bbde..47336c02387930214d13f4a4b3ce3fe3cc8469fc 100644 --- a/project/dalia/query/labels/label_service.py +++ b/project/dalia/query/labels/label_service.py @@ -55,3 +55,15 @@ def get_labels_for_item_uris( query = prepare_query_for_labels_from_items(items, graph_pattern, order_by) results = query_dataset(dataset, query) return _process_results(results) + + +def get_labels_for_item_uris_for_facet(items: Collection[URIRef], facet) -> Dict[URIRef, str]: + """ + Retrieves the labels for the given items and the given facet. + + :param items: URIRefs of the items + :param facet: facet definition + :return: Associations between the item URIRefs and their respective label. The insertion order of this dictionary + reflects the specified order. + """ + return get_labels_for_item_uris(items, facet.label_dataset, facet.label_graph_pattern) diff --git a/tests/project/dalia/query/items/basic_search_filters/test_basic_search_filters.py b/tests/project/dalia/query/items/basic_search_filters/test_basic_search_filters.py index 0756474cedd3b1fb5d63470d3433271dea6f4085..b6945135a52b06535130c7350537e45d1f12e439 100644 --- a/tests/project/dalia/query/items/basic_search_filters/test_basic_search_filters.py +++ b/tests/project/dalia/query/items/basic_search_filters/test_basic_search_filters.py @@ -3,9 +3,11 @@ from rdflib import URIRef from rest_framework import status from project.dalia.api_models.api_models import BasicSearchFilter, BasicSearchFilterKey, BasicSearchFilterValue -from project.dalia.query.items.basic_search_filters.basic_search_filters import \ - prepare_query_to_get_all_existing_filter_items_for_facet +from project.dalia.query.items.basic_search_filters.basic_search_filters import ( + prepare_query_to_get_all_existing_filter_items_for_facet, +) from project.dalia.query.items.facets.facet_objects import FacetObject +from project.dalia.query.utils import Dataset from project.dalia.rdf.namespace import MoDalia, SCHEMA, bibo, hcrt from project.dalia.serializers import BasicSearchFilterSerializer from tests.project.dalia.utils import dedent_and_normalize, normalize @@ -14,6 +16,8 @@ _TEST_FACET = FacetObject( label="Test facet", key=URIRef("http://example/testFacet"), predicate=URIRef("http://example/hasTestFacet"), + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=(), items={ URIRef("http://example/testFacetItem1"): "Item 1", URIRef("http://example/testFacetItem2"): "Item 2", diff --git a/tests/project/dalia/query/items/facets/utils.py b/tests/project/dalia/query/items/facets/utils.py index 767e9e553357fcd7f3f47bd63e3ee12e6b4e5636..66579bd1124a07729ea9701e461c869546c6b3c0 100644 --- a/tests/project/dalia/query/items/facets/utils.py +++ b/tests/project/dalia/query/items/facets/utils.py @@ -1,11 +1,14 @@ from rdflib import Literal, URIRef from project.dalia.query.items.facets.facet_objects import FacetObject +from project.dalia.query.utils import Dataset TEST_FACET1 = FacetObject( label="facet1", key=URIRef("facet1-key"), predicate=URIRef("facet1-predicate"), + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=(), items={ URIRef("facet1-item1"): "", URIRef("facet1-item2"): "", @@ -18,6 +21,8 @@ TEST_FACET2 = FacetObject( label="facet2", key=URIRef("facet2-key"), predicate=URIRef("facet2-predicate"), + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=(), items={ URIRef("facet2-item1"): "", }, @@ -27,6 +32,8 @@ TEST_FACET3 = FacetObject( label="facet3", key=URIRef("facet3-key"), predicate=URIRef("facet3-predicate"), + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=(), items={ URIRef("facet3-item1"): "", URIRef("facet3-item2"): "", @@ -37,6 +44,8 @@ TEST_FACET4 = FacetObject( label="facet4", key=URIRef("facet4-key"), predicate=URIRef("facet4-predicate"), + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=(), items={ Literal("facet4-item1"): "", Literal("facet4-item2"): "",