From 38a94234a0b6348b5e1a3e6c3f05836461f07628 Mon Sep 17 00:00:00 2001 From: salman2013 Date: Tue, 13 Jan 2026 16:17:45 +0500 Subject: [PATCH 1/2] chore: test enable PR for extracted discussion block --- openedx/envs/common.py | 2 +- requirements/edx/base.txt | 3 ++- requirements/edx/development.txt | 3 ++- requirements/edx/doc.txt | 3 ++- requirements/edx/testing.txt | 3 ++- xmodule/discussion_block.py | 19 ++++++++++++++----- xmodule/tests/test_discussion.py | 27 ++++++++++++++++++++------- 7 files changed, 43 insertions(+), 17 deletions(-) diff --git a/openedx/envs/common.py b/openedx/envs/common.py index 59313c8382fa..cae060de5484 100644 --- a/openedx/envs/common.py +++ b/openedx/envs/common.py @@ -2094,7 +2094,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: 2025-06-01 -USE_EXTRACTED_DISCUSSION_BLOCK = False +USE_EXTRACTED_DISCUSSION_BLOCK = True # .. toggle_name: USE_EXTRACTED_PROBLEM_BLOCK # .. toggle_default: False diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index ce28efaacaf8..a229d7a9bec5 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -1274,7 +1274,8 @@ xblock-utils==4.0.0 # via # edx-sga # xblock-poll -xblocks-contrib==0.10.0 +# xblocks-contrib==0.10.0 +git+https://github.com/openedx/xblocks-contrib.git@salman/extract-discussion-block#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 2d2d6e376c90..85fc365fa0de 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -2306,7 +2306,8 @@ xblock-utils==4.0.0 # -r requirements/edx/testing.txt # edx-sga # xblock-poll -xblocks-contrib==0.10.0 +# xblocks-contrib==0.10.0 +git+https://github.com/openedx/xblocks-contrib.git@salman/extract-discussion-block#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 21d3df35c560..232581e5b3a7 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -1612,7 +1612,8 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xblocks-contrib==0.10.0 +# xblocks-contrib==0.10.0 +git+https://github.com/openedx/xblocks-contrib.git@salman/extract-discussion-block#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 bbb2900795e9..b2fc1dca26bc 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -1703,7 +1703,8 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xblocks-contrib==0.10.0 +# xblocks-contrib==0.10.0 +git+https://github.com/openedx/xblocks-contrib.git@salman/extract-discussion-block#egg=xblocks-contrib # via -r requirements/edx/base.txt xmlsec==1.3.14 # via diff --git a/xmodule/discussion_block.py b/xmodule/discussion_block.py index aaea2de7bb2a..bcf7894d50c2 100644 --- a/xmodule/discussion_block.py +++ b/xmodule/discussion_block.py @@ -282,8 +282,17 @@ def _apply_metadata_and_policy(cls, block, node, runtime): setattr(block, field_name, value) -DiscussionXBlock = ( - _ExtractedDiscussionXBlock if settings.USE_EXTRACTED_DISCUSSION_BLOCK - else _BuiltInDiscussionXBlock -) -DiscussionXBlock.__name__ = "DiscussionXBlock" +DiscussionXBlock = None + + +def reset_class(): + """Reset class as per django settings flag""" + global DiscussionXBlock + DiscussionXBlock = ( + _ExtractedDiscussionXBlock if settings.USE_EXTRACTED_DISCUSSION_BLOCK + else _BuiltInDiscussionXBlock + ) + return DiscussionXBlock + +reset_class() +DiscussionXBlock.__name__ = "DiscussionXBlock" \ No newline at end of file diff --git a/xmodule/tests/test_discussion.py b/xmodule/tests/test_discussion.py index 4bea706be51f..2bde1861dac5 100644 --- a/xmodule/tests/test_discussion.py +++ b/xmodule/tests/test_discussion.py @@ -5,6 +5,7 @@ import random import string from collections import namedtuple +from django.test import override_settings from unittest import TestCase, mock import ddt @@ -13,7 +14,7 @@ from xblock.runtime import Runtime from openedx.core.lib.safe_lxml import etree -from xmodule.discussion_block import DiscussionXBlock +from xmodule import discussion_block def attribute_pair_repr(self): @@ -54,11 +55,12 @@ def _make_attribute_test_cases(): @ddt.ddt -class DiscussionXBlockImportExportTests(TestCase): +class _DiscussionXBlockImportExportTestsBase(TestCase): """ Import and export tests """ DISCUSSION_XBLOCK_LOCATION = "xmodule.discussion_block.DiscussionXBlock" + __test__ = False def setUp(self): """ @@ -69,6 +71,7 @@ def setUp(self): self.runtime_mock = mock.Mock(spec=Runtime) self.runtime_mock.construct_xblock_from_class = mock.Mock(side_effect=self._construct_xblock_mock) self.runtime_mock.get_policy = mock.Mock(return_value={}) + self.discussion_xblock_class = discussion_block.reset_class() def _construct_xblock_mock(self, cls, keys): # pylint: disable=unused-argument """ @@ -76,7 +79,7 @@ def _construct_xblock_mock(self, cls, keys): # pylint: disable=unused-argument Signature-compatible with runtime.construct_xblock_from_class - can be used as a mock side-effect """ - return DiscussionXBlock(self.runtime_mock, scope_ids=keys, field_data=DictFieldData({})) + return self.discussion_xblock_class(self.runtime_mock, scope_ids=keys, field_data=DictFieldData({})) @mock.patch(DISCUSSION_XBLOCK_LOCATION + ".load_definition_xml") @ddt.unpack @@ -101,7 +104,7 @@ def test_xblock_export_format(self, id_pair, category_pair, target_pair, patched patched_load_definition_xml.side_effect = Exception("Irrelevant") - block = DiscussionXBlock.parse_xml(node, self.runtime_mock, self.keys) + block = self.discussion_xblock_class.parse_xml(node, self.runtime_mock, self.keys) try: assert block.discussion_id == id_pair.value assert block.discussion_category == category_pair.value @@ -133,7 +136,7 @@ def test_legacy_export_format(self, id_pair, category_pair, target_pair, patched patched_load_definition_xml.return_value = (definition_node, "irrelevant") - block = DiscussionXBlock.parse_xml(node, self.runtime_mock, self.keys) + block = self.discussion_xblock_class.parse_xml(node, self.runtime_mock, self.keys) try: assert block.discussion_id == id_pair.value assert block.discussion_category == category_pair.value @@ -156,7 +159,7 @@ def test_export_default_discussion_id(self): """ target_node = etree.Element('dummy') - block = DiscussionXBlock(self.runtime_mock, scope_ids=self.keys, field_data=DictFieldData({})) + block = self.discussion_xblock_class(self.runtime_mock, scope_ids=self.keys, field_data=DictFieldData({})) discussion_id_field = block.fields['discussion_id'] # pylint: disable=unsubscriptable-object # precondition checks - discussion_id does not have a value and uses UNIQUE_ID @@ -174,7 +177,7 @@ def test_export_custom_discussion_id(self, discussion_id): """ target_node = etree.Element('dummy') - block = DiscussionXBlock(self.runtime_mock, scope_ids=self.keys, field_data=DictFieldData({})) + block = self.discussion_xblock_class(self.runtime_mock, scope_ids=self.keys, field_data=DictFieldData({})) block.discussion_id = discussion_id # precondition check @@ -183,3 +186,13 @@ def test_export_custom_discussion_id(self, discussion_id): block.add_xml_to_node(target_node) assert target_node.tag == 'discussion' assert target_node.attrib['discussion_id'], discussion_id + + +@override_settings(USE_EXTRACTED_DISCUSSION_BLOCK=True) +class DiscussionXBlockImportExportTestsExtracted(_DiscussionXBlockImportExportTestsBase): + __test__ = True + + +@override_settings(USE_EXTRACTED_DISCUSSION_BLOCK=False) +class DiscussionXBlockImportExportTestsBuiltIn(_DiscussionXBlockImportExportTestsBase): + __test__ = True \ No newline at end of file From a9e8fbb90ce35aeca37485f5b8cb636315a7143c Mon Sep 17 00:00:00 2001 From: salman2013 Date: Wed, 14 Jan 2026 12:02:12 +0500 Subject: [PATCH 2/2] fix: fix tests --- xmodule/discussion_block.py | 2 +- xmodule/tests/test_discussion.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xmodule/discussion_block.py b/xmodule/discussion_block.py index bcf7894d50c2..7b083437758a 100644 --- a/xmodule/discussion_block.py +++ b/xmodule/discussion_block.py @@ -295,4 +295,4 @@ def reset_class(): return DiscussionXBlock reset_class() -DiscussionXBlock.__name__ = "DiscussionXBlock" \ No newline at end of file +DiscussionXBlock.__name__ = "DiscussionXBlock" diff --git a/xmodule/tests/test_discussion.py b/xmodule/tests/test_discussion.py index 2bde1861dac5..89eea67c92e1 100644 --- a/xmodule/tests/test_discussion.py +++ b/xmodule/tests/test_discussion.py @@ -5,8 +5,8 @@ import random import string from collections import namedtuple -from django.test import override_settings -from unittest import TestCase, mock +from django.test import override_settings, TestCase +from unittest import mock import ddt from xblock.field_data import DictFieldData @@ -195,4 +195,4 @@ class DiscussionXBlockImportExportTestsExtracted(_DiscussionXBlockImportExportTe @override_settings(USE_EXTRACTED_DISCUSSION_BLOCK=False) class DiscussionXBlockImportExportTestsBuiltIn(_DiscussionXBlockImportExportTestsBase): - __test__ = True \ No newline at end of file + __test__ = True