diff --git a/lms/djangoapps/courseware/management/commands/tests/test_xblock_list_csv.py b/lms/djangoapps/courseware/management/commands/tests/test_xblock_list_csv.py index e25acadf798c..e8bd2d0ac1e9 100644 --- a/lms/djangoapps/courseware/management/commands/tests/test_xblock_list_csv.py +++ b/lms/djangoapps/courseware/management/commands/tests/test_xblock_list_csv.py @@ -24,13 +24,14 @@ class GenerateCSVCommandTestCase(TestCase): COURSE_ID = "course-v1:edX+Test101+2024" @staticmethod - def _make_block(display_name, block_type): + def _make_block(display_name, block_type, editor="visual"): """ Creates a mock block """ component = MagicMock() component.display_name = display_name component.location.block_type = block_type + component.editor = editor component.get_children.return_value = [] return component @@ -93,6 +94,7 @@ def test_header_row(self): "Component Name", "Xblock Type", "Full Hierarchy", + "Editor", ] def test_all_components_included_by_default(self): @@ -110,6 +112,7 @@ def test_all_components_included_by_default(self): assert row[5] == "My HTML" assert row[6] == "html" assert row[7] == "Section 1 > Subsection 1 > Unit 1 > My HTML" + assert row[8] == "visual" def test_exclude_core_xblocks(self): rows = self._run_generate(exclude_core_xblocks=True) @@ -289,3 +292,22 @@ def test_component_with_no_display_name_does_not_fail_course(self): named_row = rows[2] assert named_row[5] == "My HTML" assert named_row[7] == "Section 1 > Subsection 1 > Unit 1 > My HTML" + + def test_editor_column(self): + visual_html = self._make_block("Text", "html", editor="visual") + raw_html = self._make_block("Raw HTML", "html", editor="raw") + video = self._make_block("My Video", "video") + unit = self._make_container("Unit 1", [visual_html, raw_html, video]) + subsection = self._make_container("Subsection 1", [unit]) + section = self._make_container("Section 1", [subsection]) + course = self._make_course(self.COURSE_ID, "Test Course", [section]) + + output = StringIO() + with patch(MODULESTORE_PATH) as mock_modulestore: + mock_modulestore.return_value.get_courses.return_value = [course] + + generate_xblocks_csv(output, False, None) + + output.seek(0) + rows = list(csv.reader(output)) + assert [row[8] for row in rows[1:]] == ["visual", "raw", ""] diff --git a/lms/djangoapps/courseware/management/commands/xblock_list_csv.py b/lms/djangoapps/courseware/management/commands/xblock_list_csv.py index a3afc797047c..712766010f91 100644 --- a/lms/djangoapps/courseware/management/commands/xblock_list_csv.py +++ b/lms/djangoapps/courseware/management/commands/xblock_list_csv.py @@ -29,6 +29,16 @@ def iter_descendants(block, ancestor_names=None): yield from iter_descendants(child, ancestor_names + [child.display_name]) +def get_editor(component): + """ + Return the editor type ("visual" or "raw") of an html component, or an + empty string for any other block type. + """ + if component.location.block_type != "html": + return "" + return component.editor + + def _iter_course_rows(course, exclude_core_xblocks): """ Yield CSV rows for `course`. @@ -53,6 +63,7 @@ def _iter_course_rows(course, exclude_core_xblocks): + ancestors + [component.display_name] ), + get_editor(component), ) @@ -147,6 +158,7 @@ def generate_xblocks_csv( "Component Name", "Xblock Type", "Full Hierarchy", + "Editor", ) )