diff --git a/cms/djangoapps/contentstore/management/commands/tests/test_create_course.py b/cms/djangoapps/contentstore/management/commands/tests/test_create_course.py index 1bde9f7a07..5ae88a9345 100644 --- a/cms/djangoapps/contentstore/management/commands/tests/test_create_course.py +++ b/cms/djangoapps/contentstore/management/commands/tests/test_create_course.py @@ -29,10 +29,6 @@ class TestArgParsing(unittest.TestCase): with self.assertRaises(CommandError): self.command.handle("foo", "user@foo.org", "org", "course", "run") - def test_xml_store(self): - with self.assertRaises(CommandError): - self.command.handle(ModuleStoreEnum.Type.xml, "user@foo.org", "org", "course", "run") - def test_nonexistent_user_id(self): errstring = "No user 99 found" with self.assertRaisesRegexp(CommandError, errstring): diff --git a/cms/djangoapps/contentstore/tests/test_courseware_index.py b/cms/djangoapps/contentstore/tests/test_courseware_index.py index 6e3191c27e..155b5956d3 100644 --- a/cms/djangoapps/contentstore/tests/test_courseware_index.py +++ b/cms/djangoapps/contentstore/tests/test_courseware_index.py @@ -124,15 +124,6 @@ class MixedWithOptionsTestCase(MixedSplitTestCase): 'DOC_STORE_CONFIG': DOC_STORE_CONFIG, 'OPTIONS': modulestore_options }, - { - 'NAME': 'xml', - 'ENGINE': 'xmodule.modulestore.xml.XMLModuleStore', - 'OPTIONS': { - 'data_dir': DATA_DIR, - 'default_class': 'xmodule.hidden_module.HiddenDescriptor', - 'xblock_mixins': modulestore_options['xblock_mixins'], - } - }, ], 'xblock_mixins': modulestore_options['xblock_mixins'], } diff --git a/common/djangoapps/embargo/tests/test_api.py b/common/djangoapps/embargo/tests/test_api.py index e48940fe10..52fb829596 100644 --- a/common/djangoapps/embargo/tests/test_api.py +++ b/common/djangoapps/embargo/tests/test_api.py @@ -34,9 +34,7 @@ from embargo.exceptions import InvalidAccessPoint from mock import patch -# Since we don't need any XML course fixtures, use a modulestore configuration -# that disables the XML modulestore. -MODULESTORE_CONFIG = mixed_store_config(settings.COMMON_TEST_DATA_ROOT, {}, include_xml=False) +MODULESTORE_CONFIG = mixed_store_config(settings.COMMON_TEST_DATA_ROOT, {}) @ddt.ddt diff --git a/common/djangoapps/static_replace/__init__.py b/common/djangoapps/static_replace/__init__.py index 84c81bd187..d98bea1b90 100644 --- a/common/djangoapps/static_replace/__init__.py +++ b/common/djangoapps/static_replace/__init__.py @@ -163,9 +163,7 @@ def replace_static_urls(text, data_directory=None, course_id=None, static_asset_ if settings.DEBUG and finders.find(rest, True): return original # if we're running with a MongoBacked store course_namespace is not None, then use studio style urls - elif (not static_asset_path) \ - and course_id \ - and modulestore().get_modulestore_type(course_id) != ModuleStoreEnum.Type.xml: + elif (not static_asset_path) and course_id: # first look in the static file pipeline and see if we are trying to reference # a piece of static content which is in the edx-platform repo (e.g. JS associated with an xmodule) diff --git a/common/djangoapps/student/tests/test_bulk_email_settings.py b/common/djangoapps/student/tests/test_bulk_email_settings.py index 522064df90..b2bca30f0b 100644 --- a/common/djangoapps/student/tests/test_bulk_email_settings.py +++ b/common/djangoapps/student/tests/test_bulk_email_settings.py @@ -13,7 +13,7 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey from student.tests.factories import UserFactory, CourseEnrollmentFactory from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE +from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_MODULESTORE from xmodule.modulestore.tests.factories import CourseFactory # This import is for an lms djangoapp. @@ -90,7 +90,7 @@ class TestStudentDashboardEmailViewXMLBacked(SharedModuleStoreTestCase): """ Check for email view on student dashboard, with XML backed course. """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def setUp(self): super(TestStudentDashboardEmailViewXMLBacked, self).setUp() diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index e4e98cf537..5c35fe0c60 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -649,7 +649,6 @@ def dashboard(request): show_email_settings_for = frozenset( enrollment.course_id for enrollment in course_enrollments if ( settings.FEATURES['ENABLE_INSTRUCTOR_EMAIL'] and - modulestore().get_modulestore_type(enrollment.course_id) != ModuleStoreEnum.Type.xml and CourseAuthorization.instructor_email_enabled(enrollment.course_id) ) ) diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index 93e1481417..218b200730 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -175,7 +175,7 @@ class CourseFields(object): scope=Scope.settings ) textbooks = TextbookList( - help=_("List of pairs of (title, url) for textbooks used in this course"), + help=_("List of Textbook objects with (title, url) for textbooks used in this course"), default=[], scope=Scope.content ) diff --git a/common/lib/xmodule/xmodule/modulestore/__init__.py b/common/lib/xmodule/xmodule/modulestore/__init__.py index 4d2b3ae714..6e0e8671e6 100644 --- a/common/lib/xmodule/xmodule/modulestore/__init__.py +++ b/common/lib/xmodule/xmodule/modulestore/__init__.py @@ -55,7 +55,6 @@ class ModuleStoreEnum(object): """ split = 'split' mongo = 'mongo' - xml = 'xml' class RevisionOption(object): """ diff --git a/common/lib/xmodule/xmodule/modulestore/mixed.py b/common/lib/xmodule/xmodule/modulestore/mixed.py index adceb85aa6..78eb0fd36c 100644 --- a/common/lib/xmodule/xmodule/modulestore/mixed.py +++ b/common/lib/xmodule/xmodule/modulestore/mixed.py @@ -1,7 +1,7 @@ """ MixedModuleStore allows for aggregation between multiple modulestores. -In this way, courses can be served up both - say - XMLModuleStore or MongoModuleStore +In this way, courses can be served up via either SplitMongoModuleStore or MongoModuleStore. """ @@ -169,15 +169,6 @@ class MixedModuleStore(ModuleStoreDraftAndPublished, ModuleStoreWriteBase): for store_settings in stores: key = store_settings['NAME'] - is_xml = 'XMLModuleStore' in store_settings['ENGINE'] - if is_xml: - # restrict xml to only load courses in mapping - store_settings['OPTIONS']['course_ids'] = [ - course_key.to_deprecated_string() - for course_key, store_key in self.mappings.iteritems() - if store_key == key - ] - store = create_modulestore_instance( store_settings['ENGINE'], self.contentstore, diff --git a/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py b/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py index 5d5859fb90..8e91f8d920 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py @@ -29,13 +29,13 @@ from openedx.core.djangoapps.bookmarks.signals import trigger_update_xblocks_cac class StoreConstructors(object): """Enumeration of store constructor types.""" - draft, split, xml = range(3) + draft, split = range(2) -def mixed_store_config(data_dir, mappings, include_xml=False, xml_source_dirs=None, store_order=None): +def mixed_store_config(data_dir, mappings, store_order=None): """ Return a `MixedModuleStore` configuration, which provides - access to both Mongo- and XML-backed courses. + access to both Mongo-backed courses. Args: data_dir (string): the directory from which to load XML-backed courses. @@ -51,26 +51,15 @@ def mixed_store_config(data_dir, mappings, include_xml=False, xml_source_dirs=No Keyword Args: - include_xml (boolean): If True, include an XML modulestore in the configuration. - xml_source_dirs (list): The directories containing XML courses to load from disk. - - note: For the courses to be loaded into the XML modulestore and accessible do the following: - * include_xml should be True - * xml_source_dirs should be the list of directories (relative to data_dir) - containing the courses you want to load - * mappings should be configured, pointing the xml courses to the xml modulestore - + store_order (list): List of StoreConstructors providing order of modulestores + to use in creating courses. """ if store_order is None: store_order = [StoreConstructors.draft, StoreConstructors.split] - if include_xml and StoreConstructors.xml not in store_order: - store_order.append(StoreConstructors.xml) - store_constructors = { StoreConstructors.split: split_mongo_store_config(data_dir)['default'], StoreConstructors.draft: draft_mongo_store_config(data_dir)['default'], - StoreConstructors.xml: xml_store_config(data_dir, source_dirs=xml_source_dirs)['default'], } store = { @@ -140,28 +129,6 @@ def split_mongo_store_config(data_dir): return store -def xml_store_config(data_dir, source_dirs=None): - """ - Defines default module store using XMLModuleStore. - - Note: you should pass in a list of source_dirs that you care about, - otherwise all courses in the data_dir will be processed. - """ - store = { - 'default': { - 'NAME': 'xml', - 'ENGINE': 'xmodule.modulestore.xml.XMLModuleStore', - 'OPTIONS': { - 'data_dir': data_dir, - 'default_class': 'xmodule.hidden_module.HiddenDescriptor', - 'source_dirs': source_dirs, - } - } - } - - return store - - @patch('xmodule.modulestore.django.create_modulestore_instance', autospec=True) def drop_mongo_collections(mock_create): """ @@ -180,39 +147,25 @@ def drop_mongo_collections(mock_create): TEST_DATA_DIR = settings.COMMON_TEST_DATA_ROOT -# This is an XML only modulestore with only the toy course loaded -TEST_DATA_XML_MODULESTORE = xml_store_config(TEST_DATA_DIR, source_dirs=['toy']) - -# This modulestore will provide both a mixed mongo editable modulestore, and -# an XML store with just the toy course loaded. -TEST_DATA_MIXED_TOY_MODULESTORE = mixed_store_config( - TEST_DATA_DIR, {'edX/toy/2012_Fall': 'xml', }, include_xml=True, xml_source_dirs=['toy'] -) - -# This modulestore will provide both a mixed mongo editable modulestore, and -# an XML store with common/test/data/2014 loaded, which is a course that is closed. -TEST_DATA_MIXED_CLOSED_MODULESTORE = mixed_store_config( - TEST_DATA_DIR, {'edX/detached_pages/2014': 'xml', }, include_xml=True, xml_source_dirs=['2014'] -) - -# This modulestore will provide both a mixed mongo editable modulestore, and -# an XML store with common/test/data/graded loaded, which is a course that is graded. -TEST_DATA_MIXED_GRADED_MODULESTORE = mixed_store_config( - TEST_DATA_DIR, {'edX/graded/2012_Fall': 'xml', }, include_xml=True, xml_source_dirs=['graded'] +# This modulestore will provide a mixed mongo editable modulestore. +# If your test uses the 'toy' course, use the the ToyCourseFactory to construct it. +# If your test needs a closed course to test against, import the common/test/data/2014 +# test course into this modulestore. +# If your test needs a graded course to test against, import the common/test/data/graded +# test course into this modulestore. +TEST_DATA_MIXED_MODULESTORE = mixed_store_config( + TEST_DATA_DIR, {} ) # All store requests now go through mixed # Use this modulestore if you specifically want to test mongo and not a mocked modulestore. -# This modulestore definition below will not load any xml courses. -TEST_DATA_MONGO_MODULESTORE = mixed_store_config(mkdtemp_clean(), {}, include_xml=False) +TEST_DATA_MONGO_MODULESTORE = mixed_store_config(mkdtemp_clean(), {}) # All store requests now go through mixed # Use this modulestore if you specifically want to test split-mongo and not a mocked modulestore. -# This modulestore definition below will not load any xml courses. TEST_DATA_SPLIT_MODULESTORE = mixed_store_config( mkdtemp_clean(), {}, - include_xml=False, store_order=[StoreConstructors.split, StoreConstructors.draft] ) @@ -265,7 +218,7 @@ class SharedModuleStoreTestCase(TestCase): In Django 1.8, we will be able to use setUpTestData() to do class level init for Django ORM models that will get cleaned up properly. """ - MODULESTORE = mixed_store_config(mkdtemp_clean(), {}, include_xml=False) + MODULESTORE = mixed_store_config(mkdtemp_clean(), {}) # Tell Django to clean out all databases, not just default multi_db = True @@ -429,7 +382,7 @@ class ModuleStoreTestCase(TestCase): your `setUp()` method. """ - MODULESTORE = mixed_store_config(mkdtemp_clean(), {}, include_xml=False) + MODULESTORE = mixed_store_config(mkdtemp_clean(), {}) # Tell Django to clean out all databases, not just default multi_db = True diff --git a/common/lib/xmodule/xmodule/modulestore/tests/factories.py b/common/lib/xmodule/xmodule/modulestore/tests/factories.py index 48c1cc7d59..c7f6e91e68 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/factories.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/factories.py @@ -25,6 +25,7 @@ from xmodule.modulestore import prefer_xmodules, ModuleStoreEnum from xmodule.modulestore.tests.sample_courses import default_block_info_tree, TOY_BLOCK_INFO_TREE from xmodule.tabs import CourseTab from xmodule.x_module import DEPRECATION_VSCOMPAT_EVENT +from xmodule.course_module import Textbook class Dummy(object): @@ -190,7 +191,7 @@ class ToyCourseFactory(SampleCourseFactory): fields = { 'block_info_tree': TOY_BLOCK_INFO_TREE, - 'textbooks': [["Textbook", "path/to/a/text_book"]], + 'textbooks': [Textbook("Textbook", "path/to/a/text_book")], 'wiki_slug': "toy", 'graded': True, 'discussion_topics': {"General": {"id": "i4x-edX-toy-course-2012_Fall"}}, diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py b/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py index 63cad4a892..826c89b0c2 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py @@ -74,9 +74,6 @@ class CommonMixedModuleStoreSetup(CourseComparisonTest): RENDER_TEMPLATE = lambda t_n, d, ctx=None, nsp='main': '' MONGO_COURSEID = 'MITx/999/2013_Spring' - XML_COURSEID1 = 'edX/toy/2012_Fall' - XML_COURSEID2 = 'edX/simple/2012_Fall' - BAD_COURSE_ID = 'edX/simple' modulestore_options = { 'default_class': DEFAULT_CLASS, @@ -91,11 +88,6 @@ class CommonMixedModuleStoreSetup(CourseComparisonTest): 'collection': COLLECTION, 'asset_collection': ASSET_COLLECTION, } - MAPPINGS = { - XML_COURSEID1: 'xml', - XML_COURSEID2: 'xml', - BAD_COURSE_ID: 'xml', - } OPTIONS = { 'stores': [ { @@ -110,15 +102,6 @@ class CommonMixedModuleStoreSetup(CourseComparisonTest): 'DOC_STORE_CONFIG': DOC_STORE_CONFIG, 'OPTIONS': modulestore_options }, - { - 'NAME': ModuleStoreEnum.Type.xml, - 'ENGINE': 'xmodule.modulestore.xml.XMLModuleStore', - 'OPTIONS': { - 'data_dir': DATA_DIR, - 'default_class': 'xmodule.hidden_module.HiddenDescriptor', - 'xblock_mixins': modulestore_options['xblock_mixins'], - } - }, ], 'xblock_mixins': modulestore_options['xblock_mixins'], } @@ -157,7 +140,7 @@ class CommonMixedModuleStoreSetup(CourseComparisonTest): self.addTypeEqualityFunc(BlockUsageLocator, '_compare_ignore_version') self.addTypeEqualityFunc(CourseLocator, '_compare_ignore_version') # define attrs which get set in initdb to quell pylint - self.writable_chapter_location = self.store = self.fake_location = self.xml_chapter_location = None + self.writable_chapter_location = self.store = self.fake_location = None self.course_locations = {} self.user_id = ModuleStoreEnum.UserID.test @@ -257,10 +240,11 @@ class CommonMixedModuleStoreSetup(CourseComparisonTest): return self.store.has_changes(self.store.get_item(location)) # pylint: disable=dangerous-default-value - def _initialize_mixed(self, mappings=MAPPINGS, contentstore=None): + def _initialize_mixed(self, mappings=None, contentstore=None): """ initializes the mixed modulestore. """ + mappings = mappings or {} self.store = MixedModuleStore( contentstore, create_modulestore_instance=create_modulestore_instance, mappings=mappings, @@ -281,25 +265,14 @@ class CommonMixedModuleStoreSetup(CourseComparisonTest): break self._initialize_mixed() - # convert to CourseKeys - self.course_locations = { - course_id: CourseLocator.from_string(course_id) - for course_id in [self.MONGO_COURSEID, self.XML_COURSEID1, self.XML_COURSEID2] - } - # and then to the root UsageKey - self.course_locations = { - course_id: course_key.make_usage_key('course', course_key.run) - for course_id, course_key in self.course_locations.iteritems() - } - - mongo_course_key = self.course_locations[self.MONGO_COURSEID].course_key - self.fake_location = self.store.make_course_key(mongo_course_key.org, mongo_course_key.course, mongo_course_key.run).make_usage_key('vertical', 'fake') - - self.xml_chapter_location = self.course_locations[self.XML_COURSEID1].replace( - category='chapter', name='Overview' - ) - - self._create_course(self.course_locations[self.MONGO_COURSEID].course_key) + test_course_key = CourseLocator.from_string(self.MONGO_COURSEID) + test_course_key = test_course_key.make_usage_key('course', test_course_key.run).course_key + self.fake_location = self.store.make_course_key( + test_course_key.org, + test_course_key.course, + test_course_key.run + ).make_usage_key('vertical', 'fake') + self._create_course(test_course_key) self.assertEquals(default, self.store.get_modulestore_type(self.course.id)) @@ -346,12 +319,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): Make sure we get back the store type we expect for given mappings """ self.initdb(default_ms) - self.assertEqual(self.store.get_modulestore_type( - self._course_key_from_string(self.XML_COURSEID1)), ModuleStoreEnum.Type.xml - ) - self.assertEqual(self.store.get_modulestore_type( - self._course_key_from_string(self.XML_COURSEID2)), ModuleStoreEnum.Type.xml - ) self.assertEqual(self.store.get_modulestore_type( self._course_key_from_string(self.MONGO_COURSEID)), default_ms ) @@ -401,15 +368,10 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): self.initdb(default_ms) self._create_block_hierarchy() - self.assertTrue(self.store.has_item(self.course_locations[self.XML_COURSEID1])) - with check_mongo_calls(max_find.pop(0), max_send): self.assertTrue(self.store.has_item(self.problem_x1a_1)) # try negative cases - self.assertFalse(self.store.has_item( - self.course_locations[self.XML_COURSEID1].replace(name='not_findable', category='problem') - )) with check_mongo_calls(max_find.pop(0), max_send): self.assertFalse(self.store.has_item(self.fake_location)) @@ -429,16 +391,10 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): self.initdb(default_ms) self._create_block_hierarchy() - self.assertIsNotNone(self.store.get_item(self.course_locations[self.XML_COURSEID1])) - with check_mongo_calls(max_find.pop(0), max_send): self.assertIsNotNone(self.store.get_item(self.problem_x1a_1)) # try negative cases - with self.assertRaises(ItemNotFoundError): - self.store.get_item( - self.course_locations[self.XML_COURSEID1].replace(name='not_findable', category='problem') - ) with check_mongo_calls(max_find.pop(0), max_send): with self.assertRaises(ItemNotFoundError): self.store.get_item(self.fake_location) @@ -457,12 +413,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): self.initdb(default_ms) self._create_block_hierarchy() - course_locn = self.course_locations[self.XML_COURSEID1] - # NOTE: use get_course if you just want the course. get_items is expensive - modules = self.store.get_items(course_locn.course_key, qualifiers={'category': 'course'}) - self.assertEqual(len(modules), 1) - self.assertEqual(modules[0].location, course_locn) - course_locn = self.course_locations[self.MONGO_COURSEID] with check_mongo_calls(max_find, max_send): modules = self.store.get_items(course_locn.course_key, qualifiers={'category': 'problem'}) @@ -545,18 +495,10 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): @ddt.unpack def test_update_item(self, default_ms, max_find, max_send): """ - Update should fail for r/o dbs and succeed for r/w ones + Update should succeed for r/w dbs """ self.initdb(default_ms) self._create_block_hierarchy() - course = self.store.get_course(self.course_locations[self.XML_COURSEID1].course_key) - # if following raised, then the test is really a noop, change it - self.assertFalse(course.show_calculator, "Default changed making test meaningless") - course.show_calculator = True - with self.assertRaises(NotImplementedError): # ensure it doesn't allow writing - self.store.update_item(course, self.user_id) - - # now do it for a r/w db problem = self.store.get_item(self.problem_x1a_1) # if following raised, then the test is really a noop, change it self.assertNotEqual(problem.max_attempts, 2, "Default changed making test meaningless") @@ -953,10 +895,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): if default_ms == ModuleStoreEnum.Type.mongo and mongo_uses_error_check(self.store): max_find += 1 - # r/o try deleting the chapter (is here to ensure it can't be deleted) - with self.assertRaises(NotImplementedError): - self.store.delete_item(self.xml_chapter_location, self.user_id) - with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred, self.writable_chapter_location.course_key): with check_mongo_calls(max_find, max_send): self.store.delete_item(self.writable_chapter_location, self.user_id) @@ -1075,14 +1013,12 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): @ddt.unpack def test_get_courses(self, default_ms, max_find, max_send): self.initdb(default_ms) - # we should have 3 total courses across all stores + # we should have one course across all stores with check_mongo_calls(max_find, max_send): courses = self.store.get_courses() course_ids = [course.location for course in courses] - self.assertEqual(len(courses), 3, "Not 3 courses: {}".format(course_ids)) + self.assertEqual(len(courses), 1, "Not one course: {}".format(course_ids)) self.assertIn(self.course_locations[self.MONGO_COURSEID], course_ids) - self.assertIn(self.course_locations[self.XML_COURSEID1], course_ids) - self.assertIn(self.course_locations[self.XML_COURSEID2], course_ids) with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred): draft_courses = self.store.get_courses(remove_branch=True) @@ -1111,30 +1047,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): mongo_course = self.store.get_course(self.course_locations[self.MONGO_COURSEID].course_key) self.assertEqual(len(mongo_course.children), 1) - def test_xml_get_courses(self): - """ - Test that the xml modulestore only loaded the courses from the maps. - """ - self.initdb(ModuleStoreEnum.Type.mongo) - xml_store = self.store._get_modulestore_by_type(ModuleStoreEnum.Type.xml) # pylint: disable=protected-access - courses = xml_store.get_courses() - self.assertEqual(len(courses), 2) - course_ids = [course.id for course in courses] - self.assertIn(self.course_locations[self.XML_COURSEID1].course_key, course_ids) - self.assertIn(self.course_locations[self.XML_COURSEID2].course_key, course_ids) - # this course is in the directory from which we loaded courses but not in the map - self.assertNotIn("edX/toy/TT_2012_Fall", course_ids) - - def test_xml_no_write(self): - """ - Test that the xml modulestore doesn't allow write ops. - """ - self.initdb(ModuleStoreEnum.Type.mongo) - xml_store = self.store._get_modulestore_by_type(ModuleStoreEnum.Type.xml) # pylint: disable=protected-access - # the important thing is not which exception it raises but that it raises an exception - with self.assertRaises(AttributeError): - xml_store.create_course("org", "course", "run", self.user_id) - # draft is 2: find out which ms owns course, get item # split: active_versions, structure, definition (to load course wiki string) @ddt.data((ModuleStoreEnum.Type.mongo, 2, 0), (ModuleStoreEnum.Type.split, 3, 0)) @@ -1149,9 +1061,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): course = self.store.get_item(self.course_locations[self.MONGO_COURSEID]) self.assertEqual(course.id, self.course_locations[self.MONGO_COURSEID].course_key) - course = self.store.get_item(self.course_locations[self.XML_COURSEID1]) - self.assertEqual(course.id, self.course_locations[self.XML_COURSEID1].course_key) - @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) def test_get_library(self, default_ms): """ @@ -1190,9 +1099,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): parent = self.store.get_parent_location(self.problem_x1a_1) self.assertEqual(parent, self.vertical_x1a) - parent = self.store.get_parent_location(self.xml_chapter_location) - self.assertEqual(parent, self.course_locations[self.XML_COURSEID1]) - def verify_get_parent_locations_results(self, expected_results): """ Verifies the results of calling get_parent_locations matches expected_results. @@ -1373,34 +1279,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): with self.assertRaises(NoPathToItem): path_to_location(self.store, orphan) - def test_xml_path_to_location(self): - """ - Make sure that path_to_location works: should be passed a modulestore - with the toy and simple courses loaded. - """ - # only needs course_locations set - self.initdb(ModuleStoreEnum.Type.mongo) - course_key = self.course_locations[self.XML_COURSEID1].course_key - video_key = course_key.make_usage_key('video', 'Welcome') - chapter_key = course_key.make_usage_key('chapter', 'Overview') - should_work = ( - (video_key, - (course_key, "Overview", "Welcome", None, None, video_key)), - (chapter_key, - (course_key, "Overview", None, None, None, chapter_key)), - ) - - for location, expected in should_work: - self.assertEqual(path_to_location(self.store, location), expected) - - not_found = ( - course_key.make_usage_key('video', 'WelcomeX'), - course_key.make_usage_key('course', 'NotHome'), - ) - for location in not_found: - with self.assertRaises(ItemNotFoundError): - path_to_location(self.store, location) - def test_navigation_index(self): """ Make sure that navigation_index correctly parses the various position values that we might get from calls to @@ -1652,15 +1530,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): Test the get_courses_for_wiki method """ self.initdb(default_ms) - # Test XML wikis - wiki_courses = self.store.get_courses_for_wiki('toy') - self.assertEqual(len(wiki_courses), 1) - self.assertIn(self.course_locations[self.XML_COURSEID1].course_key, wiki_courses) - - wiki_courses = self.store.get_courses_for_wiki('simple') - self.assertEqual(len(wiki_courses), 1) - self.assertIn(self.course_locations[self.XML_COURSEID2].course_key, wiki_courses) - # Test Mongo wiki with check_mongo_calls(max_find, max_send): wiki_courses = self.store.get_courses_for_wiki('999') @@ -1995,14 +1864,13 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): wiki_courses = self.store.get_courses_for_wiki('999') self.assertEqual(len(wiki_courses), 0) - # but there should be two courses with wiki_slug 'simple' + # but there should be one course with wiki_slug 'simple' wiki_courses = self.store.get_courses_for_wiki('simple') - self.assertEqual(len(wiki_courses), 2) + self.assertEqual(len(wiki_courses), 1) self.assertIn( self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None), wiki_courses ) - self.assertIn(self.course_locations[self.XML_COURSEID2].course_key, wiki_courses) # configure mongo course to use unique wiki_slug. mongo_course = self.store.get_course(self.course_locations[self.MONGO_COURSEID].course_key) @@ -2017,15 +1885,11 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): ) # and NOT retriveable with its old wiki_slug wiki_courses = self.store.get_courses_for_wiki('simple') - self.assertEqual(len(wiki_courses), 1) + self.assertEqual(len(wiki_courses), 0) self.assertNotIn( self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None), wiki_courses ) - self.assertIn( - self.course_locations[self.XML_COURSEID2].course_key, - wiki_courses - ) @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) def test_branch_setting(self, default_ms): @@ -2120,13 +1984,10 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): self.assertEquals(store.get_modulestore_type(), store_type) # verify store used for creating a course - try: - course = self.store.create_course("org", "course{}".format(uuid4().hex[:5]), "run", self.user_id) - self.assertEquals(course.system.modulestore.get_modulestore_type(), store_type) - except NotImplementedError: - self.assertEquals(store_type, ModuleStoreEnum.Type.xml) + course = self.store.create_course("org", "course{}".format(uuid4().hex[:5]), "run", self.user_id) + self.assertEquals(course.system.modulestore.get_modulestore_type(), store_type) - @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split, ModuleStoreEnum.Type.xml) + @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) def test_default_store(self, default_ms): """ Test the default store context manager @@ -2148,9 +2009,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): self.verify_default_store(ModuleStoreEnum.Type.mongo) with self.store.default_store(ModuleStoreEnum.Type.split): self.verify_default_store(ModuleStoreEnum.Type.split) - with self.store.default_store(ModuleStoreEnum.Type.xml): - self.verify_default_store(ModuleStoreEnum.Type.xml) - self.verify_default_store(ModuleStoreEnum.Type.split) self.verify_default_store(ModuleStoreEnum.Type.mongo) def test_default_store_fake(self): @@ -2205,25 +2063,6 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): dest_store = self.store._get_modulestore_by_type(destination_modulestore) self.assertCoursesEqual(source_store, source_course_key, dest_store, dest_course_id) - def test_clone_xml_split(self): - """ - Can clone xml courses to split; so, test it. - """ - with MongoContentstoreBuilder().build() as contentstore: - # initialize the mixed modulestore - self._initialize_mixed(contentstore=contentstore, mappings={self.XML_COURSEID2: 'xml', }) - source_course_key = CourseKey.from_string(self.XML_COURSEID2) - with self.store.default_store(ModuleStoreEnum.Type.split): - dest_course_id = CourseLocator("org.other", "course.other", "run.other") - self.store.clone_course( - source_course_key, dest_course_id, ModuleStoreEnum.UserID.test - ) - - # pylint: disable=protected-access - source_store = self.store._get_modulestore_by_type(ModuleStoreEnum.Type.xml) - dest_store = self.store._get_modulestore_by_type(ModuleStoreEnum.Type.split) - self.assertCoursesEqual(source_store, source_course_key, dest_store, dest_course_id) - @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) def test_bulk_operations_signal_firing(self, default): """ Signals should be fired right before bulk_operations() exits. """ diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_xml.py b/common/lib/xmodule/xmodule/modulestore/tests/test_xml.py index f029de4283..4da26acfd0 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/test_xml.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/test_xml.py @@ -31,10 +31,6 @@ class TestXMLModuleStore(unittest.TestCase): """ Test around the XML modulestore """ - def test_xml_modulestore_type(self): - store = XMLModuleStore(DATA_DIR, source_dirs=[]) - self.assertEqual(store.get_modulestore_type(), ModuleStoreEnum.Type.xml) - @patch('xmodule.tabs.CourseTabList.initialize_default', Mock()) def test_unicode_chars_in_xml_content(self): # edX/full/6.002_Spring_2012 has non-ASCII chars, and during diff --git a/common/lib/xmodule/xmodule/modulestore/xml.py b/common/lib/xmodule/xmodule/modulestore/xml.py index c6b7b748ed..e839206250 100644 --- a/common/lib/xmodule/xmodule/modulestore/xml.py +++ b/common/lib/xmodule/xmodule/modulestore/xml.py @@ -875,7 +875,8 @@ class XMLModuleStore(ModuleStoreReadBase): Args: course_key: just for signature compatibility """ - return ModuleStoreEnum.Type.xml + # return ModuleStoreEnum.Type.xml + return None def get_courses_for_wiki(self, wiki_slug, **kwargs): """ @@ -893,7 +894,7 @@ class XMLModuleStore(ModuleStoreReadBase): Returns the course count """ - return {ModuleStoreEnum.Type.xml: True} + return {'xml': True} @contextmanager def branch_setting(self, branch_setting, course_id=None): # pylint: disable=unused-argument diff --git a/common/lib/xmodule/xmodule/modulestore/xml_exporter.py b/common/lib/xmodule/xmodule/modulestore/xml_exporter.py index 91066d485d..7468e6755a 100644 --- a/common/lib/xmodule/xmodule/modulestore/xml_exporter.py +++ b/common/lib/xmodule/xmodule/modulestore/xml_exporter.py @@ -279,9 +279,7 @@ class CourseExportManager(ExportManager): policy = {'course/' + courselike.location.name: own_metadata(courselike)} course_policy.write(dumps(policy, cls=EdxJSONEncoder, sort_keys=True, indent=4)) - # xml backed courses don't support drafts! - if courselike.runtime.modulestore.get_modulestore_type() != ModuleStoreEnum.Type.xml: - _export_drafts(self.modulestore, self.courselike_key, export_fs, xml_centric_courselike_key) + _export_drafts(self.modulestore, self.courselike_key, export_fs, xml_centric_courselike_key) class LibraryExportManager(ExportManager): diff --git a/lms/djangoapps/bulk_email/forms.py b/lms/djangoapps/bulk_email/forms.py index 6fdec1459f..32d91443c5 100644 --- a/lms/djangoapps/bulk_email/forms.py +++ b/lms/djangoapps/bulk_email/forms.py @@ -100,11 +100,4 @@ class CourseAuthorizationAdminForm(forms.ModelForm): msg += 'Please recheck that you have supplied a valid course id.' raise forms.ValidationError(msg) - # Now, try and discern if it is a Studio course - HTML editor doesn't work with XML courses - is_studio_course = modulestore().get_modulestore_type(course_key) != ModuleStoreEnum.Type.xml - if not is_studio_course: - msg = "Course Email feature is only available for courses authored in Studio. " - msg += '"{0}" appears to be an XML backed course.'.format(course_key.to_deprecated_string()) - raise forms.ValidationError(msg) - return course_key diff --git a/lms/djangoapps/bulk_email/tests/test_forms.py b/lms/djangoapps/bulk_email/tests/test_forms.py index 13180d4e52..5d465a05ec 100644 --- a/lms/djangoapps/bulk_email/tests/test_forms.py +++ b/lms/djangoapps/bulk_email/tests/test_forms.py @@ -8,7 +8,6 @@ from nose.plugins.attrib import attr from bulk_email.models import CourseAuthorization, CourseEmailTemplate from bulk_email.forms import CourseAuthorizationAdminForm, CourseEmailTemplateForm -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE from opaque_keys.edx.locations import SlashSeparatedCourseKey from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory @@ -127,32 +126,6 @@ class CourseAuthorizationFormTest(ModuleStoreTestCase): form.save() -class CourseAuthorizationXMLFormTest(ModuleStoreTestCase): - """Check that XML courses cannot be authorized for email.""" - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE - - @patch.dict(settings.FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': True}) - def test_xml_course_authorization(self): - course_id = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') - # Assert this is an XML course - self.assertEqual(modulestore().get_modulestore_type(course_id), ModuleStoreEnum.Type.xml) - - form_data = {'course_id': course_id.to_deprecated_string(), 'email_enabled': True} - form = CourseAuthorizationAdminForm(data=form_data) - # Validation shouldn't work - self.assertFalse(form.is_valid()) - - msg = u"Course Email feature is only available for courses authored in Studio. " - msg += u'"{0}" appears to be an XML backed course.'.format(course_id.to_deprecated_string()) - self.assertEquals(msg, form._errors['course_id'][0]) # pylint: disable=protected-access - - with self.assertRaisesRegexp( - ValueError, - "The CourseAuthorization could not be created because the data didn't validate." - ): - form.save() - - class CourseEmailTemplateFormTest(ModuleStoreTestCase): """Test the CourseEmailTemplateForm that is used in the Django admin subsystem.""" diff --git a/lms/djangoapps/courseware/courses.py b/lms/djangoapps/courseware/courses.py index 252bb598cf..1b63685156 100644 --- a/lms/djangoapps/courseware/courses.py +++ b/lms/djangoapps/courseware/courses.py @@ -453,10 +453,8 @@ def get_studio_url(course, page): Args: course (CourseDescriptor) """ - is_studio_course = course.course_edit_method == "Studio" - is_mongo_course = modulestore().get_modulestore_type(course.id) != ModuleStoreEnum.Type.xml studio_link = None - if is_studio_course and is_mongo_course: + if course.course_edit_method == "Studio": studio_link = get_cms_course_link(course, page) return studio_link diff --git a/lms/djangoapps/courseware/tests/test_about.py b/lms/djangoapps/courseware/tests/test_about.py index 3ed5e67c39..5530cd9dcc 100644 --- a/lms/djangoapps/courseware/tests/test_about.py +++ b/lms/djangoapps/courseware/tests/test_about.py @@ -14,7 +14,9 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey from course_modes.models import CourseMode from track.tests import EventTrackingTestCase -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_CLOSED_MODULESTORE +from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_MODULESTORE +from xmodule.modulestore.tests.utils import TEST_DATA_DIR +from xmodule.modulestore.xml_importer import import_course_from_xml from student.models import CourseEnrollment from student.tests.factories import AdminFactory, CourseEnrollmentAllowedFactory, UserFactory @@ -199,16 +201,32 @@ class AboutTestCaseXML(LoginEnrollmentTestCase, ModuleStoreTestCase): """ Tests for the course about page """ - MODULESTORE = TEST_DATA_MIXED_CLOSED_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE - # The following XML test course (which lives at common/test/data/2014) - # is closed; we're testing that an about page still appears when - # the course is already closed - xml_course_id = SlashSeparatedCourseKey('edX', 'detached_pages', '2014') + def setUp(self): + """ + Set up the tests + """ + super(AboutTestCaseXML, self).setUp() - # this text appears in that course's about page - # common/test/data/2014/about/overview.html - xml_data = "about page 463139" + # The following test course (which lives at common/test/data/2014) + # is closed; we're testing that an about page still appears when + # the course is already closed + self.xml_course_id = self.store.make_course_key('edX', 'detached_pages', '2014') + import_course_from_xml( + self.store, + 'test_user', + TEST_DATA_DIR, + source_dirs=['2014'], + static_content_store=None, + target_id=self.xml_course_id, + raise_on_failure=True, + create_if_not_present=True, + ) + + # this text appears in that course's about page + # common/test/data/2014/about/overview.html + self.xml_data = "about page 463139" @patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False}) def test_logged_in_xml(self): diff --git a/lms/djangoapps/courseware/tests/test_course_info.py b/lms/djangoapps/courseware/tests/test_course_info.py index 952e1bc21f..069547e506 100644 --- a/lms/djangoapps/courseware/tests/test_course_info.py +++ b/lms/djangoapps/courseware/tests/test_course_info.py @@ -17,9 +17,11 @@ from util.date_utils import strftime_localized from xmodule.modulestore.tests.django_utils import ( ModuleStoreTestCase, SharedModuleStoreTestCase, - TEST_DATA_SPLIT_MODULESTORE + TEST_DATA_SPLIT_MODULESTORE, + TEST_DATA_MIXED_MODULESTORE ) -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_CLOSED_MODULESTORE +from xmodule.modulestore.tests.utils import TEST_DATA_DIR +from xmodule.modulestore.xml_importer import import_course_from_xml from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, check_mongo_calls from student.models import CourseEnrollment from student.tests.factories import AdminFactory @@ -212,16 +214,32 @@ class CourseInfoTestCaseXML(LoginEnrollmentTestCase, ModuleStoreTestCase): """ Tests for the Course Info page for an XML course """ - MODULESTORE = TEST_DATA_MIXED_CLOSED_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE - # The following XML test course (which lives at common/test/data/2014) - # is closed; we're testing that a course info page still appears when - # the course is already closed - xml_course_key = SlashSeparatedCourseKey('edX', 'detached_pages', '2014') + def setUp(self): + """ + Set up the tests + """ + super(CourseInfoTestCaseXML, self).setUp() - # this text appears in that course's course info page - # common/test/data/2014/info/updates.html - xml_data = "course info 463139" + # The following test course (which lives at common/test/data/2014) + # is closed; we're testing that a course info page still appears when + # the course is already closed + self.xml_course_key = self.store.make_course_key('edX', 'detached_pages', '2014') + import_course_from_xml( + self.store, + 'test_user', + TEST_DATA_DIR, + source_dirs=['2014'], + static_content_store=None, + target_id=self.xml_course_key, + raise_on_failure=True, + create_if_not_present=True, + ) + + # this text appears in that course's course info page + # common/test/data/2014/info/updates.html + self.xml_data = "course info 463139" @mock.patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False}) def test_logged_in_xml(self): diff --git a/lms/djangoapps/courseware/tests/test_courses.py b/lms/djangoapps/courseware/tests/test_courses.py index 32788027a6..a3cbf06be4 100644 --- a/lms/djangoapps/courseware/tests/test_courses.py +++ b/lms/djangoapps/courseware/tests/test_courses.py @@ -33,8 +33,9 @@ from xmodule.modulestore.django import _get_modulestore_branch_setting, modulest from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.xml_importer import import_course_from_xml from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE -from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, check_mongo_calls +from xmodule.modulestore.tests.factories import ( + CourseFactory, ItemFactory, check_mongo_calls +) from xmodule.tests.xml import factories as xml from xmodule.tests.xml import XModuleXmlImportTest @@ -303,30 +304,6 @@ class CoursesRenderTest(ModuleStoreTestCase): self.assertIn("this module is temporarily unavailable", course_about) -@attr('shard_1') -class XmlCoursesRenderTest(ModuleStoreTestCase): - """Test methods related to rendering courses content for an XML course.""" - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE - - toy_course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') - - def test_get_course_info_section_render(self): - course = get_course_by_id(self.toy_course_key) - request = get_request_for_user(UserFactory.create()) - - # Test render works okay. Note the href is different in XML courses. - course_info = get_course_info_section(request, request.user, course, 'handouts') - self.assertEqual(course_info, "Sample") - - # Test when render raises an exception - with mock.patch('courseware.courses.get_module') as mock_module_render: - mock_module_render.return_value = mock.MagicMock( - render=mock.Mock(side_effect=Exception('Render failed!')) - ) - course_info = get_course_info_section(request, request.user, course, 'handouts') - self.assertIn("this module is temporarily unavailable", course_info) - - @attr('shard_1') @ddt.ddt class CourseInstantiationTests(ModuleStoreTestCase): diff --git a/lms/djangoapps/courseware/tests/test_module_render.py b/lms/djangoapps/courseware/tests/test_module_render.py index 0c1224667d..2484c98ded 100644 --- a/lms/djangoapps/courseware/tests/test_module_render.py +++ b/lms/djangoapps/courseware/tests/test_module_render.py @@ -43,13 +43,13 @@ from openedx.core.lib.courses import course_image_url from openedx.core.lib.gating import api as gating_api from student.models import anonymous_id_for_user from xmodule.modulestore.tests.django_utils import ( - TEST_DATA_MIXED_TOY_MODULESTORE, - TEST_DATA_XML_MODULESTORE, - SharedModuleStoreTestCase) + ModuleStoreTestCase, + SharedModuleStoreTestCase, + TEST_DATA_MIXED_MODULESTORE +) from xmodule.lti_module import LTIDescriptor from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.django import modulestore -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import ItemFactory, CourseFactory, ToyCourseFactory, check_mongo_calls from xmodule.x_module import XModuleDescriptor, XModule, STUDENT_VIEW, CombinedSystem @@ -1369,17 +1369,6 @@ class ViewInStudioTest(ModuleStoreTestCase): # pylint: disable=attribute-defined-outside-init self.child_module = self._get_module(course.id, child_descriptor, child_descriptor.location) - def setup_xml_course(self): - """ - Define the XML backed course to use. - Toy courses are already loaded in XML and mixed modulestores. - """ - course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') - location = course_key.make_usage_key('chapter', 'Overview') - descriptor = modulestore().get_item(location) - - self.module = self._get_module(course_key, descriptor, location) - @attr('shard_1') class MongoViewInStudioTest(ViewInStudioTest): @@ -1414,7 +1403,7 @@ class MongoViewInStudioTest(ViewInStudioTest): class MixedViewInStudioTest(ViewInStudioTest): """Test the 'View in Studio' link visibility in a mixed mongo backed course.""" - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def test_view_in_studio_link_mongo_backed(self): """Mixed mongo courses that are mongo backed should see 'View in Studio' links.""" @@ -1428,24 +1417,6 @@ class MixedViewInStudioTest(ViewInStudioTest): result_fragment = self.module.render(STUDENT_VIEW, context=self.default_context) self.assertNotIn('View Unit in Studio', result_fragment.content) - def test_view_in_studio_link_xml_backed(self): - """Course in XML only modulestore should not see 'View in Studio' links.""" - self.setup_xml_course() - result_fragment = self.module.render(STUDENT_VIEW, context=self.default_context) - self.assertNotIn('View Unit in Studio', result_fragment.content) - - -@attr('shard_1') -class XmlViewInStudioTest(ViewInStudioTest): - """Test the 'View in Studio' link visibility in an xml backed course.""" - MODULESTORE = TEST_DATA_XML_MODULESTORE - - def test_view_in_studio_link_xml_backed(self): - """Course in XML only modulestore should not see 'View in Studio' links.""" - self.setup_xml_course() - result_fragment = self.module.render(STUDENT_VIEW) - self.assertNotIn('View Unit in Studio', result_fragment.content) - @XBlock.tag("detached") class DetachedXBlock(XBlock): diff --git a/lms/djangoapps/courseware/tests/test_tabs.py b/lms/djangoapps/courseware/tests/test_tabs.py index d94de34be5..c1597a2f52 100644 --- a/lms/djangoapps/courseware/tests/test_tabs.py +++ b/lms/djangoapps/courseware/tests/test_tabs.py @@ -27,10 +27,13 @@ from util.milestones_helpers import ( from milestones.tests.utils import MilestonesTestCaseMixin from xmodule import tabs as xmodule_tabs from xmodule.modulestore.tests.django_utils import ( - TEST_DATA_MIXED_TOY_MODULESTORE, TEST_DATA_MIXED_CLOSED_MODULESTORE, - SharedModuleStoreTestCase) -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase + ModuleStoreTestCase, + SharedModuleStoreTestCase, + TEST_DATA_MIXED_MODULESTORE +) from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory +from xmodule.modulestore.tests.utils import TEST_DATA_DIR +from xmodule.modulestore.xml_importer import import_course_from_xml class TabTestCase(SharedModuleStoreTestCase): @@ -225,7 +228,7 @@ class TextbooksTestCase(TabTestCase): class StaticTabDateTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase): """Test cases for Static Tab Dates.""" - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE @classmethod def setUpClass(cls): @@ -237,10 +240,6 @@ class StaticTabDateTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase): ) cls.course.tabs.append(xmodule_tabs.CourseTab.load('static_tab', name='New Tab', url_slug='new_tab')) cls.course.save() - cls.toy_course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') - - def setUp(self): - super(StaticTabDateTestCase, self).setUp() def test_logged_in(self): self.setup_user() @@ -263,13 +262,13 @@ class StaticTabDateTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase): def test_get_static_tab_contents(self): self.setup_user() - course = get_course_by_id(self.toy_course_key) + course = get_course_by_id(self.course.id) request = get_request_for_user(self.user) - tab = xmodule_tabs.CourseTabList.get_tab_by_slug(course.tabs, 'resources') + tab = xmodule_tabs.CourseTabList.get_tab_by_slug(course.tabs, 'new_tab') # Test render works okay tab_content = get_static_tab_contents(request, course, tab) - self.assertIn(self.toy_course_key.to_deprecated_string(), tab_content) + self.assertIn(self.course.id.to_deprecated_string(), tab_content) self.assertIn('static_tab', tab_content) # Test when render raises an exception @@ -287,17 +286,33 @@ class StaticTabDateTestCaseXML(LoginEnrollmentTestCase, ModuleStoreTestCase): Tests for the static tab dates of an XML course """ - MODULESTORE = TEST_DATA_MIXED_CLOSED_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE - # The following XML test course (which lives at common/test/data/2014) - # is closed; we're testing that tabs still appear when - # the course is already closed - xml_course_key = SlashSeparatedCourseKey('edX', 'detached_pages', '2014') + def setUp(self): + """ + Set up the tests + """ + super(StaticTabDateTestCaseXML, self).setUp() - # this text appears in the test course's tab - # common/test/data/2014/tabs/8e4cce2b4aaf4ba28b1220804619e41f.html - xml_data = "static 463139" - xml_url = "8e4cce2b4aaf4ba28b1220804619e41f" + # The following XML test course (which lives at common/test/data/2014) + # is closed; we're testing that tabs still appear when + # the course is already closed + self.xml_course_key = self.store.make_course_key('edX', 'detached_pages', '2014') + import_course_from_xml( + self.store, + 'test_user', + TEST_DATA_DIR, + source_dirs=['2014'], + static_content_store=None, + target_id=self.xml_course_key, + raise_on_failure=True, + create_if_not_present=True, + ) + + # this text appears in the test course's tab + # common/test/data/2014/tabs/8e4cce2b4aaf4ba28b1220804619e41f.html + self.xml_data = "static 463139" + self.xml_url = "8e4cce2b4aaf4ba28b1220804619e41f" @patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False}) def test_logged_in_xml(self): @@ -321,7 +336,7 @@ class EntranceExamsTabsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, Mi """ Validate tab behavior when dealing with Entrance Exams """ - MODULESTORE = TEST_DATA_MIXED_CLOSED_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE @patch.dict('django.conf.settings.FEATURES', {'ENTRANCE_EXAMS': True, 'MILESTONES_APP': True}) def setUp(self): @@ -428,7 +443,7 @@ class TextBookCourseViewsTestCase(LoginEnrollmentTestCase, SharedModuleStoreTest """ Validate tab behavior when dealing with textbooks. """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE @classmethod def setUpClass(cls): diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index 88e84c4874..83a52fb897 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -51,7 +51,7 @@ from util.url import reload_django_url_config from util.views import ensure_valid_course_key from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.django import modulestore -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE +from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_MODULESTORE from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, check_mongo_calls from openedx.core.djangoapps.credit.api import set_credit_requirements @@ -63,7 +63,7 @@ class TestJumpTo(ModuleStoreTestCase): """ Check the jumpto link for a course. """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def setUp(self): super(TestJumpTo, self).setUp() diff --git a/lms/djangoapps/courseware/tests/tests.py b/lms/djangoapps/courseware/tests/tests.py index 85cb97b423..d376896dcb 100644 --- a/lms/djangoapps/courseware/tests/tests.py +++ b/lms/djangoapps/courseware/tests/tests.py @@ -10,12 +10,13 @@ from nose.plugins.attrib import attr from opaque_keys.edx.locations import SlashSeparatedCourseKey from courseware.tests.helpers import LoginEnrollmentTestCase -from xmodule.modulestore.tests.django_utils import TEST_DATA_XML_MODULESTORE as XML_MODULESTORE -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE as TOY_MODULESTORE from lms.djangoapps.lms_xblock.field_data import LmsFieldData from xmodule.error_module import ErrorDescriptor from xmodule.modulestore.django import modulestore -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ( + ModuleStoreTestCase, TEST_DATA_MIXED_MODULESTORE +) +from xmodule.modulestore.tests.factories import ToyCourseFactory @attr('shard_1') @@ -122,34 +123,17 @@ class PageLoaderTestCase(LoginEnrollmentTestCase): self.assertNotIsInstance(descriptor, ErrorDescriptor) -@attr('shard_1') -class TestXmlCoursesLoad(ModuleStoreTestCase, PageLoaderTestCase): - """ - Check that all pages in test courses load properly from XML. - """ - MODULESTORE = XML_MODULESTORE - - def setUp(self): - super(TestXmlCoursesLoad, self).setUp() - self.setup_user() - - def test_toy_course_loads(self): - # Load one of the XML based courses - # Our test mapping rules allow the MixedModuleStore - # to load this course from XML, not Mongo. - self.check_all_pages_load(SlashSeparatedCourseKey('edX', 'toy', '2012_Fall')) - - @attr('shard_1') class TestMongoCoursesLoad(ModuleStoreTestCase, PageLoaderTestCase): """ Check that all pages in test courses load properly from Mongo. """ - MODULESTORE = TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def setUp(self): super(TestMongoCoursesLoad, self).setUp() self.setup_user() + self.toy_course_key = ToyCourseFactory.create().id @mock.patch('xmodule.course_module.requests.get') def test_toy_textbooks_loads(self, mock_get): @@ -158,8 +142,7 @@ class TestMongoCoursesLoad(ModuleStoreTestCase, PageLoaderTestCase): """).strip() - - location = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall').make_usage_key('course', '2012_Fall') + location = self.toy_course_key.make_usage_key('course', '2012_Fall') course = self.store.get_item(location) self.assertGreater(len(course.textbooks), 0) diff --git a/lms/djangoapps/dashboard/sysadmin.py b/lms/djangoapps/dashboard/sysadmin.py index 3d89a86f77..4273035d9e 100644 --- a/lms/djangoapps/dashboard/sysadmin.py +++ b/lms/djangoapps/dashboard/sysadmin.py @@ -491,23 +491,7 @@ class Courses(SysadminDashboardView): escape(str(err)) ) - is_xml_course = (modulestore().get_modulestore_type(course_key) == ModuleStoreEnum.Type.xml) - if course_found and is_xml_course: - cdir = course.data_dir - self.def_ms.courses.pop(cdir) - - # now move the directory (don't actually delete it) - new_dir = "{course_dir}_deleted_{timestamp}".format( - course_dir=cdir, - timestamp=int(time.time()) - ) - os.rename(settings.DATA_DIR / cdir, settings.DATA_DIR / new_dir) - - self.msg += (u"Deleted " - u"{0} = {1} ({2})".format( - cdir, course.id, course.display_name)) - - elif course_found and not is_xml_course: + if course_found: # delete course that is stored with mongodb backend self.def_ms.delete_course(course.id, request.user.id) # don't delete user permission groups, though diff --git a/lms/djangoapps/django_comment_client/tests/test_models.py b/lms/djangoapps/django_comment_client/tests/test_models.py index 4093252990..5429e68661 100644 --- a/lms/djangoapps/django_comment_client/tests/test_models.py +++ b/lms/djangoapps/django_comment_client/tests/test_models.py @@ -5,9 +5,11 @@ from django.test.testcases import TestCase from nose.plugins.attrib import attr from opaque_keys.edx.keys import CourseKey -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE import django_comment_common.models as models -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ( + TEST_DATA_MIXED_MODULESTORE, ModuleStoreTestCase +) +from xmodule.modulestore.tests.factories import ToyCourseFactory @attr('shard_1') @@ -15,7 +17,7 @@ class RoleClassTestCase(ModuleStoreTestCase): """ Tests for roles of the comment client service integration """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def setUp(self): super(RoleClassTestCase, self).setUp() @@ -23,7 +25,7 @@ class RoleClassTestCase(ModuleStoreTestCase): # For course ID, syntax edx/classname/classdate is important # because xmodel.course_module.id_to_location looks for a string to split - self.course_id = CourseKey.from_string("edX/toy/2012_Fall") + self.course_id = ToyCourseFactory.create().id self.student_role = models.Role.objects.get_or_create(name="Student", course_id=self.course_id)[0] self.student_role.add_permission("delete_thread") diff --git a/lms/djangoapps/django_comment_client/tests/test_utils.py b/lms/djangoapps/django_comment_client/tests/test_utils.py index 677144e8da..dd14861c71 100644 --- a/lms/djangoapps/django_comment_client/tests/test_utils.py +++ b/lms/djangoapps/django_comment_client/tests/test_utils.py @@ -25,8 +25,8 @@ from openedx.core.djangoapps.content.course_structures.models import CourseStruc from openedx.core.djangoapps.util.testing import ContentGroupTestCase from student.roles import CourseStaffRole from xmodule.modulestore import ModuleStoreEnum -from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, TEST_DATA_MIXED_TOY_MODULESTORE +from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, ToyCourseFactory +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, TEST_DATA_MIXED_MODULESTORE from xmodule.modulestore.django import modulestore from opaque_keys.edx.locator import CourseLocator from lms.djangoapps.teams.tests.factories import CourseTeamFactory @@ -1248,14 +1248,14 @@ class IsCommentableCohortedTestCase(ModuleStoreTestCase): Test the is_commentable_cohorted function. """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def setUp(self): """ Make sure that course is reloaded every time--clear out the modulestore. """ super(IsCommentableCohortedTestCase, self).setUp() - self.toy_course_key = CourseLocator("edX", "toy", "2012_Fall", deprecated=True) + self.toy_course_key = ToyCourseFactory.create().id def test_is_commentable_cohorted(self): course = modulestore().get_course(self.toy_course_key) diff --git a/lms/djangoapps/instructor/tests/test_email.py b/lms/djangoapps/instructor/tests/test_email.py index 7f1bc0633f..3d16b31c5a 100644 --- a/lms/djangoapps/instructor/tests/test_email.py +++ b/lms/djangoapps/instructor/tests/test_email.py @@ -12,7 +12,7 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey from bulk_email.models import CourseAuthorization from xmodule.modulestore.tests.django_utils import ( - TEST_DATA_MIXED_TOY_MODULESTORE, SharedModuleStoreTestCase + TEST_DATA_MIXED_MODULESTORE, SharedModuleStoreTestCase ) from student.tests.factories import AdminFactory from xmodule.modulestore.tests.factories import CourseFactory @@ -112,7 +112,7 @@ class TestNewInstructorDashboardEmailViewXMLBacked(SharedModuleStoreTestCase): Check for email view on the new instructor dashboard """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE @classmethod def setUpClass(cls): diff --git a/lms/djangoapps/instructor/views/tools.py b/lms/djangoapps/instructor/views/tools.py index d1bbb66269..1bfb96d910 100644 --- a/lms/djangoapps/instructor/views/tools.py +++ b/lms/djangoapps/instructor/views/tools.py @@ -66,10 +66,9 @@ def bulk_email_is_enabled_for_course(course_id): """ bulk_email_enabled_globally = (settings.FEATURES['ENABLE_INSTRUCTOR_EMAIL'] is True) - is_studio_course = (modulestore().get_modulestore_type(course_id) != ModuleStoreEnum.Type.xml) bulk_email_enabled_for_course = CourseAuthorization.instructor_email_enabled(course_id) - if bulk_email_enabled_globally and is_studio_course and bulk_email_enabled_for_course: + if bulk_email_enabled_globally and bulk_email_enabled_for_course: return True return False diff --git a/lms/envs/common.py b/lms/envs/common.py index 3220356fed..7e812d05a9 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -745,14 +745,6 @@ MODULESTORE = { 'fs_root': DATA_DIR, 'render_template': 'edxmako.shortcuts.render_to_string', } - }, - { - 'NAME': 'xml', - 'ENGINE': 'xmodule.modulestore.xml.XMLModuleStore', - 'OPTIONS': { - 'data_dir': DATA_DIR, - 'default_class': 'xmodule.hidden_module.HiddenDescriptor', - } } ] } diff --git a/lms/lib/xblock/test/test_mixin.py b/lms/lib/xblock/test/test_mixin.py index 64360c4a5f..3b501b3737 100644 --- a/lms/lib/xblock/test/test_mixin.py +++ b/lms/lib/xblock/test/test_mixin.py @@ -6,7 +6,7 @@ import ddt from xblock.validation import ValidationMessage from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.tests.factories import CourseFactory, ToyCourseFactory, ItemFactory -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, TEST_DATA_MIXED_TOY_MODULESTORE +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, TEST_DATA_MIXED_MODULESTORE from xmodule.partitions.partitions import Group, UserPartition @@ -157,21 +157,17 @@ class XBlockGetParentTest(LmsXBlockMixinTestCase): Test that XBlock.get_parent returns correct results with each modulestore backend. """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE - @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split, ModuleStoreEnum.Type.xml) + @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) def test_parents(self, modulestore_type): with self.store.default_store(modulestore_type): # setting up our own local course tree here, since it needs to be # created with the correct modulestore type. - if modulestore_type == 'xml': - course_key = self.store.make_course_key('edX', 'toy', '2012_Fall') - else: - course_key = ToyCourseFactory.create(run='2012_Fall_copy').id + course_key = ToyCourseFactory.create().id course = self.store.get_course(course_key) - self.assertIsNone(course.get_parent()) def recurse(parent): diff --git a/openedx/core/djangoapps/course_groups/tests/test_cohorts.py b/openedx/core/djangoapps/course_groups/tests/test_cohorts.py index 1a0986df9c..0df8acedfd 100644 --- a/openedx/core/djangoapps/course_groups/tests/test_cohorts.py +++ b/openedx/core/djangoapps/course_groups/tests/test_cohorts.py @@ -16,7 +16,8 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey from student.models import CourseEnrollment from student.tests.factories import UserFactory from xmodule.modulestore.django import modulestore -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE, ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_MODULESTORE, ModuleStoreTestCase +from xmodule.modulestore.tests.factories import ToyCourseFactory from ..models import CourseUserGroup, CourseCohort, CourseUserGroupPartitionGroup from .. import cohorts @@ -138,14 +139,14 @@ class TestCohorts(ModuleStoreTestCase): """ Test the cohorts feature """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def setUp(self): """ Make sure that course is reloaded every time--clear out the modulestore. """ super(TestCohorts, self).setUp() - self.toy_course_key = SlashSeparatedCourseKey("edX", "toy", "2012_Fall") + self.toy_course_key = ToyCourseFactory.create().id def _create_cohort(self, course_id, cohort_name, assignment_type): """ @@ -732,7 +733,7 @@ class TestCohortsAndPartitionGroups(ModuleStoreTestCase): """ Test Cohorts and Partitions Groups. """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def setUp(self): """ @@ -740,7 +741,7 @@ class TestCohortsAndPartitionGroups(ModuleStoreTestCase): """ super(TestCohortsAndPartitionGroups, self).setUp() - self.test_course_key = SlashSeparatedCourseKey("edX", "toy", "2012_Fall") + self.test_course_key = ToyCourseFactory.create().id self.course = modulestore().get_course(self.test_course_key) self.first_cohort = CohortFactory(course_id=self.course.id, name="FirstCohort") diff --git a/openedx/core/djangoapps/course_groups/tests/test_partition_scheme.py b/openedx/core/djangoapps/course_groups/tests/test_partition_scheme.py index df76894633..b6b1971747 100644 --- a/openedx/core/djangoapps/course_groups/tests/test_partition_scheme.py +++ b/openedx/core/djangoapps/course_groups/tests/test_partition_scheme.py @@ -15,7 +15,8 @@ from courseware.tests.test_masquerade import StaffMasqueradeTestCase from student.tests.factories import UserFactory from xmodule.partitions.partitions import Group, UserPartition, UserPartitionError from xmodule.modulestore.django import modulestore -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, TEST_DATA_MIXED_TOY_MODULESTORE +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, TEST_DATA_MIXED_MODULESTORE +from xmodule.modulestore.tests.factories import ToyCourseFactory from opaque_keys.edx.locations import SlashSeparatedCourseKey from openedx.core.djangoapps.user_api.partition_schemes import RandomUserPartitionScheme @@ -31,7 +32,7 @@ class TestCohortPartitionScheme(ModuleStoreTestCase): """ Test the logic for linking a user to a partition group based on their cohort. """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def setUp(self): """ @@ -40,7 +41,7 @@ class TestCohortPartitionScheme(ModuleStoreTestCase): """ super(TestCohortPartitionScheme, self).setUp() - self.course_key = SlashSeparatedCourseKey("edX", "toy", "2012_Fall") + self.course_key = ToyCourseFactory.create().id self.course = modulestore().get_course(self.course_key) config_course_cohorts(self.course, is_cohorted=True) @@ -278,7 +279,7 @@ class TestGetCohortedUserPartition(ModuleStoreTestCase): """ Test that `get_cohorted_user_partition` returns the first user_partition with scheme `CohortPartitionScheme`. """ - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + MODULESTORE = TEST_DATA_MIXED_MODULESTORE def setUp(self): """ @@ -286,7 +287,7 @@ class TestGetCohortedUserPartition(ModuleStoreTestCase): and a student for each test. """ super(TestGetCohortedUserPartition, self).setUp() - self.course_key = SlashSeparatedCourseKey("edX", "toy", "2012_Fall") + self.course_key = ToyCourseFactory.create().id self.course = modulestore().get_course(self.course_key) self.student = UserFactory.create() diff --git a/openedx/core/lib/courses.py b/openedx/core/lib/courses.py index 2936cc93d8..ca5d3f13d8 100644 --- a/openedx/core/lib/courses.py +++ b/openedx/core/lib/courses.py @@ -13,7 +13,7 @@ from xmodule.modulestore import ModuleStoreEnum def course_image_url(course): """Try to look up the image url for the course. If it's not found, log an error and return the dead link""" - if course.static_asset_path or modulestore().get_modulestore_type(course.id) == ModuleStoreEnum.Type.xml: + if course.static_asset_path: # If we are a static course with the course_image attribute # set different than the default, return that path so that # courses can use custom course image paths, otherwise just diff --git a/openedx/core/lib/xblock_utils.py b/openedx/core/lib/xblock_utils.py index ab25b27639..2a0232436b 100644 --- a/openedx/core/lib/xblock_utils.py +++ b/openedx/core/lib/xblock_utils.py @@ -300,10 +300,9 @@ def add_staff_markup(user, has_instructor_access, disable_staff_debug_info, bloc # TODO: make this more general, eg use an XModule attribute instead if isinstance(block, VerticalBlock) and (not context or not context.get('child_of_vertical', False)): # check that the course is a mongo backed Studio course before doing work - is_mongo_course = modulestore().get_modulestore_type(block.location.course_key) != ModuleStoreEnum.Type.xml is_studio_course = block.course_edit_method == "Studio" - if is_studio_course and is_mongo_course: + if is_studio_course: # build edit link to unit in CMS. Can't use reverse here as lms doesn't load cms's urls.py edit_link = "//" + settings.CMS_BASE + '/container/' + unicode(block.location)