Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion openedx/envs/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion requirements/edx/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion requirements/edx/development.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion requirements/edx/doc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion requirements/edx/testing.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
17 changes: 13 additions & 4 deletions xmodule/discussion_block.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = 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"
29 changes: 21 additions & 8 deletions xmodule/tests/test_discussion.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@
import random
import string
from collections import namedtuple
from unittest import TestCase, mock
from django.test import override_settings, TestCase
from unittest import mock

import ddt
from xblock.field_data import DictFieldData
from xblock.fields import NO_CACHE_VALUE, UNIQUE_ID, ScopeIds
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):
Expand Down Expand Up @@ -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):
"""
Expand All @@ -69,14 +71,15 @@ 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
"""
Builds target xblock instance (DiscussionXBlock)

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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Loading