diff --git a/lms/djangoapps/courseware/management/commands/dump_course_structure.py b/lms/djangoapps/courseware/management/commands/dump_course_structure.py index e84f38e340..2f1fd8f8e3 100644 --- a/lms/djangoapps/courseware/management/commands/dump_course_structure.py +++ b/lms/djangoapps/courseware/management/commands/dump_course_structure.py @@ -25,7 +25,7 @@ from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey from xblock.fields import Scope -from xblock_discussion import DiscussionXBlock +from xmodule.discussion_block import DiscussionXBlock from xmodule.modulestore.django import modulestore from xmodule.modulestore.inheritance import compute_inherited_metadata, own_metadata diff --git a/lms/djangoapps/courseware/tests/test_discussion_xblock.py b/lms/djangoapps/courseware/tests/test_discussion_xblock.py index aa77725c2c..0b3577c34f 100644 --- a/lms/djangoapps/courseware/tests/test_discussion_xblock.py +++ b/lms/djangoapps/courseware/tests/test_discussion_xblock.py @@ -16,7 +16,7 @@ from django.urls import reverse from opaque_keys.edx.keys import CourseKey from web_fragments.fragment import Fragment from xblock.field_data import DictFieldData -from xblock_discussion import DiscussionXBlock, loader +from xmodule.discussion_block import DiscussionXBlock, loader from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.tests.django_utils import TEST_DATA_MONGO_AMNESTY_MODULESTORE, SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import ItemFactory, ToyCourseFactory diff --git a/openedx/core/djangoapps/discussions/utils.py b/openedx/core/djangoapps/discussions/utils.py index a9d1c0cb1b..15e5243c17 100644 --- a/openedx/core/djangoapps/discussions/utils.py +++ b/openedx/core/djangoapps/discussions/utils.py @@ -11,7 +11,7 @@ from openedx.core.djangoapps.course_groups.cohorts import get_cohort_names, is_c from openedx.core.djangoapps.django_comment_common.models import CourseDiscussionSettings from openedx.core.lib.cache_utils import request_cached from openedx.core.lib.courses import get_course_by_id -from openedx.core.lib.xblock_builtin.xblock_discussion.xblock_discussion import DiscussionXBlock +from xmodule.discussion_block import DiscussionXBlock from openedx.core.types import User from xmodule.course_module import CourseBlock # lint-amnesty, pylint: disable=wrong-import-order from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order diff --git a/openedx/core/lib/tests/test_xblock_utils.py b/openedx/core/lib/tests/test_xblock_utils.py index 5f446e9561..6671267133 100644 --- a/openedx/core/lib/tests/test_xblock_utils.py +++ b/openedx/core/lib/tests/test_xblock_utils.py @@ -18,7 +18,7 @@ from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory from xmodule.modulestore.tests.test_asides import AsideTestType from openedx.core.lib.url_utils import quote_slashes -from openedx.core.lib.xblock_builtin import get_css_dependencies, get_js_dependencies +from openedx.core.lib.xblock_utils import get_css_dependencies, get_js_dependencies from openedx.core.lib.xblock_utils import ( get_aside_from_xblock, is_xblock_aside, diff --git a/openedx/core/lib/xblock_builtin/README.rst b/openedx/core/lib/xblock_builtin/README.rst deleted file mode 100644 index ce8d58b767..0000000000 --- a/openedx/core/lib/xblock_builtin/README.rst +++ /dev/null @@ -1,17 +0,0 @@ -Open edX: Built-in XBlocks --------------------------- - -This area is meant for exceptional and hopefully temporary cases where an -XBlock is integral to the functionality of the Open edX platform. - -This is not a pattern we wish for normal XBlocks to follow; they should live in -their own repo. - -Discussion XBlock -================= - -This XBlock was converted from an XModule, and will hopefully be pulled out of -edx-platform into its own repo at some point. From discussions, it's not too -difficult to move the server-side code , but the client-side code is used by -the discussion board tab and the team discussion, so for now, must remain in -edx-platform. diff --git a/openedx/core/lib/xblock_builtin/__init__.py b/openedx/core/lib/xblock_builtin/__init__.py deleted file mode 100644 index 59ce97903d..0000000000 --- a/openedx/core/lib/xblock_builtin/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -Helper functions shared by built-in XBlocks. - -""" - - -from django.conf import settings - - -def get_css_dependencies(group): - """ - Returns list of CSS dependencies belonging to `group` in settings.PIPELINE['STYLESHEETS']. - - Respects `PIPELINE['PIPELINE_ENABLED']` setting. - """ - if settings.PIPELINE['PIPELINE_ENABLED']: - return [settings.PIPELINE['STYLESHEETS'][group]['output_filename']] - else: - return settings.PIPELINE['STYLESHEETS'][group]['source_filenames'] - - -def get_js_dependencies(group): - """ - Returns list of JS dependencies belonging to `group` in settings.PIPELINE['JAVASCRIPT']. - - Respects `PIPELINE['PIPELINE_ENABLED']` setting. - """ - if settings.PIPELINE['PIPELINE_ENABLED']: - return [settings.PIPELINE['JAVASCRIPT'][group]['output_filename']] - else: - return settings.PIPELINE['JAVASCRIPT'][group]['source_filenames'] diff --git a/openedx/core/lib/xblock_builtin/xblock_discussion/README.rst b/openedx/core/lib/xblock_builtin/xblock_discussion/README.rst deleted file mode 100644 index 80e9568232..0000000000 --- a/openedx/core/lib/xblock_builtin/xblock_discussion/README.rst +++ /dev/null @@ -1 +0,0 @@ -See ``lms/djangoapps/discussion/README.rst`` diff --git a/openedx/core/lib/xblock_builtin/xblock_discussion/__init__.py b/openedx/core/lib/xblock_builtin/xblock_discussion/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openedx/core/lib/xblock_builtin/xblock_discussion/setup.py b/openedx/core/lib/xblock_builtin/xblock_discussion/setup.py deleted file mode 100644 index 10ffbce40b..0000000000 --- a/openedx/core/lib/xblock_builtin/xblock_discussion/setup.py +++ /dev/null @@ -1,37 +0,0 @@ -""" -Setup for discussion-forum XBlock. -""" - - -import os -from setuptools import find_packages, setup - - -def package_data(pkg, root_list): - """ - Generic function to find package_data for `pkg` under `root`. - """ - data = [] - for root in root_list: - for dirname, _, files in os.walk(os.path.join(pkg, root)): - for fname in files: - data.append(os.path.relpath(os.path.join(dirname, fname), pkg)) - - return {pkg: data} - - -setup( - name='xblock-discussion', - version='0.1', - description='XBlock - Discussion', - install_requires=[ - 'XBlock', - ], - entry_points={ - 'xblock.v1': [ - 'discussion = xblock_discussion:DiscussionXBlock' - ] - }, - packages=find_packages(exclude=['tests.*']), - package_data=package_data("xblock_discussion", ["static"]), -) diff --git a/openedx/core/lib/xblock_utils/__init__.py b/openedx/core/lib/xblock_utils/__init__.py index 43ec280348..ca881bd02d 100644 --- a/openedx/core/lib/xblock_utils/__init__.py +++ b/openedx/core/lib/xblock_utils/__init__.py @@ -1,5 +1,5 @@ """ -Functions that can are used to modify XBlock fragments for use in the LMS and Studio +Functions that are used to modify XBlock fragments for use in the LMS and Studio """ @@ -32,7 +32,10 @@ from xmodule.seq_module import SequenceBlock # lint-amnesty, pylint: disable=wr from xmodule.util.xmodule_django import add_webpack_to_fragment # lint-amnesty, pylint: disable=wrong-import-order from xmodule.vertical_block import VerticalBlock # lint-amnesty, pylint: disable=wrong-import-order from xmodule.x_module import ( # lint-amnesty, pylint: disable=wrong-import-order - PREVIEW_VIEWS, STUDENT_VIEW, STUDIO_VIEW, shim_xmodule_js, + PREVIEW_VIEWS, + STUDENT_VIEW, + STUDIO_VIEW, + shim_xmodule_js ) log = logging.getLogger(__name__) @@ -510,3 +513,27 @@ def get_icon(block): It can be overridden by setting `OVERRIDE_GET_UNIT_ICON` to an alternative implementation. """ return block.get_icon_class() + + +def get_css_dependencies(group): + """ + Returns list of CSS dependencies belonging to `group` in settings.PIPELINE['STYLESHEETS']. + + Respects `PIPELINE['PIPELINE_ENABLED']` setting. + """ + if settings.PIPELINE['PIPELINE_ENABLED']: + return [settings.PIPELINE['STYLESHEETS'][group]['output_filename']] + else: + return settings.PIPELINE['STYLESHEETS'][group]['source_filenames'] + + +def get_js_dependencies(group): + """ + Returns list of JS dependencies belonging to `group` in settings.PIPELINE['JAVASCRIPT']. + + Respects `PIPELINE['PIPELINE_ENABLED']` setting. + """ + if settings.PIPELINE['PIPELINE_ENABLED']: + return [settings.PIPELINE['JAVASCRIPT'][group]['output_filename']] + else: + return settings.PIPELINE['JAVASCRIPT'][group]['source_filenames'] diff --git a/requirements/edx-sandbox/py38.txt b/requirements/edx-sandbox/py38.txt index 808482e7a3..8796451c62 100644 --- a/requirements/edx-sandbox/py38.txt +++ b/requirements/edx-sandbox/py38.txt @@ -14,7 +14,7 @@ click==8.1.3 # nltk codejail-includes==1.0.0 # via -r requirements/edx-sandbox/py38.in -cryptography==37.0.2 +cryptography==37.0.3 # via -r requirements/edx-sandbox/py38.in cycler==0.11.0 # via matplotlib diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index b464311d1d..b1647180e6 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -20,8 +20,6 @@ # via -r requirements/edx/local.in -e git+https://github.com/edx/RateXBlock.git@2.0.1#egg=rate-xblock # via -r requirements/edx/github.in --e openedx/core/lib/xblock_builtin/xblock_discussion - # via -r requirements/edx/local.in -e git+https://github.com/edx-solutions/xblock-google-drive.git@2d176468e33c0713c911b563f8f65f7cf232f5b6#egg=xblock-google-drive # via -r requirements/edx/github.in acid-xblock==0.2.1 @@ -578,7 +576,7 @@ future==0.18.2 # via # edx-celeryutils # pyjwkest -geoip2==4.5.0 +geoip2==4.6.0 # via -r requirements/edx/base.in glob2==0.7 # via -r requirements/edx/base.in @@ -1128,7 +1126,6 @@ xblock==1.6.1 # ora2 # rate-xblock # staff-graded-xblock - # xblock-discussion # xblock-drag-and-drop-v2 # xblock-google-drive # xblock-poll diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index e7ecfaa3b4..516c51f5aa 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -20,8 +20,6 @@ # via -r requirements/edx/testing.txt -e git+https://github.com/edx/RateXBlock.git@2.0.1#egg=rate-xblock # via -r requirements/edx/testing.txt --e openedx/core/lib/xblock_builtin/xblock_discussion - # via -r requirements/edx/testing.txt -e git+https://github.com/edx-solutions/xblock-google-drive.git@2d176468e33c0713c911b563f8f65f7cf232f5b6#egg=xblock-google-drive # via -r requirements/edx/testing.txt acid-xblock==0.2.1 @@ -727,7 +725,7 @@ future==0.18.2 # -r requirements/edx/testing.txt # edx-celeryutils # pyjwkest -geoip2==4.5.0 +geoip2==4.6.0 # via -r requirements/edx/testing.txt glob2==0.7 # via -r requirements/edx/testing.txt @@ -1607,7 +1605,6 @@ xblock==1.6.1 # ora2 # rate-xblock # staff-graded-xblock - # xblock-discussion # xblock-drag-and-drop-v2 # xblock-google-drive # xblock-poll diff --git a/requirements/edx/local.in b/requirements/edx/local.in index 2138207383..2e80f24af3 100644 --- a/requirements/edx/local.in +++ b/requirements/edx/local.in @@ -1,5 +1,3 @@ # Python libraries to install that are local to the edx-platform repo -e . -e common/lib/capa - --e openedx/core/lib/xblock_builtin/xblock_discussion diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index d0cb2b0797..532ede1351 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -20,8 +20,6 @@ # via -r requirements/edx/base.txt -e git+https://github.com/edx/RateXBlock.git@2.0.1#egg=rate-xblock # via -r requirements/edx/base.txt --e openedx/core/lib/xblock_builtin/xblock_discussion - # via -r requirements/edx/base.txt -e git+https://github.com/edx-solutions/xblock-google-drive.git@2d176468e33c0713c911b563f8f65f7cf232f5b6#egg=xblock-google-drive # via -r requirements/edx/base.txt acid-xblock==0.2.1 @@ -702,7 +700,7 @@ future==0.18.2 # -r requirements/edx/base.txt # edx-celeryutils # pyjwkest -geoip2==4.5.0 +geoip2==4.6.0 # via -r requirements/edx/base.txt glob2==0.7 # via -r requirements/edx/base.txt @@ -1488,7 +1486,6 @@ xblock==1.6.1 # ora2 # rate-xblock # staff-graded-xblock - # xblock-discussion # xblock-drag-and-drop-v2 # xblock-google-drive # xblock-poll diff --git a/setup.py b/setup.py index 48ffd5847a..c752ae7229 100644 --- a/setup.py +++ b/setup.py @@ -15,6 +15,7 @@ XBLOCKS = [ "customtag = xmodule.template_module:CustomTagBlock", "custom_tag_template = xmodule.template_module:CustomTagTemplateBlock", "discuss = xmodule.template_module:TranslateCustomTagBlock", + "discussion = xmodule.discussion_block:DiscussionXBlock", "error = xmodule.error_module:ErrorBlock", "hidden = xmodule.hidden_module:HiddenDescriptor", "html = xmodule.html_module:HtmlBlock", diff --git a/openedx/core/lib/xblock_builtin/xblock_discussion/xblock_discussion/__init__.py b/xmodule/discussion_block.py similarity index 97% rename from openedx/core/lib/xblock_builtin/xblock_discussion/xblock_discussion/__init__.py rename to xmodule/discussion_block.py index ae2f46d86d..25a6be2138 100644 --- a/openedx/core/lib/xblock_builtin/xblock_discussion/xblock_discussion/__init__.py +++ b/xmodule/discussion_block.py @@ -14,12 +14,10 @@ from xblock.core import XBlock from xblock.fields import UNIQUE_ID, Scope, String from xblockutils.resources import ResourceLoader from xblockutils.studio_editable import StudioEditableXBlockMixin -from xmodule.xml_module import XmlParserMixin -from lms.djangoapps.discussion.toggles import ENABLE_DISCUSSIONS_MFE -from openedx.core.djangoapps.discussions.url_helpers import get_discussions_mfe_topic_url from openedx.core.djangolib.markup import HTML, Text -from openedx.core.lib.xblock_builtin import get_css_dependencies, get_js_dependencies +from openedx.core.lib.xblock_utils import get_css_dependencies, get_js_dependencies +from xmodule.xml_module import XmlParserMixin log = logging.getLogger(__name__) loader = ResourceLoader(__name__) # pylint: disable=invalid-name diff --git a/openedx/core/lib/xblock_builtin/xblock_discussion/tests.py b/xmodule/tests/test_discussion.py similarity index 96% rename from openedx/core/lib/xblock_builtin/xblock_discussion/tests.py rename to xmodule/tests/test_discussion.py index 3e0b58b556..54e95e017e 100644 --- a/openedx/core/lib/xblock_builtin/xblock_discussion/tests.py +++ b/xmodule/tests/test_discussion.py @@ -5,16 +5,15 @@ import itertools import random import string from collections import namedtuple -from unittest import TestCase -from unittest import mock +from unittest import TestCase, 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.xblock_builtin.xblock_discussion.xblock_discussion import DiscussionXBlock from openedx.core.lib.safe_lxml import etree +from xmodule.discussion_block import DiscussionXBlock def attribute_pair_repr(self): @@ -59,7 +58,7 @@ class DiscussionXBlockImportExportTests(TestCase): """ Import and export tests """ - DISCUSSION_XBLOCK_LOCATION = "openedx.core.lib.xblock_builtin.xblock_discussion.xblock_discussion.DiscussionXBlock" + DISCUSSION_XBLOCK_LOCATION = "xmodule.discussion_block.DiscussionXBlock" def setUp(self): """