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 c0252802c80b..f3d552712b23 100644 --- a/lms/djangoapps/course_home_api/outline/tests/test_view.py +++ b/lms/djangoapps/course_home_api/outline/tests/test_view.py @@ -881,7 +881,7 @@ def test_vertical_icon(self, block_categories, expected_icon): assert vertical_data['icon'] == expected_icon - @patch('xmodule.html_block.HtmlBlock.icon_class', 'video') + @patch('xmodule.x_module.XModuleMixin.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() diff --git a/lms/djangoapps/courseware/tests/test_block_render.py b/lms/djangoapps/courseware/tests/test_block_render.py index ab784ab4b2f0..04953f52b466 100644 --- a/lms/djangoapps/courseware/tests/test_block_render.py +++ b/lms/djangoapps/courseware/tests/test_block_render.py @@ -45,7 +45,11 @@ from xblock.exceptions import NoSuchServiceError from xblock.field_data import FieldData # lint-amnesty, pylint: disable=wrong-import-order from xblock.fields import ScopeIds # lint-amnesty, pylint: disable=wrong-import-order -from xblock.runtime import DictKeyValueStore, KvsFieldData # lint-amnesty, pylint: disable=wrong-import-order +from xblock.runtime import ( # lint-amnesty, pylint: disable=wrong-import-order + DictKeyValueStore, + KvsFieldData, + Mixologist, # lint-amnesty, pylint: disable=wrong-import-order +) from xblock.test.tools import TestRuntime # lint-amnesty, pylint: disable=wrong-import-order from xblocks_contrib.problem.capa.tests.response_xml_factory import ( OptionResponseXMLFactory, # lint-amnesty, pylint: disable=reimported @@ -111,7 +115,10 @@ from xmodule.modulestore.tests.test_asides import AsideTestType # lint-amnesty, pylint: disable=wrong-import-order from xmodule.services import RebindUserServiceError from xmodule.video_block import VideoBlock # lint-amnesty, pylint: disable=wrong-import-order -from xmodule.x_module import STUDENT_VIEW, ModuleStoreRuntime # lint-amnesty, pylint: disable=wrong-import-order +from xmodule.x_module import ( # lint-amnesty, pylint: disable=wrong-import-order + STUDENT_VIEW, + ModuleStoreRuntime, +) TEST_DATA_DIR = settings.COMMON_TEST_DATA_ROOT @@ -1931,8 +1938,9 @@ def setUp(self): @patch('lms.djangoapps.courseware.block_render.has_access', Mock(return_value=True, autospec=True)) def _get_anonymous_id(self, course_id, xblock_class, should_get_deprecated_id: bool): # lint-amnesty, pylint: disable=missing-function-docstring location = course_id.make_usage_key('dummy_category', 'dummy_name') + mixed_class = Mixologist(settings.XBLOCK_MIXINS).mix(xblock_class) block = Mock( - spec=xblock_class, + spec=mixed_class, _field_data=Mock(spec=FieldData, name='field_data'), location=location, static_asset_path=None, @@ -1951,8 +1959,7 @@ def _get_anonymous_id(self, course_id, xblock_class, should_get_deprecated_id: b days_early_for_beta=None, ) block.runtime = ModuleStoreRuntime(None, None, None) - # Use the xblock_class's bind_for_student method - block.bind_for_student = partial(xblock_class.bind_for_student, block) + block.bind_for_student = partial(mixed_class.bind_for_student, block) if hasattr(xblock_class, 'module_class'): block.module_class = xblock_class.module_class diff --git a/lms/djangoapps/courseware/tests/test_discussion_xblock.py b/lms/djangoapps/courseware/tests/test_discussion_xblock.py index 2a9373c113bb..8181146b2ef1 100644 --- a/lms/djangoapps/courseware/tests/test_discussion_xblock.py +++ b/lms/djangoapps/courseware/tests/test_discussion_xblock.py @@ -55,6 +55,7 @@ def setUp(self): }) scope_ids = mock.Mock() scope_ids.usage_id.course_key = self.course_id + scope_ids.usage_id.context_key = self.course_id self.block = DiscussionXBlock( self.runtime, field_data=self.data, diff --git a/openedx/envs/common.py b/openedx/envs/common.py index 1b422391b8d5..677b3cb69ba6 100644 --- a/openedx/envs/common.py +++ b/openedx/envs/common.py @@ -2087,7 +2087,7 @@ def add_optional_apps(optional_apps, installed_apps): # .. toggle_warning: Not production-ready until relevant subtask https://github.com/openedx/edx-platform/issues/34827 is done. # .. toggle_creation_date: 2024-11-10 # .. toggle_target_removal_date: 2026-04-10 -USE_EXTRACTED_DISCUSSION_BLOCK = False +USE_EXTRACTED_DISCUSSION_BLOCK = True # .. toggle_name: USE_EXTRACTED_PROBLEM_BLOCK # .. toggle_default: False @@ -2097,7 +2097,7 @@ def add_optional_apps(optional_apps, installed_apps): # .. toggle_warning: Not production-ready until relevant subtask https://github.com/openedx/edx-platform/issues/34827 is done. # .. toggle_creation_date: 2024-11-10 # .. toggle_target_removal_date: 2026-04-10 -USE_EXTRACTED_PROBLEM_BLOCK = False +USE_EXTRACTED_PROBLEM_BLOCK = True # .. toggle_name: USE_EXTRACTED_VIDEO_BLOCK # .. toggle_default: True diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 183ec08d6bfc..37115d58cf0e 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -1302,7 +1302,7 @@ xblock-utils==4.0.0 # via # edx-sga # xblock-poll -xblocks-contrib==0.15.3 +git+https://github.com/openedx/xblocks-contrib.git@remove-legacy-mixins#egg=xblocks-contrib # via -r requirements/edx/bundled.in xmlsec==1.3.14 # via diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index a4b4a5baf329..d153367f302e 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -2329,7 +2329,7 @@ xblock-utils==4.0.0 # -r requirements/edx/testing.txt # edx-sga # xblock-poll -xblocks-contrib==0.15.3 +git+https://github.com/openedx/xblocks-contrib.git@remove-legacy-mixins#egg=xblocks-contrib # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index ebad2efd8d82..aab633d6e6c9 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -1640,7 +1640,7 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xblocks-contrib==0.15.3 +git+https://github.com/openedx/xblocks-contrib.git@remove-legacy-mixins#egg=xblocks-contrib # via -r requirements/edx/base.txt xmlsec==1.3.14 # via diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 4f309040abdc..c9a558c21448 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -1733,7 +1733,7 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xblocks-contrib==0.15.3 +git+https://github.com/openedx/xblocks-contrib.git@remove-legacy-mixins#egg=xblocks-contrib # via -r requirements/edx/base.txt xmlsec==1.3.14 # via diff --git a/xmodule/modulestore/__init__.py b/xmodule/modulestore/__init__.py index 3446a4c8c61b..da96b2d18671 100644 --- a/xmodule/modulestore/__init__.py +++ b/xmodule/modulestore/__init__.py @@ -14,6 +14,7 @@ from operator import itemgetter from zoneinfo import ZoneInfo +from django.conf import settings from django.db import transaction from opaque_keys.edx.keys import AssetKey, CourseKey from opaque_keys.edx.locations import Location # For import backwards compatibility @@ -1196,7 +1197,8 @@ def __init__( # lint-amnesty, pylint: disable=unused-argument # TODO move the inheritance_cache_subsystem to classes which use it self.metadata_inheritance_cache_subsystem = metadata_inheritance_cache_subsystem self.request_cache = request_cache - self.xblock_mixins = xblock_mixins + settings_mixins = getattr(settings, 'XBLOCK_MIXINS', ()) + self.xblock_mixins = tuple(dict.fromkeys(settings_mixins + xblock_mixins)) self.xblock_select = xblock_select self.xblock_field_data_wrappers = xblock_field_data_wrappers self.disabled_xblock_types = disabled_xblock_types