diff --git a/lms/djangoapps/course_api/blocks/serializers.py b/lms/djangoapps/course_api/blocks/serializers.py index 666724e357af..f0e1c546b330 100644 --- a/lms/djangoapps/course_api/blocks/serializers.py +++ b/lms/djangoapps/course_api/blocks/serializers.py @@ -58,6 +58,7 @@ def __init__( SupportedFieldType('weight'), SupportedFieldType('show_correctness'), SupportedFieldType('hide_from_toc'), + SupportedFieldType('icon_class'), # 'student_view_data' SupportedFieldType(StudentViewTransformer.STUDENT_VIEW_DATA, StudentViewTransformer), # 'student_view_multi_device' diff --git a/lms/djangoapps/course_api/blocks/transformers/blocks_api.py b/lms/djangoapps/course_api/blocks/transformers/blocks_api.py index 81dc388aa1de..cbfc398d8175 100644 --- a/lms/djangoapps/course_api/blocks/transformers/blocks_api.py +++ b/lms/djangoapps/course_api/blocks/transformers/blocks_api.py @@ -54,7 +54,15 @@ def collect(cls, block_structure): transform method. """ # collect basic xblock fields - block_structure.request_xblock_fields('graded', 'format', 'display_name', 'category', 'due', 'show_correctness') + block_structure.request_xblock_fields( + 'graded', + 'format', + 'display_name', + 'category', + 'due', + 'show_correctness', + 'icon_class', + ) # collect data from containing transformers StudentViewTransformer.collect(block_structure) diff --git a/lms/djangoapps/course_home_api/outline/serializers.py b/lms/djangoapps/course_home_api/outline/serializers.py index 83b8a9729eb0..593f012fe691 100644 --- a/lms/djangoapps/course_home_api/outline/serializers.py +++ b/lms/djangoapps/course_home_api/outline/serializers.py @@ -82,7 +82,7 @@ def get_vertical_icon_class(block): video """ children = block.get('children', []) - child_classes = {child.get('type') for child in children} + child_classes = {value for child in children for value in (child.get('type'), child.get('icon_class'))} if 'problem' in child_classes: return 'problem' if 'video' in child_classes: diff --git a/lms/djangoapps/course_home_api/outline/tests/test_view.py b/lms/djangoapps/course_home_api/outline/tests/test_view.py index 4f40d9a80192..2a4d1e65a5e1 100644 --- a/lms/djangoapps/course_home_api/outline/tests/test_view.py +++ b/lms/djangoapps/course_home_api/outline/tests/test_view.py @@ -796,3 +796,33 @@ def test_blocks_completion_stat_all_problem_completed(self): assert vertical_data['complete'] assert sequence_data['completion_stat'] == expected_sequence_completion_stat assert vertical_data['completion_stat'] == expected_vertical_completion_stat + + @ddt.data( + (['html'], 'other'), + (['html', 'video'], 'video'), + (['html', 'video', 'problem'], 'problem'), + ) + @ddt.unpack + def test_vertical_icon(self, block_categories, expected_icon): + """Test that the API checks the children `category` to determine the icon for the unit.""" + self.add_blocks_to_course() + CourseEnrollment.enroll(self.user, self.course.id) + + for category in block_categories: + BlockFactory.create(parent=self.vertical, category=category) + + response = self.client.get(reverse('course-home:course-navigation', args=[self.course.id])) + vertical_data = response.data['blocks'][str(self.vertical.location)] + + assert vertical_data['icon'] == expected_icon + + @patch('xmodule.html_block.HtmlBlock.icon_class', 'video') + def test_vertical_icon_determined_by_icon_class(self): + """Test that the API checks the children `icon_class` to determine the icon for the unit.""" + self.add_blocks_to_course() + CourseEnrollment.enroll(self.user, self.course.id) + + BlockFactory.create(parent=self.vertical, category='html') + response = self.client.get(reverse('course-home:course-navigation', args=[self.course.id])) + vertical_data = response.data['blocks'][str(self.vertical.location)] + assert vertical_data['icon'] == 'video' diff --git a/openedx/features/course_experience/utils.py b/openedx/features/course_experience/utils.py index 769bb8bad082..c20b7f077136 100644 --- a/openedx/features/course_experience/utils.py +++ b/openedx/features/course_experience/utils.py @@ -116,6 +116,7 @@ def recurse_mark_auth_denial(block): 'complete', 'resume_block', 'hide_from_toc', + 'icon_class', ], allow_start_dates_in_future=allow_start_dates_in_future, )