fix: handle invalid source library version on course import

Importing a course with an invalid source library version (e.g. created on
another instance) should not make the import fail.
This commit is contained in:
Agrendalath
2021-07-16 17:37:16 +02:00
committed by Braden MacDonald
parent 8be9fb6b51
commit 4b8421dfd8
2 changed files with 28 additions and 15 deletions

View File

@@ -2,6 +2,7 @@
Unit tests for course import and export
"""
import copy
import itertools
import json
import logging
import os
@@ -15,6 +16,7 @@ from uuid import uuid4
import ddt
import lxml
from bson import ObjectId
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.exceptions import SuspiciousOperation
@@ -1076,7 +1078,7 @@ class TestCourseExportImport(LibraryTestCase):
self.source_course = CourseFactory.create(default_store=ModuleStoreEnum.Type.split)
self.addCleanup(shutil.rmtree, self.export_dir, ignore_errors=True)
def _setup_source_course_with_library_content(self, publish=False):
def _setup_source_course_with_library_content(self, publish=False, version=None):
"""
Sets up course with library content.
"""
@@ -1095,7 +1097,9 @@ class TestCourseExportImport(LibraryTestCase):
parent_location=sequential.location,
display_name='Test Unit'
)
lc_block = self._add_library_content_block(vertical, self.lib_key, publish_item=publish)
lc_block = self._add_library_content_block(
vertical, self.lib_key, publish_item=publish, other_settings=dict(source_library_version=version)
)
self._refresh_children(lc_block)
def get_lib_content_block_children(self, block_location):
@@ -1134,13 +1138,18 @@ class TestCourseExportImport(LibraryTestCase):
dest_child = self.store.get_item(dest_child_location)
self.assertEqual(source_child.display_name, dest_child.display_name)
@ddt.data(True, False)
def test_library_content_on_course_export_import(self, publish_item):
@ddt.data(*itertools.product([False, True], repeat=2))
@ddt.unpack
def test_library_content_on_course_export_import(self, publish_item, generate_version):
"""
Verify that library contents in destination and source courses are same after importing
the source course into destination course.
If a library with the specified version does not exist in the modulestore, the import should not fail.
"""
self._setup_source_course_with_library_content(publish=publish_item)
self._setup_source_course_with_library_content(
publish=publish_item, version=str(ObjectId()) if generate_version else None
)
# Create a course to import source course.
dest_course = CourseFactory.create(default_store=ModuleStoreEnum.Type.split)

View File

@@ -897,16 +897,20 @@ def _update_and_import_module(
if lib_content_block_already_published:
return block
# Update library content block's children on draft branch
with store.branch_setting(branch_setting=ModuleStoreEnum.Branch.draft_preferred):
LibraryToolsService(store, user_id).update_children(
block,
version=block.source_library_version,
)
# Publish it if importing the course for branch setting published_only.
if store.get_branch_setting() == ModuleStoreEnum.Branch.published_only:
store.publish(block.location, user_id)
try:
# Update library content block's children on draft branch
with store.branch_setting(branch_setting=ModuleStoreEnum.Branch.draft_preferred):
LibraryToolsService(store, user_id).update_children(
block,
version=block.source_library_version,
)
except ValueError as err:
# The specified library version does not exist.
log.error(err)
else:
# Publish it if importing the course for branch setting published_only.
if store.get_branch_setting() == ModuleStoreEnum.Branch.published_only:
store.publish(block.location, user_id)
return block