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..7784320ce0b9 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.html_block.HtmlBlock.icon_class', 'video', create=True) 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..ea7cacbd695e 100644 --- a/lms/djangoapps/courseware/tests/test_block_render.py +++ b/lms/djangoapps/courseware/tests/test_block_render.py @@ -111,7 +111,7 @@ 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 STUDENT_VIEW, ModuleStoreRuntime, XModuleMixin # lint-amnesty, pylint: disable=wrong-import-order TEST_DATA_DIR = settings.COMMON_TEST_DATA_ROOT @@ -1951,8 +1951,8 @@ 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) + # Use XModuleMixin.bind_for_student since it's no longer defined on the block classes directly + block.bind_for_student = partial(XModuleMixin.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 496211cab431..a70d1c8b646c 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -1300,7 +1300,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 4398f3686ca8..c4d0212b7b87 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -2327,7 +2327,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 02ae81a93b86..ad3f593f3027 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -1638,7 +1638,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 a68b55f91287..32874b46adc1 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -1731,7 +1731,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