Skip to content

Commit 6deb4f8

Browse files
authored
fix: add to search index when creating library from archive (#37526)
Implement full re-index process when creating a library.
1 parent 8aaae46 commit 6deb4f8

File tree

10 files changed

+82
-12
lines changed

10 files changed

+82
-12
lines changed

openedx/core/djangoapps/content/search/api.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,7 @@ def upsert_library_container_index_doc(container_key: LibraryContainerLocator) -
873873
_update_index_docs([doc])
874874

875875

876-
def upsert_content_library_index_docs(library_key: LibraryLocatorV2) -> None:
876+
def upsert_content_library_index_docs(library_key: LibraryLocatorV2, full_index: bool = False) -> None:
877877
"""
878878
Creates or updates the documents for the given Content Library in the search index
879879
"""
@@ -883,6 +883,21 @@ def upsert_content_library_index_docs(library_key: LibraryLocatorV2) -> None:
883883
doc = searchable_doc_for_library_block(metadata)
884884
docs.append(doc)
885885

886+
if full_index:
887+
# For a full re-index, we also need to update collections, and containers data:
888+
for container in lib_api.get_library_containers(library_key):
889+
container_key = lib_api.library_container_locator(
890+
library_key,
891+
container,
892+
)
893+
doc = searchable_doc_for_container(container_key)
894+
docs.append(doc)
895+
896+
for collection in lib_api.get_library_collections(library_key):
897+
collection_key = lib_api.library_collection_locator(library_key, collection.key)
898+
doc = searchable_doc_for_collection(collection_key, collection=collection)
899+
docs.append(doc)
900+
886901
_update_index_docs(docs)
887902

888903

openedx/core/djangoapps/content/search/handlers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
XBlockData,
2020
)
2121
from openedx_events.content_authoring.signals import (
22+
CONTENT_LIBRARY_CREATED,
2223
CONTENT_LIBRARY_DELETED,
2324
CONTENT_LIBRARY_UPDATED,
2425
CONTENT_OBJECT_ASSOCIATIONS_CHANGED,
@@ -187,6 +188,21 @@ def library_block_deleted(**kwargs) -> None:
187188
delete_library_block_index_doc.apply(args=[str(library_block_data.usage_key)])
188189

189190

191+
@receiver(CONTENT_LIBRARY_CREATED)
192+
@only_if_meilisearch_enabled
193+
def content_library_created_handler(**kwargs) -> None:
194+
"""
195+
Create the index for the content library
196+
"""
197+
content_library_data = kwargs.get("content_library", None)
198+
if not content_library_data or not isinstance(content_library_data, ContentLibraryData): # pragma: no cover
199+
log.error("Received null or incorrect data for event")
200+
return
201+
library_key = content_library_data.library_key
202+
203+
update_content_library_index_docs.apply(args=[str(library_key), True])
204+
205+
190206
@receiver(CONTENT_LIBRARY_UPDATED)
191207
@only_if_meilisearch_enabled
192208
def content_library_updated_handler(**kwargs) -> None:

openedx/core/djangoapps/content/search/tasks.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,16 @@ def delete_library_block_index_doc(usage_key_str: str) -> None:
9191

9292
@shared_task(base=LoggedTask, autoretry_for=(MeilisearchError, ConnectionError))
9393
@set_code_owner_attribute
94-
def update_content_library_index_docs(library_key_str: str) -> None:
94+
def update_content_library_index_docs(library_key_str: str, full_index: bool = False) -> None:
9595
"""
9696
Celery task to update the content index documents for all library blocks in a library
9797
"""
9898
library_key = LibraryLocatorV2.from_string(library_key_str)
9999

100100
log.info("Updating content index documents for library with id: %s", library_key)
101101

102-
api.upsert_content_library_index_docs(library_key)
102+
# If full_index is True, also update collections and containers data
103+
api.upsert_content_library_index_docs(library_key, full_index=full_index)
103104

104105

105106
@shared_task(base=LoggedTask, autoretry_for=(MeilisearchError, ConnectionError))

openedx/core/djangoapps/content_libraries/api/blocks.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@
3737
LIBRARY_CONTAINER_UPDATED
3838
)
3939
from openedx_learning.api import authoring as authoring_api
40-
from openedx_learning.api.authoring_models import Component, ComponentVersion, LearningPackage, MediaType
40+
from openedx_learning.api.authoring_models import (
41+
Component, ComponentVersion, LearningPackage, MediaType,
42+
Container, Collection
43+
)
4144
from xblock.core import XBlock
4245

4346
from openedx.core.djangoapps.xblock.api import (
@@ -80,6 +83,8 @@
8083
__all__ = [
8184
# API methods
8285
"get_library_components",
86+
"get_library_containers",
87+
"get_library_collections",
8388
"get_library_block",
8489
"set_library_block_olx",
8590
"get_component_from_usage_key",
@@ -121,6 +126,33 @@ def get_library_components(
121126
return components
122127

123128

129+
def get_library_containers(library_key: LibraryLocatorV2) -> QuerySet[Container]:
130+
"""
131+
Get all containers in the given content library.
132+
"""
133+
lib = ContentLibrary.objects.get_by_key(library_key) # type: ignore[attr-defined]
134+
learning_package = lib.learning_package
135+
assert learning_package is not None
136+
containers: QuerySet[Container] = authoring_api.get_containers(
137+
learning_package.id
138+
)
139+
140+
return containers
141+
142+
143+
def get_library_collections(library_key: LibraryLocatorV2) -> QuerySet[Collection]:
144+
"""
145+
Get all collections in the given content library.
146+
"""
147+
lib = ContentLibrary.objects.get_by_key(library_key) # type: ignore[attr-defined]
148+
learning_package = lib.learning_package
149+
assert learning_package is not None
150+
collections = authoring_api.get_collections(
151+
learning_package.id
152+
)
153+
return collections
154+
155+
124156
def get_library_block(usage_key: LibraryUsageLocatorV2, include_collections=False) -> LibraryXBlockMetadata:
125157
"""
126158
Get metadata about (the draft version of) one specific XBlock in a library.

openedx/core/djangoapps/content_libraries/api/libraries.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,17 @@
5353
from django.db import IntegrityError, transaction
5454
from django.db.models import Q, QuerySet
5555
from django.utils.translation import gettext as _
56-
from opaque_keys.edx.locator import LibraryLocatorV2, LibraryUsageLocatorV2
57-
from openedx_events.content_authoring.data import ContentLibraryData
56+
from opaque_keys.edx.locator import (
57+
LibraryLocatorV2,
58+
LibraryUsageLocatorV2,
59+
)
60+
from openedx_events.content_authoring.data import (
61+
ContentLibraryData,
62+
)
5863
from openedx_events.content_authoring.signals import (
5964
CONTENT_LIBRARY_CREATED,
6065
CONTENT_LIBRARY_DELETED,
61-
CONTENT_LIBRARY_UPDATED
66+
CONTENT_LIBRARY_UPDATED,
6267
)
6368
from openedx_learning.api import authoring as authoring_api
6469
from openedx_learning.api.authoring_models import Component, LearningPackage
@@ -407,6 +412,7 @@ def create_library(
407412
"""
408413
assert isinstance(org, Organization)
409414
validate_unicode_slug(slug)
415+
is_learning_package_loaded = learning_package is not None
410416
try:
411417
with transaction.atomic():
412418
ref = ContentLibrary.objects.create(

requirements/constraints.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ numpy<2.0.0
6161
# Date: 2023-09-18
6262
# pinning this version to avoid updates while the library is being developed
6363
# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35269
64-
openedx-learning==0.29.0
64+
openedx-learning==0.29.1
6565

6666
# Date: 2023-11-29
6767
# Open AI version 1.0.0 dropped support for openai.ChatCompletion which is currently in use in enterprise.

requirements/edx/base.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ openedx-filters==2.1.0
841841
# ora2
842842
openedx-forum==0.3.8
843843
# via -r requirements/edx/kernel.in
844-
openedx-learning==0.29.0
844+
openedx-learning==0.29.1
845845
# via
846846
# -c requirements/constraints.txt
847847
# -r requirements/edx/kernel.in

requirements/edx/development.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1393,7 +1393,7 @@ openedx-forum==0.3.8
13931393
# via
13941394
# -r requirements/edx/doc.txt
13951395
# -r requirements/edx/testing.txt
1396-
openedx-learning==0.29.0
1396+
openedx-learning==0.29.1
13971397
# via
13981398
# -c requirements/constraints.txt
13991399
# -r requirements/edx/doc.txt

requirements/edx/doc.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ openedx-filters==2.1.0
10151015
# ora2
10161016
openedx-forum==0.3.8
10171017
# via -r requirements/edx/base.txt
1018-
openedx-learning==0.29.0
1018+
openedx-learning==0.29.1
10191019
# via
10201020
# -c requirements/constraints.txt
10211021
# -r requirements/edx/base.txt

requirements/edx/testing.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1059,7 +1059,7 @@ openedx-filters==2.1.0
10591059
# ora2
10601060
openedx-forum==0.3.8
10611061
# via -r requirements/edx/base.txt
1062-
openedx-learning==0.29.0
1062+
openedx-learning==0.29.1
10631063
# via
10641064
# -c requirements/constraints.txt
10651065
# -r requirements/edx/base.txt

0 commit comments

Comments
 (0)