diff --git a/project/dalia/query/items/basic_search_filters/basic_search_filters.py b/project/dalia/query/items/basic_search_filters/basic_search_filters.py index 8368ccb9fc2d02f612b3b17c26c05c79b3498903..15d15a89cb56b494404730fbe16e38ec5d93e96a 100644 --- a/project/dalia/query/items/basic_search_filters/basic_search_filters.py +++ b/project/dalia/query/items/basic_search_filters/basic_search_filters.py @@ -8,6 +8,7 @@ from project.dalia.query.items.facets.facet_objects import ( LANGUAGE_FACET, LEARNING_RESOURCE_TYPE_FACET, MEDIA_TYPE_FACET, + PROFICIENCY_LEVEL_FACET, TARGET_AUDIENCE_FACET, ) from project.dalia.query.labels.label_service import get_labels_for_item_uris_for_facet @@ -17,6 +18,7 @@ from project.dalia.rdf.namespace import educor _BASIC_SEARCH_FILTER_FACETS = [ TARGET_AUDIENCE_FACET, + PROFICIENCY_LEVEL_FACET, MEDIA_TYPE_FACET, LEARNING_RESOURCE_TYPE_FACET, LANGUAGE_FACET, diff --git a/project/dalia/query/items/facets/facet_objects.py b/project/dalia/query/items/facets/facet_objects.py index 5747dbef282ca15591adee4431157a605b31b37f..b2b1d5fec9b6da4f0b3c9d81c25cd325a79affdc 100644 --- a/project/dalia/query/items/facets/facet_objects.py +++ b/project/dalia/query/items/facets/facet_objects.py @@ -1,6 +1,7 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field +from typing import Any -from rdflib import DCTERMS, SKOS, URIRef, XSD +from rdflib import DCTERMS, RDFS, SKOS, URIRef, Variable, XSD from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL from project.dalia.query.utils import Dataset, filter_by_lang @@ -17,7 +18,7 @@ class FacetObject: predicate: URIRef label_dataset: Dataset label_graph_pattern: tuple - label_order = VAR_LABEL + label_order: Any = field(default=VAR_LABEL) TARGET_AUDIENCE_FACET = FacetObject( @@ -63,3 +64,18 @@ LANGUAGE_FACET = FacetObject( filter_by_lang(VAR_LABEL), ), ) + +_VAR_LEVEL_ORDER = Variable("levelOrder") + +PROFICIENCY_LEVEL_FACET = FacetObject( + label="Proficiency Level", + key=MoDalia.Proficiency, + predicate=MoDalia.requiresProficiencyLevel, + label_dataset=Dataset.ONTOLOGIES, + label_graph_pattern=( + (VAR_ITEM, RDFS.label, VAR_LABEL), + (VAR_ITEM, MoDalia.hasOrder, _VAR_LEVEL_ORDER), + filter_by_lang(VAR_LABEL), + ), + label_order=_VAR_LEVEL_ORDER, +) diff --git a/project/dalia/query/items/metadata/proficiency_levels.py b/project/dalia/query/items/metadata/proficiency_levels.py index 244320d8a17d456b8fe673e912323b5c511b2c98..004f424fcb68cc1f6d1e37b4b1a23dfd762ad0cf 100644 --- a/project/dalia/query/items/metadata/proficiency_levels.py +++ b/project/dalia/query/items/metadata/proficiency_levels.py @@ -4,8 +4,10 @@ from rdflib import RDFS, URIRef from rdflib.term import Node, Variable from project.dalia.api_models.api_models import LabelValueItem +from project.dalia.query.items.facets.facet_objects import PROFICIENCY_LEVEL_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 VAR_ITEM, VAR_LABEL, get_labels_for_item_uris, \ + 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 @@ -20,7 +22,7 @@ _LABEL_GRAPH_PATTERN = ( def _map_proficiency_level_uris_to_label_value_items(items: Collection[Node]) -> Dict[Node, LabelValueItem]: - mapping = get_labels_for_item_uris(items, Dataset.ONTOLOGIES, _LABEL_GRAPH_PATTERN, order_by=_VAR_LEVEL_ORDER) + mapping = get_labels_for_item_uris_for_facet(items, PROFICIENCY_LEVEL_FACET) return remap_to_label_value_item(mapping) diff --git a/project/dalia/query/items/search/text_search.py b/project/dalia/query/items/search/text_search.py index 531f70d3cbebc9a4bdcef007e70a50bb7c737dba..d8a5bc9150dc279a65125d30cdb06f441ad880b2 100644 --- a/project/dalia/query/items/search/text_search.py +++ b/project/dalia/query/items/search/text_search.py @@ -10,6 +10,7 @@ from project.dalia.query.items.facets.facet_objects import ( LANGUAGE_FACET, LEARNING_RESOURCE_TYPE_FACET, MEDIA_TYPE_FACET, + PROFICIENCY_LEVEL_FACET, TARGET_AUDIENCE_FACET, ) from project.dalia.query.items.metadata.items import get_metadata_for_learning_resources @@ -22,6 +23,7 @@ from project.dalia.rdf.namespace.xpath_functions import day_from_date, month_fro _ITEM_SEARCH_FACETS = [ TARGET_AUDIENCE_FACET, + PROFICIENCY_LEVEL_FACET, MEDIA_TYPE_FACET, LEARNING_RESOURCE_TYPE_FACET, LANGUAGE_FACET, diff --git a/project/dalia/query/labels/label_service.py b/project/dalia/query/labels/label_service.py index 47336c02387930214d13f4a4b3ce3fe3cc8469fc..f3948274915ecfe56328c349ebed507be16c75d7 100644 --- a/project/dalia/query/labels/label_service.py +++ b/project/dalia/query/labels/label_service.py @@ -66,4 +66,4 @@ def get_labels_for_item_uris_for_facet(items: Collection[URIRef], facet) -> Dict :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) + return get_labels_for_item_uris(items, facet.label_dataset, facet.label_graph_pattern, facet.label_order) 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 606c69f099cdbf4b9754258bea5ca5404101b426..ff8908abb50a312a4257d8fa6aa42021b96980f8 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 @@ -11,6 +11,7 @@ from project.dalia.query.items.facets.facet_objects import ( LANGUAGE_FACET, LEARNING_RESOURCE_TYPE_FACET, MEDIA_TYPE_FACET, + PROFICIENCY_LEVEL_FACET, TARGET_AUDIENCE_FACET, ) from project.dalia.query.utils import Dataset @@ -62,6 +63,16 @@ def test_get_on_BasicSearchFiltersView_returns_200_and_all_available_filters(tri BasicSearchFilterValue(label='Teacher (School)', value=str(MoDalia.TeacherSchool)), ] ), + BasicSearchFilter( + key=BasicSearchFilterKey(name=str(PROFICIENCY_LEVEL_FACET.key), label=PROFICIENCY_LEVEL_FACET.label), + values=[ + BasicSearchFilterValue(label='Novice', value='https://purl.org/ontology/modalia#Novice'), + BasicSearchFilterValue(label='Advanced Beginner', value='https://purl.org/ontology/modalia#Beginner'), + BasicSearchFilterValue(label='Competent', value='https://purl.org/ontology/modalia#Competent'), + BasicSearchFilterValue(label='Proficient', value='https://purl.org/ontology/modalia#Proficient'), + BasicSearchFilterValue(label='Expert', value='https://purl.org/ontology/modalia#Expert'), + ] + ), BasicSearchFilter( key=BasicSearchFilterKey(name=str(MEDIA_TYPE_FACET.key), label=MEDIA_TYPE_FACET.label), values=[