This introduces the modulestore_migrator app, which can be used to copy content (courses and libraries) from modulestore into Learning Core. It is currently aimed to work on the legacy library -> v2 library migration, but it will be used in the future for course->library and course->course migrations. This includes an initial REST API, Django admin interface, and Python API. Closes: https://github.com/openedx/edx-platform/issues/37211 Requires some follow-up work before this is production-ready: https://github.com/openedx/edx-platform/issues/37259 Co-authored-by: Andrii <andrii.hantkovskyi@raccoongang.com> Co-authored-by: Maksim Sokolskiy <maksim.sokolskiy@raccoongang.com>
59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
"""
|
|
API for migration from modulestore to learning core
|
|
"""
|
|
from opaque_keys.edx.locator import LibraryLocatorV2
|
|
from opaque_keys.edx.keys import LearningContextKey
|
|
from openedx_learning.api.authoring import get_collection
|
|
from celery.result import AsyncResult
|
|
|
|
from openedx.core.djangoapps.content_libraries.api import get_library
|
|
from openedx.core.types.user import AuthUser
|
|
|
|
from . import tasks
|
|
from .data import RepeatHandlingStrategy
|
|
from .models import ModulestoreSource
|
|
|
|
|
|
__all__ = (
|
|
"start_migration_to_library",
|
|
)
|
|
|
|
|
|
def start_migration_to_library(
|
|
*,
|
|
user: AuthUser,
|
|
source_key: LearningContextKey,
|
|
target_library_key: LibraryLocatorV2,
|
|
target_collection_slug: str | None = None,
|
|
composition_level: str,
|
|
repeat_handling_strategy: str,
|
|
preserve_url_slugs: bool,
|
|
forward_source_to_target: bool,
|
|
) -> AsyncResult:
|
|
"""
|
|
Import a course or legacy library into a V2 library (or, a collection within a V2 library).
|
|
"""
|
|
# Can raise NotImplementedError for the Fork strategy
|
|
assert RepeatHandlingStrategy(repeat_handling_strategy).is_implemented()
|
|
|
|
source, _ = ModulestoreSource.objects.get_or_create(key=source_key)
|
|
target_library = get_library(target_library_key)
|
|
# get_library ensures that the library is connected to a learning package.
|
|
target_package_id: int = target_library.learning_package_id # type: ignore[assignment]
|
|
target_collection_id = None
|
|
|
|
if target_collection_slug:
|
|
target_collection_id = get_collection(target_package_id, target_collection_slug).id
|
|
|
|
return tasks.migrate_from_modulestore.delay(
|
|
user_id=user.id,
|
|
source_pk=source.id,
|
|
target_package_pk=target_package_id,
|
|
target_library_key=str(target_library_key),
|
|
target_collection_pk=target_collection_id,
|
|
composition_level=composition_level,
|
|
repeat_handling_strategy=repeat_handling_strategy,
|
|
preserve_url_slugs=preserve_url_slugs,
|
|
forward_source_to_target=forward_source_to_target,
|
|
)
|