diff --git a/xmodule/tests/test_vertical.py b/xmodule/tests/test_vertical.py index 1e8ababa912c..223cf3889cc7 100644 --- a/xmodule/tests/test_vertical.py +++ b/xmodule/tests/test_vertical.py @@ -5,24 +5,26 @@ # pylint: disable=protected-access +import json from collections import namedtuple from datetime import datetime, timedelta -import json from unittest.mock import Mock, patch -import pytz import ddt -from fs.memoryfs import MemoryFS +import pytz from django.contrib.auth.models import AnonymousUser from django.test import override_settings +from edx_toggles.toggles.testutils import override_waffle_switch +from fs.memoryfs import MemoryFS from openedx_filters import PipelineStep from openedx_filters.learning.filters import VerticalBlockChildRenderStarted, VerticalBlockRenderCompleted +from ..vertical_block import XBLOCK_SKILL_TAG_VERIFICATION_SWITCH +from ..x_module import AUTHOR_VIEW, PUBLIC_VIEW, STUDENT_VIEW from . import prepare_block_runtime from .helpers import StubUserService from .xml import XModuleXmlImportTest from .xml import factories as xml -from ..x_module import STUDENT_VIEW, AUTHOR_VIEW, PUBLIC_VIEW COMPLETION_DELAY = 9876 @@ -360,6 +362,7 @@ def test_render_studio_view(self): }, }, ) + @override_waffle_switch(XBLOCK_SKILL_TAG_VERIFICATION_SWITCH, True) def test_vertical_block_child_render_started_filter_execution(self): """ Test the VerticalBlockChildRenderStarted filter's effects on student view. @@ -382,6 +385,7 @@ def test_vertical_block_child_render_started_filter_execution(self): }, }, ) + @override_waffle_switch(XBLOCK_SKILL_TAG_VERIFICATION_SWITCH, True) def test_vertical_block_child_render_is_skipped_on_filter_exception(self): """ Test VerticalBlockChildRenderStarted filter can be used to skip child blocks. @@ -405,6 +409,7 @@ def test_vertical_block_child_render_is_skipped_on_filter_exception(self): }, }, ) + @override_waffle_switch(XBLOCK_SKILL_TAG_VERIFICATION_SWITCH, True) def test_vertical_block_render_completed_filter_execution(self): """ Test the VerticalBlockRenderCompleted filter's execution. @@ -427,6 +432,7 @@ def test_vertical_block_render_completed_filter_execution(self): }, }, ) + @override_waffle_switch(XBLOCK_SKILL_TAG_VERIFICATION_SWITCH, True) def test_vertical_block_render_output_is_changed_on_filter_exception(self): """ Test VerticalBlockRenderCompleted filter can be used to prevent vertical block from rendering. diff --git a/xmodule/vertical_block.py b/xmodule/vertical_block.py index d6a19353b2fb..10ff0a540870 100644 --- a/xmodule/vertical_block.py +++ b/xmodule/vertical_block.py @@ -9,17 +9,19 @@ from functools import reduce import pytz +from edx_toggles.toggles import WaffleSwitch from lxml import etree +from openedx_filters.learning.filters import VerticalBlockChildRenderStarted, VerticalBlockRenderCompleted from web_fragments.fragment import Fragment from xblock.core import XBlock # lint-amnesty, pylint: disable=wrong-import-order from xblock.fields import Boolean, Scope -from openedx_filters.learning.filters import VerticalBlockChildRenderStarted, VerticalBlockRenderCompleted + from xmodule.mako_block import MakoTemplateBlockBase from xmodule.progress import Progress from xmodule.seq_block import SequenceFields from xmodule.studio_editable import StudioEditableBlock -from xmodule.util.misc import is_xblock_an_assignment from xmodule.util.builtin_assets import add_webpack_js_to_fragment +from xmodule.util.misc import is_xblock_an_assignment from xmodule.x_module import PUBLIC_VIEW, STUDENT_VIEW, XModuleFields from xmodule.xml_block import XmlMixin @@ -32,6 +34,17 @@ # HACK: This shouldn't be hard-coded to two types # OBSOLETE: This obsoletes 'type' CLASS_PRIORITY = ['video', 'problem'] +WAFFLE_NAMESPACE = 'xblocks' +# .. toggle_name: xblocks.xblock_skill_tag_verification' +# .. toggle_implementation: WaffleSwitch +# .. toggle_default: False +# .. toggle_description: Set to True to get learner verification of the skills associated with the xblock. +# .. toggle_use_cases: open_edx +# .. toggle_creation_date: 2023-10-04 +# .. toggle_target_removal_date: None +XBLOCK_SKILL_TAG_VERIFICATION_SWITCH = WaffleSwitch( # lint-amnesty, pylint: disable=toggle-missing-annotation + f'{WAFFLE_NAMESPACE}.xblock_skill_tag_verification', __name__ +) class VerticalFields: @@ -116,16 +129,16 @@ def _student_or_public_view(self, context, view): # lint-amnesty, pylint: disab child_block_context['wrap_xblock_data'] = { 'mark-completed-on-view-after-delay': complete_on_view_delay } - - try: - # .. filter_implemented_name: VerticalBlockChildRenderStarted - # .. filter_type: org.openedx.learning.vertical_block_child.render.started.v1 - child, child_block_context = VerticalBlockChildRenderStarted.run_filter( - block=child, context=child_block_context - ) - except VerticalBlockChildRenderStarted.PreventChildBlockRender as exc: - log.info("Skipping %s from vertical block. Reason: %s", child, exc.message) - continue + if XBLOCK_SKILL_TAG_VERIFICATION_SWITCH.is_enabled(): + try: + # .. filter_implemented_name: VerticalBlockChildRenderStarted + # .. filter_type: org.openedx.learning.vertical_block_child.render.started.v1 + child, child_block_context = VerticalBlockChildRenderStarted.run_filter( + block=child, context=child_block_context + ) + except VerticalBlockChildRenderStarted.PreventChildBlockRender as exc: + log.info("Skipping %s from vertical block. Reason: %s", child, exc.message) + continue rendered_child = child.render(view, child_block_context) fragment.add_fragment_resources(rendered_child) @@ -167,15 +180,16 @@ def _student_or_public_view(self, context, view): # lint-amnesty, pylint: disab add_webpack_js_to_fragment(fragment, 'VerticalStudentView') fragment.initialize_js('VerticalStudentView') - try: - # .. filter_implemented_name: VerticalBlockRenderCompleted - # .. filter_type: org.openedx.learning.vertical_block.render.completed.v1 - _, fragment, context, view = VerticalBlockRenderCompleted.run_filter( - block=self, fragment=fragment, context=context, view=view - ) - except VerticalBlockRenderCompleted.PreventVerticalBlockRender as exc: - log.info("VerticalBlock rendering stopped. Reason: %s", exc.message) - fragment.content = exc.message + if XBLOCK_SKILL_TAG_VERIFICATION_SWITCH.is_enabled(): + try: + # .. filter_implemented_name: VerticalBlockRenderCompleted + # .. filter_type: org.openedx.learning.vertical_block.render.completed.v1 + _, fragment, context, view = VerticalBlockRenderCompleted.run_filter( + block=self, fragment=fragment, context=context, view=view + ) + except VerticalBlockRenderCompleted.PreventVerticalBlockRender as exc: + log.info("VerticalBlock rendering stopped. Reason: %s", exc.message) + fragment.content = exc.message return fragment