diff --git a/common/djangoapps/django_comment_common/models.py b/common/djangoapps/django_comment_common/models.py index 7d9d56aef4..5e761fa660 100644 --- a/common/djangoapps/django_comment_common/models.py +++ b/common/djangoapps/django_comment_common/models.py @@ -78,7 +78,7 @@ class Role(models.Model): course_id = CourseKeyField(max_length=255, blank=True, db_index=True) class Meta(object): - # use existing table that was originally created from django_comment_client app + # use existing table that was originally created from lms.djangoapps.discussion.django_comment_client app db_table = 'django_comment_client_role' def __unicode__(self): @@ -134,7 +134,7 @@ class Permission(models.Model): roles = models.ManyToManyField(Role, related_name="permissions") class Meta(object): - # use existing table that was originally created from django_comment_client app + # use existing table that was originally created from lms.djangoapps.discussion.django_comment_client app db_table = 'django_comment_client_permission' def __unicode__(self): diff --git a/lms/djangoapps/ccx/tests/test_views.py b/lms/djangoapps/ccx/tests/test_views.py index 877298b6b4..1d8e253e2c 100644 --- a/lms/djangoapps/ccx/tests/test_views.py +++ b/lms/djangoapps/ccx/tests/test_views.py @@ -23,7 +23,7 @@ from courseware.tabs import get_course_tab_list from courseware.tests.factories import StudentModuleFactory from courseware.tests.helpers import LoginEnrollmentTestCase from courseware.testutils import FieldOverrideTestMixin -from django_comment_client.utils import has_forum_access +from lms.djangoapps.discussion.django_comment_client.utils import has_forum_access from django_comment_common.models import FORUM_ROLE_ADMINISTRATOR from django_comment_common.utils import are_permissions_roles_seeded from edx_django_utils.cache import RequestCache diff --git a/lms/djangoapps/courseware/tests/test_discussion_xblock.py b/lms/djangoapps/courseware/tests/test_discussion_xblock.py index 69dad92cd6..3016d2b76a 100644 --- a/lms/djangoapps/courseware/tests/test_discussion_xblock.py +++ b/lms/djangoapps/courseware/tests/test_discussion_xblock.py @@ -213,7 +213,10 @@ class TestTemplates(TestDiscussionXBlock): Test for has_permission method. """ permission_canary = object() - with mock.patch('django_comment_client.permissions.has_permission', return_value=permission_canary) as has_perm: + with mock.patch( + 'lms.djangoapps.discussion.django_comment_client.permissions.has_permission', + return_value=permission_canary, + ) as has_perm: actual_permission = self.block.has_permission("test_permission") self.assertEqual(actual_permission, permission_canary) has_perm.assert_called_once_with(self.django_user_canary, 'test_permission', 'test_course') diff --git a/lms/djangoapps/discussion/README.rst b/lms/djangoapps/discussion/README.rst index 917b8e763b..fe28467f65 100644 --- a/lms/djangoapps/discussion/README.rst +++ b/lms/djangoapps/discussion/README.rst @@ -10,7 +10,6 @@ Discussions related functionality is scattered across a number of places and sho * ``common/djangoapps/django_comment_common`` * ``lms/djangoapps/discussion`` -* ``lms/djangoapps/django_comment_client`` * ``lms/djangoapps/notification_prefs`` * ``lms/djangoapps/notifier_api`` * ``openedx/core/lib/xblock_builtin/xblock_discussion`` diff --git a/lms/djangoapps/django_comment_client/README.rst b/lms/djangoapps/discussion/django_comment_client/README.rst similarity index 100% rename from lms/djangoapps/django_comment_client/README.rst rename to lms/djangoapps/discussion/django_comment_client/README.rst diff --git a/lms/djangoapps/django_comment_client/__init__.py b/lms/djangoapps/discussion/django_comment_client/__init__.py similarity index 100% rename from lms/djangoapps/django_comment_client/__init__.py rename to lms/djangoapps/discussion/django_comment_client/__init__.py diff --git a/lms/djangoapps/django_comment_client/base/__init__.py b/lms/djangoapps/discussion/django_comment_client/base/__init__.py similarity index 100% rename from lms/djangoapps/django_comment_client/base/__init__.py rename to lms/djangoapps/discussion/django_comment_client/base/__init__.py diff --git a/lms/djangoapps/django_comment_client/base/event_transformers.py b/lms/djangoapps/discussion/django_comment_client/base/event_transformers.py similarity index 94% rename from lms/djangoapps/django_comment_client/base/event_transformers.py rename to lms/djangoapps/discussion/django_comment_client/base/event_transformers.py index 1441ca9a7b..989d669706 100644 --- a/lms/djangoapps/django_comment_client/base/event_transformers.py +++ b/lms/djangoapps/discussion/django_comment_client/base/event_transformers.py @@ -8,9 +8,9 @@ from eventtracking.processors.exceptions import EventEmissionExit from opaque_keys import InvalidKeyError from opaque_keys.edx.locator import CourseLocator -from django_comment_client.base.views import add_truncated_title_to_event_data -from django_comment_client.permissions import get_team -from django_comment_client.utils import get_cached_discussion_id_map_by_course_id +from lms.djangoapps.discussion.django_comment_client.base.views import add_truncated_title_to_event_data +from lms.djangoapps.discussion.django_comment_client.permissions import get_team +from lms.djangoapps.discussion.django_comment_client.utils import get_cached_discussion_id_map_by_course_id from track.transformers import EventTransformer, EventTransformerRegistry from track.views.segmentio import ( BI_SCREEN_VIEWED_EVENT_NAME, diff --git a/lms/djangoapps/django_comment_client/base/tests.py b/lms/djangoapps/discussion/django_comment_client/base/tests.py similarity index 99% rename from lms/djangoapps/django_comment_client/base/tests.py rename to lms/djangoapps/discussion/django_comment_client/base/tests.py index ab1c3a5ca4..5d03e36448 100644 --- a/lms/djangoapps/django_comment_client/base/tests.py +++ b/lms/djangoapps/discussion/django_comment_client/base/tests.py @@ -18,14 +18,14 @@ from six import text_type from common.test.utils import MockSignalHandlerMixin, disable_signal from course_modes.models import CourseMode from course_modes.tests.factories import CourseModeFactory -from django_comment_client.base import views -from django_comment_client.tests.group_id import ( +from lms.djangoapps.discussion.django_comment_client.base import views +from lms.djangoapps.discussion.django_comment_client.tests.group_id import ( CohortedTopicGroupIdTestMixin, GroupIdAssertionMixin, NonCohortedTopicGroupIdTestMixin ) -from django_comment_client.tests.unicode import UnicodeTestMixin -from django_comment_client.tests.utils import CohortedTestCase, ForumsEnableMixin +from lms.djangoapps.discussion.django_comment_client.tests.unicode import UnicodeTestMixin +from lms.djangoapps.discussion.django_comment_client.tests.utils import CohortedTestCase, ForumsEnableMixin from django_comment_common.comment_client import Thread from django_comment_common.models import ( assign_role, @@ -641,7 +641,10 @@ class ViewsTestCase( with self.assert_discussion_signals('thread_edited'): self.update_thread_helper(mock_request) - @patch('django_comment_client.utils.get_discussion_categories_ids', return_value=["test_commentable"]) + @patch( + 'lms.djangoapps.discussion.django_comment_client.utils.get_discussion_categories_ids', + return_value=["test_commentable"], + ) def test_update_thread_wrong_commentable_id(self, mock_get_discussion_id_map, mock_request): self._test_request_error( "update_thread", @@ -1233,7 +1236,10 @@ class UpdateThreadUnicodeTestCase( cls.student = UserFactory.create() CourseEnrollmentFactory(user=cls.student, course_id=cls.course.id) - @patch('django_comment_client.utils.get_discussion_categories_ids', return_value=["test_commentable"]) + @patch( + 'lms.djangoapps.discussion.django_comment_client.utils.get_discussion_categories_ids', + return_value=["test_commentable"], + ) @patch('django_comment_common.comment_client.utils.requests.request', autospec=True) def _test_unicode_data(self, text, mock_request, mock_get_discussion_id_map): self._set_mock_request_data(mock_request, { diff --git a/lms/djangoapps/django_comment_client/base/urls.py b/lms/djangoapps/discussion/django_comment_client/base/urls.py similarity index 97% rename from lms/djangoapps/django_comment_client/base/urls.py rename to lms/djangoapps/discussion/django_comment_client/base/urls.py index 413a0cb8e2..e65be7a409 100644 --- a/lms/djangoapps/django_comment_client/base/urls.py +++ b/lms/djangoapps/discussion/django_comment_client/base/urls.py @@ -3,7 +3,7 @@ Base urls for the django_comment_client. """ from django.conf.urls import url -from django_comment_client.base import views +from lms.djangoapps.discussion.django_comment_client.base import views urlpatterns = [ url(r'^upload$', views.upload, name='upload'), diff --git a/lms/djangoapps/django_comment_client/base/views.py b/lms/djangoapps/discussion/django_comment_client/base/views.py similarity index 99% rename from lms/djangoapps/django_comment_client/base/views.py rename to lms/djangoapps/discussion/django_comment_client/base/views.py index 1998f614df..0a4c129b07 100644 --- a/lms/djangoapps/django_comment_client/base/views.py +++ b/lms/djangoapps/discussion/django_comment_client/base/views.py @@ -20,12 +20,12 @@ from django.views.decorators.http import require_GET, require_POST from opaque_keys.edx.keys import CourseKey from six import text_type -import django_comment_client.settings as cc_settings +import lms.djangoapps.discussion.django_comment_client.settings as cc_settings import django_comment_common.comment_client as cc from courseware.access import has_access from courseware.courses import get_course_by_id, get_course_overview_with_access, get_course_with_access -from django_comment_client.permissions import check_permissions_by_view, get_team, has_permission -from django_comment_client.utils import ( +from lms.djangoapps.discussion.django_comment_client.permissions import check_permissions_by_view, get_team, has_permission +from lms.djangoapps.discussion.django_comment_client.utils import ( JsonError, JsonResponse, add_courseware_context, diff --git a/lms/djangoapps/django_comment_client/constants.py b/lms/djangoapps/discussion/django_comment_client/constants.py similarity index 100% rename from lms/djangoapps/django_comment_client/constants.py rename to lms/djangoapps/discussion/django_comment_client/constants.py diff --git a/lms/djangoapps/django_comment_client/middleware.py b/lms/djangoapps/discussion/django_comment_client/middleware.py similarity index 92% rename from lms/djangoapps/django_comment_client/middleware.py rename to lms/djangoapps/discussion/django_comment_client/middleware.py index 8396d6652b..0fb344fdc8 100644 --- a/lms/djangoapps/django_comment_client/middleware.py +++ b/lms/djangoapps/discussion/django_comment_client/middleware.py @@ -3,7 +3,7 @@ import logging from six import text_type -from django_comment_client.utils import JsonError +from lms.djangoapps.discussion.django_comment_client.utils import JsonError from django_comment_common.comment_client import CommentClientRequestError log = logging.getLogger(__name__) diff --git a/lms/djangoapps/django_comment_client/management/__init__.py b/lms/djangoapps/discussion/django_comment_client/migrations/__init__.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/__init__.py rename to lms/djangoapps/discussion/django_comment_client/migrations/__init__.py diff --git a/lms/djangoapps/django_comment_client/models.py b/lms/djangoapps/discussion/django_comment_client/models.py similarity index 100% rename from lms/djangoapps/django_comment_client/models.py rename to lms/djangoapps/discussion/django_comment_client/models.py diff --git a/lms/djangoapps/django_comment_client/permissions.py b/lms/djangoapps/discussion/django_comment_client/permissions.py similarity index 100% rename from lms/djangoapps/django_comment_client/permissions.py rename to lms/djangoapps/discussion/django_comment_client/permissions.py diff --git a/lms/djangoapps/django_comment_client/settings.py b/lms/djangoapps/discussion/django_comment_client/settings.py similarity index 100% rename from lms/djangoapps/django_comment_client/settings.py rename to lms/djangoapps/discussion/django_comment_client/settings.py diff --git a/lms/djangoapps/django_comment_client/management/commands/__init__.py b/lms/djangoapps/discussion/django_comment_client/tests/__init__.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/commands/__init__.py rename to lms/djangoapps/discussion/django_comment_client/tests/__init__.py diff --git a/lms/djangoapps/django_comment_client/tests/factories.py b/lms/djangoapps/discussion/django_comment_client/tests/factories.py similarity index 100% rename from lms/djangoapps/django_comment_client/tests/factories.py rename to lms/djangoapps/discussion/django_comment_client/tests/factories.py diff --git a/lms/djangoapps/django_comment_client/tests/group_id.py b/lms/djangoapps/discussion/django_comment_client/tests/group_id.py similarity index 100% rename from lms/djangoapps/django_comment_client/tests/group_id.py rename to lms/djangoapps/discussion/django_comment_client/tests/group_id.py diff --git a/lms/djangoapps/django_comment_client/migrations/__init__.py b/lms/djangoapps/discussion/django_comment_client/tests/mock_cs_server/__init__.py similarity index 100% rename from lms/djangoapps/django_comment_client/migrations/__init__.py rename to lms/djangoapps/discussion/django_comment_client/tests/mock_cs_server/__init__.py diff --git a/lms/djangoapps/django_comment_client/tests/mock_cs_server/mock_cs_server.py b/lms/djangoapps/discussion/django_comment_client/tests/mock_cs_server/mock_cs_server.py similarity index 100% rename from lms/djangoapps/django_comment_client/tests/mock_cs_server/mock_cs_server.py rename to lms/djangoapps/discussion/django_comment_client/tests/mock_cs_server/mock_cs_server.py diff --git a/lms/djangoapps/django_comment_client/tests/mock_cs_server/test_mock_cs_server.py b/lms/djangoapps/discussion/django_comment_client/tests/mock_cs_server/test_mock_cs_server.py similarity index 94% rename from lms/djangoapps/django_comment_client/tests/mock_cs_server/test_mock_cs_server.py rename to lms/djangoapps/discussion/django_comment_client/tests/mock_cs_server/test_mock_cs_server.py index 11cdf5620d..fd4cf3bfd9 100644 --- a/lms/djangoapps/django_comment_client/tests/mock_cs_server/test_mock_cs_server.py +++ b/lms/djangoapps/discussion/django_comment_client/tests/mock_cs_server/test_mock_cs_server.py @@ -5,7 +5,7 @@ import urllib2 import pytest -from django_comment_client.tests.mock_cs_server.mock_cs_server import MockCommentServiceServer +from lms.djangoapps.discussion.django_comment_client.tests.mock_cs_server.mock_cs_server import MockCommentServiceServer class MockCommentServiceServerTest(unittest.TestCase): diff --git a/lms/djangoapps/django_comment_client/tests/test.mustache b/lms/djangoapps/discussion/django_comment_client/tests/test.mustache similarity index 100% rename from lms/djangoapps/django_comment_client/tests/test.mustache rename to lms/djangoapps/discussion/django_comment_client/tests/test.mustache diff --git a/lms/djangoapps/django_comment_client/tests/test_middleware.py b/lms/djangoapps/discussion/django_comment_client/tests/test_middleware.py similarity index 95% rename from lms/djangoapps/django_comment_client/tests/test_middleware.py rename to lms/djangoapps/discussion/django_comment_client/tests/test_middleware.py index e90756bf2f..75477cb9ec 100644 --- a/lms/djangoapps/django_comment_client/tests/test_middleware.py +++ b/lms/djangoapps/discussion/django_comment_client/tests/test_middleware.py @@ -4,7 +4,7 @@ import django.http from django.test import TestCase from six import text_type -import django_comment_client.middleware as middleware +import lms.djangoapps.discussion.django_comment_client.middleware as middleware import django_comment_common.comment_client diff --git a/lms/djangoapps/django_comment_client/tests/test_models.py b/lms/djangoapps/discussion/django_comment_client/tests/test_models.py similarity index 100% rename from lms/djangoapps/django_comment_client/tests/test_models.py rename to lms/djangoapps/discussion/django_comment_client/tests/test_models.py diff --git a/lms/djangoapps/django_comment_client/tests/test_utils.py b/lms/djangoapps/discussion/django_comment_client/tests/test_utils.py similarity index 98% rename from lms/djangoapps/django_comment_client/tests/test_utils.py rename to lms/djangoapps/discussion/django_comment_client/tests/test_utils.py index 9a59dad763..8df9ae8080 100644 --- a/lms/djangoapps/django_comment_client/tests/test_utils.py +++ b/lms/djangoapps/discussion/django_comment_client/tests/test_utils.py @@ -12,15 +12,15 @@ from mock import Mock, patch from pytz import UTC from six import text_type -import django_comment_client.utils as utils +import lms.djangoapps.discussion.django_comment_client.utils as utils from course_modes.models import CourseMode from course_modes.tests.factories import CourseModeFactory from courseware.tabs import get_course_tab_list from courseware.tests.factories import InstructorFactory -from django_comment_client.constants import TYPE_ENTRY, TYPE_SUBCATEGORY -from django_comment_client.tests.factories import RoleFactory -from django_comment_client.tests.unicode import UnicodeTestMixin -from django_comment_client.tests.utils import config_course_discussions, topic_name_to_id +from lms.djangoapps.discussion.django_comment_client.constants import TYPE_ENTRY, TYPE_SUBCATEGORY +from lms.djangoapps.discussion.django_comment_client.tests.factories import RoleFactory +from lms.djangoapps.discussion.django_comment_client.tests.unicode import UnicodeTestMixin +from lms.djangoapps.discussion.django_comment_client.tests.utils import config_course_discussions, topic_name_to_id from django_comment_common.comment_client.utils import CommentClientMaintenanceError, perform_request from django_comment_common.models import ( CourseDiscussionSettings, @@ -1592,7 +1592,9 @@ class PermissionsTestCase(ModuleStoreTestCase): user = mock.Mock() user.id = 1 - with mock.patch('django_comment_client.utils.check_permissions_by_view') as check_perm: + with mock.patch( + 'lms.djangoapps.discussion.django_comment_client.utils.check_permissions_by_view' + ) as check_perm: check_perm.return_value = True self.assertEqual(utils.get_ability(None, content, user), { 'editable': True, @@ -1620,7 +1622,9 @@ class PermissionsTestCase(ModuleStoreTestCase): """ content = {'user_id': '1', 'type': 'thread'} - with mock.patch('django_comment_client.utils.check_permissions_by_view') as check_perm: + with mock.patch( + 'lms.djangoapps.discussion.django_comment_client.utils.check_permissions_by_view' + ) as check_perm: # check_permissions_by_view returns false because user is not enrolled in the course. check_perm.return_value = False global_staff = UserFactory(username='global_staff', email='global_staff@edx.org', is_staff=True) @@ -1721,7 +1725,10 @@ class GroupModeratorPermissionsTestCase(ModuleStoreTestCase): # Give group moderator permissions to group_moderator assign_role(self.course.id, self.group_moderator, 'Group Moderator') - @mock.patch('django_comment_client.permissions._check_condition', side_effect=_check_condition) + @mock.patch( + 'lms.djangoapps.discussion.django_comment_client.permissions._check_condition', + side_effect=_check_condition, + ) def test_not_divided(self, check_condition_function): """ Group moderator should not have moderator permissions if the discussions are not divided. @@ -1754,7 +1761,10 @@ class GroupModeratorPermissionsTestCase(ModuleStoreTestCase): 'can_report': True }) - @mock.patch('django_comment_client.permissions._check_condition', side_effect=_check_condition) + @mock.patch( + 'lms.djangoapps.discussion.django_comment_client.permissions._check_condition', + side_effect=_check_condition, + ) def test_divided_within_group(self, check_condition_function): """ Group moderator should have moderator permissions within their group if the discussions are divided. @@ -1783,7 +1793,10 @@ class GroupModeratorPermissionsTestCase(ModuleStoreTestCase): 'can_report': True }) - @mock.patch('django_comment_client.permissions._check_condition', side_effect=_check_condition) + @mock.patch( + 'lms.djangoapps.discussion.django_comment_client.permissions._check_condition', + side_effect=_check_condition, + ) def test_divided_outside_group(self, check_condition_function): """ Group moderator should not have moderator permissions outside of their group. diff --git a/lms/djangoapps/django_comment_client/tests/unicode.py b/lms/djangoapps/discussion/django_comment_client/tests/unicode.py similarity index 100% rename from lms/djangoapps/django_comment_client/tests/unicode.py rename to lms/djangoapps/discussion/django_comment_client/tests/unicode.py diff --git a/lms/djangoapps/django_comment_client/tests/utils.py b/lms/djangoapps/discussion/django_comment_client/tests/utils.py similarity index 100% rename from lms/djangoapps/django_comment_client/tests/utils.py rename to lms/djangoapps/discussion/django_comment_client/tests/utils.py diff --git a/lms/djangoapps/django_comment_client/urls.py b/lms/djangoapps/discussion/django_comment_client/urls.py similarity index 55% rename from lms/djangoapps/django_comment_client/urls.py rename to lms/djangoapps/discussion/django_comment_client/urls.py index 71326ba227..f51def9cc0 100644 --- a/lms/djangoapps/django_comment_client/urls.py +++ b/lms/djangoapps/discussion/django_comment_client/urls.py @@ -4,5 +4,5 @@ Urls for the django_comment_client. from django.conf.urls import include, url urlpatterns = [ - url(r'', include('django_comment_client.base.urls')), + url(r'', include('lms.djangoapps.discussion.django_comment_client.base.urls')), ] diff --git a/lms/djangoapps/django_comment_client/utils.py b/lms/djangoapps/discussion/django_comment_client/utils.py similarity index 99% rename from lms/djangoapps/django_comment_client/utils.py rename to lms/djangoapps/discussion/django_comment_client/utils.py index ff6fb75e6e..0afd062c2f 100644 --- a/lms/djangoapps/django_comment_client/utils.py +++ b/lms/djangoapps/discussion/django_comment_client/utils.py @@ -15,9 +15,9 @@ from six import text_type from courseware import courses from courseware.access import has_access -from django_comment_client.constants import TYPE_ENTRY, TYPE_SUBCATEGORY -from django_comment_client.permissions import check_permissions_by_view, get_team, has_permission -from django_comment_client.settings import MAX_COMMENT_DEPTH +from lms.djangoapps.discussion.django_comment_client.constants import TYPE_ENTRY, TYPE_SUBCATEGORY +from lms.djangoapps.discussion.django_comment_client.permissions import check_permissions_by_view, get_team, has_permission +from lms.djangoapps.discussion.django_comment_client.settings import MAX_COMMENT_DEPTH from django_comment_common.models import ( FORUM_ROLE_STUDENT, FORUM_ROLE_COMMUNITY_TA, diff --git a/lms/djangoapps/django_comment_client/tests/__init__.py b/lms/djangoapps/discussion/management/__init__.py similarity index 100% rename from lms/djangoapps/django_comment_client/tests/__init__.py rename to lms/djangoapps/discussion/management/__init__.py diff --git a/lms/djangoapps/django_comment_client/tests/mock_cs_server/__init__.py b/lms/djangoapps/discussion/management/commands/__init__.py similarity index 100% rename from lms/djangoapps/django_comment_client/tests/mock_cs_server/__init__.py rename to lms/djangoapps/discussion/management/commands/__init__.py diff --git a/lms/djangoapps/django_comment_client/management/commands/assign_role.py b/lms/djangoapps/discussion/management/commands/assign_role.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/commands/assign_role.py rename to lms/djangoapps/discussion/management/commands/assign_role.py diff --git a/lms/djangoapps/django_comment_client/management/commands/assign_roles_for_course.py b/lms/djangoapps/discussion/management/commands/assign_roles_for_course.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/commands/assign_roles_for_course.py rename to lms/djangoapps/discussion/management/commands/assign_roles_for_course.py diff --git a/lms/djangoapps/django_comment_client/management/commands/create_roles_for_existing.py b/lms/djangoapps/discussion/management/commands/create_roles_for_existing.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/commands/create_roles_for_existing.py rename to lms/djangoapps/discussion/management/commands/create_roles_for_existing.py diff --git a/lms/djangoapps/django_comment_client/management/commands/get_discussion_link.py b/lms/djangoapps/discussion/management/commands/get_discussion_link.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/commands/get_discussion_link.py rename to lms/djangoapps/discussion/management/commands/get_discussion_link.py diff --git a/lms/djangoapps/django_comment_client/management/commands/reload_forum_users.py b/lms/djangoapps/discussion/management/commands/reload_forum_users.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/commands/reload_forum_users.py rename to lms/djangoapps/discussion/management/commands/reload_forum_users.py diff --git a/lms/djangoapps/django_comment_client/management/commands/seed_permissions_roles.py b/lms/djangoapps/discussion/management/commands/seed_permissions_roles.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/commands/seed_permissions_roles.py rename to lms/djangoapps/discussion/management/commands/seed_permissions_roles.py diff --git a/lms/djangoapps/django_comment_client/management/commands/show_permissions.py b/lms/djangoapps/discussion/management/commands/show_permissions.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/commands/show_permissions.py rename to lms/djangoapps/discussion/management/commands/show_permissions.py diff --git a/lms/djangoapps/django_comment_client/management/commands/sync_user_info.py b/lms/djangoapps/discussion/management/commands/sync_user_info.py similarity index 100% rename from lms/djangoapps/django_comment_client/management/commands/sync_user_info.py rename to lms/djangoapps/discussion/management/commands/sync_user_info.py diff --git a/lms/djangoapps/discussion/plugins.py b/lms/djangoapps/discussion/plugins.py index 822b2c4431..82c220b559 100644 --- a/lms/djangoapps/discussion/plugins.py +++ b/lms/djangoapps/discussion/plugins.py @@ -5,7 +5,7 @@ Views handling read (GET) requests for the Discussion tab and inline discussions from django.conf import settings from django.utils.translation import ugettext_noop -import django_comment_client.utils as utils +import lms.djangoapps.discussion.django_comment_client.utils as utils from courseware.tabs import EnrolledTab from xmodule.tabs import TabFragmentViewMixin diff --git a/lms/djangoapps/discussion/rest_api/api.py b/lms/djangoapps/discussion/rest_api/api.py index 78d60617dc..4f4f4a8e65 100644 --- a/lms/djangoapps/discussion/rest_api/api.py +++ b/lms/djangoapps/discussion/rest_api/api.py @@ -24,8 +24,8 @@ from lms.djangoapps.discussion.rest_api.permissions import ( get_initializable_thread_fields ) from lms.djangoapps.discussion.rest_api.serializers import CommentSerializer, DiscussionTopicSerializer, ThreadSerializer, get_context -from django_comment_client.base.views import track_comment_created_event, track_thread_created_event, track_voted_event -from django_comment_client.utils import get_accessible_discussion_xblocks, get_group_id_for_user, is_commentable_divided +from lms.djangoapps.discussion.django_comment_client.base.views import track_comment_created_event, track_thread_created_event, track_voted_event +from lms.djangoapps.discussion.django_comment_client.utils import get_accessible_discussion_xblocks, get_group_id_for_user, is_commentable_divided from django_comment_common.comment_client.comment import Comment from django_comment_common.comment_client.thread import Thread from django_comment_common.comment_client.utils import CommentClientRequestError diff --git a/lms/djangoapps/discussion/rest_api/serializers.py b/lms/djangoapps/discussion/rest_api/serializers.py index abb939f34a..96d6f4ee57 100644 --- a/lms/djangoapps/discussion/rest_api/serializers.py +++ b/lms/djangoapps/discussion/rest_api/serializers.py @@ -12,7 +12,7 @@ from rest_framework import serializers from discussion.views import get_divided_discussions from lms.djangoapps.discussion.rest_api.permissions import NON_UPDATABLE_COMMENT_FIELDS, NON_UPDATABLE_THREAD_FIELDS, get_editable_fields from lms.djangoapps.discussion.rest_api.render import render_body -from django_comment_client.utils import is_comment_too_deep, get_group_id_for_user, get_group_name +from lms.djangoapps.discussion.django_comment_client.utils import is_comment_too_deep, get_group_id_for_user, get_group_name from django_comment_common.models import ( FORUM_ROLE_ADMINISTRATOR, FORUM_ROLE_COMMUNITY_TA, diff --git a/lms/djangoapps/discussion/rest_api/tests/test_api.py b/lms/djangoapps/discussion/rest_api/tests/test_api.py index 24f9e5a5bf..2a974a661c 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_api.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_api.py @@ -38,7 +38,7 @@ from lms.djangoapps.discussion.rest_api.tests.utils import ( make_minimal_cs_thread, make_paginated_api_response ) -from django_comment_client.tests.utils import ForumsEnableMixin +from lms.djangoapps.discussion.django_comment_client.tests.utils import ForumsEnableMixin from django_comment_common.models import ( FORUM_ROLE_ADMINISTRATOR, FORUM_ROLE_COMMUNITY_TA, diff --git a/lms/djangoapps/discussion/rest_api/tests/test_serializers.py b/lms/djangoapps/discussion/rest_api/tests/test_serializers.py index 6776d72129..aab26b6a08 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_serializers.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_serializers.py @@ -11,7 +11,7 @@ from django.test.client import RequestFactory from lms.djangoapps.discussion.rest_api.serializers import CommentSerializer, ThreadSerializer, get_context from lms.djangoapps.discussion.rest_api.tests.utils import CommentsServiceMockMixin, make_minimal_cs_comment, make_minimal_cs_thread -from django_comment_client.tests.utils import ForumsEnableMixin +from lms.djangoapps.discussion.django_comment_client.tests.utils import ForumsEnableMixin from django_comment_common.comment_client.comment import Comment from django_comment_common.comment_client.thread import Thread from django_comment_common.models import ( diff --git a/lms/djangoapps/discussion/rest_api/tests/test_views.py b/lms/djangoapps/discussion/rest_api/tests/test_views.py index 95bddf86f7..eb6de94a82 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_views.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_views.py @@ -29,7 +29,7 @@ from lms.djangoapps.discussion.rest_api.tests.utils import ( make_minimal_cs_thread, make_paginated_api_response ) -from django_comment_client.tests.utils import ForumsEnableMixin, config_course_discussions, topic_name_to_id +from lms.djangoapps.discussion.django_comment_client.tests.utils import ForumsEnableMixin, config_course_discussions, topic_name_to_id from django_comment_common.models import CourseDiscussionSettings, Role from django_comment_common.utils import seed_permissions_roles from openedx.core.djangoapps.course_groups.tests.helpers import config_course_cohorts diff --git a/lms/djangoapps/discussion/rest_api/views.py b/lms/djangoapps/discussion/rest_api/views.py index 2425ffb226..416aba79d9 100644 --- a/lms/djangoapps/discussion/rest_api/views.py +++ b/lms/djangoapps/discussion/rest_api/views.py @@ -17,7 +17,7 @@ from rest_framework.views import APIView from rest_framework.viewsets import ViewSet from six import text_type -from django_comment_client.utils import available_division_schemes +from lms.djangoapps.discussion.django_comment_client.utils import available_division_schemes from django_comment_common import comment_client from django_comment_common.models import Role from django_comment_common.utils import get_course_discussion_settings, set_course_discussion_settings diff --git a/lms/djangoapps/discussion/templates/discussion/discussion_board_fragment.html b/lms/djangoapps/discussion/templates/discussion/discussion_board_fragment.html index 824d0c5bb5..a79b6ab336 100644 --- a/lms/djangoapps/discussion/templates/discussion/discussion_board_fragment.html +++ b/lms/djangoapps/discussion/templates/discussion/discussion_board_fragment.html @@ -10,7 +10,7 @@ from django.utils.translation import ugettext as _ from django.template.defaultfilters import escapejs from django.urls import reverse -from django_comment_client.permissions import has_permission +from lms.djangoapps.discussion.django_comment_client.permissions import has_permission from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_string from openedx.core.djangolib.markup import HTML %> diff --git a/lms/djangoapps/discussion/templates/discussion/discussion_profile_page.html b/lms/djangoapps/discussion/templates/discussion/discussion_profile_page.html index e28b32599f..ca3bdf9059 100644 --- a/lms/djangoapps/discussion/templates/discussion/discussion_profile_page.html +++ b/lms/djangoapps/discussion/templates/discussion/discussion_profile_page.html @@ -10,7 +10,7 @@ from django.utils.translation import ugettext as _, ungettext from django.template.defaultfilters import escapejs from django.urls import reverse -from django_comment_client.permissions import has_permission +from lms.djangoapps.discussion.django_comment_client.permissions import has_permission from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_string %> diff --git a/lms/djangoapps/discussion/tests/test_views.py b/lms/djangoapps/discussion/tests/test_views.py index 40b44fd2cd..1538a46401 100644 --- a/lms/djangoapps/discussion/tests/test_views.py +++ b/lms/djangoapps/discussion/tests/test_views.py @@ -14,21 +14,21 @@ from six import text_type from course_modes.models import CourseMode from course_modes.tests.factories import CourseModeFactory -from django_comment_client.constants import TYPE_ENTRY, TYPE_SUBCATEGORY -from django_comment_client.permissions import get_team -from django_comment_client.tests.group_id import ( +from lms.djangoapps.discussion.django_comment_client.constants import TYPE_ENTRY, TYPE_SUBCATEGORY +from lms.djangoapps.discussion.django_comment_client.permissions import get_team +from lms.djangoapps.discussion.django_comment_client.tests.group_id import ( CohortedTopicGroupIdTestMixin, GroupIdAssertionMixin, NonCohortedTopicGroupIdTestMixin ) -from django_comment_client.tests.unicode import UnicodeTestMixin -from django_comment_client.tests.utils import ( +from lms.djangoapps.discussion.django_comment_client.tests.unicode import UnicodeTestMixin +from lms.djangoapps.discussion.django_comment_client.tests.utils import ( CohortedTestCase, ForumsEnableMixin, config_course_discussions, topic_name_to_id ) -from django_comment_client.utils import strip_none +from lms.djangoapps.discussion.django_comment_client.utils import strip_none from django_comment_common.comment_client.utils import CommentClientPaginatedResult from django_comment_common.models import ( CourseDiscussionSettings, diff --git a/lms/djangoapps/discussion/views.py b/lms/djangoapps/discussion/views.py index 943d856e73..4d5eaad55c 100644 --- a/lms/djangoapps/discussion/views.py +++ b/lms/djangoapps/discussion/views.py @@ -23,16 +23,16 @@ from opaque_keys.edx.keys import CourseKey from rest_framework import status from web_fragments.fragment import Fragment -import django_comment_client.utils as utils +import lms.djangoapps.discussion.django_comment_client.utils as utils import django_comment_common.comment_client as cc from lms.djangoapps.experiments.utils import get_experiment_user_metadata_context from courseware.access import has_access from courseware.courses import get_course_with_access from courseware.views.views import CourseTabView -from django_comment_client.base.views import track_thread_viewed_event -from django_comment_client.constants import TYPE_ENTRY -from django_comment_client.permissions import get_team, has_permission -from django_comment_client.utils import ( +from lms.djangoapps.discussion.django_comment_client.base.views import track_thread_viewed_event +from lms.djangoapps.discussion.django_comment_client.constants import TYPE_ENTRY +from lms.djangoapps.discussion.django_comment_client.permissions import get_team, has_permission +from lms.djangoapps.discussion.django_comment_client.utils import ( add_courseware_context, available_division_schemes, course_discussion_division_enabled, diff --git a/lms/djangoapps/instructor/views/api.py b/lms/djangoapps/instructor/views/api.py index ed15969739..c462bd9300 100644 --- a/lms/djangoapps/instructor/views/api.py +++ b/lms/djangoapps/instructor/views/api.py @@ -48,7 +48,7 @@ from bulk_email.models import BulkEmailFlag, CourseEmail from courseware.access import has_access from courseware.courses import get_course_by_id, get_course_with_access from courseware.models import StudentModule -from django_comment_client.utils import ( +from lms.djangoapps.discussion.django_comment_client.utils import ( get_course_discussion_settings, get_group_id_for_user, get_group_name, diff --git a/lms/djangoapps/instructor/views/instructor_dashboard.py b/lms/djangoapps/instructor/views/instructor_dashboard.py index fd28558de1..c1f1b12239 100644 --- a/lms/djangoapps/instructor/views/instructor_dashboard.py +++ b/lms/djangoapps/instructor/views/instructor_dashboard.py @@ -30,7 +30,7 @@ from class_dashboard.dashboard_data import get_array_section_has_problem, get_se from course_modes.models import CourseMode, CourseModesArchive from courseware.access import has_access from courseware.courses import get_course_by_id, get_studio_url -from django_comment_client.utils import available_division_schemes, has_forum_access +from lms.djangoapps.discussion.django_comment_client.utils import available_division_schemes, has_forum_access from django_comment_common.models import FORUM_ROLE_ADMINISTRATOR, CourseDiscussionSettings from edxmako.shortcuts import render_to_response from edx_when.api import is_enabled_for_course diff --git a/lms/djangoapps/teams/models.py b/lms/djangoapps/teams/models.py index 3af021b6be..43dcaf5174 100644 --- a/lms/djangoapps/teams/models.py +++ b/lms/djangoapps/teams/models.py @@ -82,7 +82,7 @@ def comment_endorsed_handler(sender, **kwargs): # pylint: disable=unused-argume def handle_activity(user, post, original_author_id=None): """ - Handle user activity from django_comment_client and discussion.rest_api + Handle user activity from lms.djangoapps.discussion.django_comment_client and discussion.rest_api and update the user's last activity date. Checks if the user who performed the action is the original author, and that the discussion has the team context. diff --git a/lms/djangoapps/teams/views.py b/lms/djangoapps/teams/views.py index 5a392ec739..c03eb76d83 100644 --- a/lms/djangoapps/teams/views.py +++ b/lms/djangoapps/teams/views.py @@ -22,7 +22,7 @@ from rest_framework.views import APIView from rest_framework_oauth.authentication import OAuth2Authentication from courseware.courses import get_course_with_access, has_access -from django_comment_client.utils import has_discussion_privileges +from lms.djangoapps.discussion.django_comment_client.utils import has_discussion_privileges from lms.djangoapps.teams.models import CourseTeam, CourseTeamMembership from edx_rest_framework_extensions.paginators import DefaultPagination, paginate_search_results from openedx.core.lib.api.parsers import MergePatchParser diff --git a/lms/envs/common.py b/lms/envs/common.py index ef6a523938..ee87999171 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -1242,7 +1242,7 @@ MIDDLEWARE_CLASSES = [ 'mobile_api.middleware.AppVersionUpgrade', 'openedx.core.djangoapps.header_control.middleware.HeaderControlMiddleware', 'microsite_configuration.middleware.MicrositeMiddleware', - 'django_comment_client.middleware.AjaxExceptionMiddleware', + 'lms.djangoapps.discussion.django_comment_client.middleware.AjaxExceptionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.sites.middleware.CurrentSiteMiddleware', 'edx_rest_framework_extensions.auth.jwt.middleware.JwtAuthCookieMiddleware', @@ -1291,7 +1291,7 @@ MIDDLEWARE_CLASSES = [ # Must be after DarkLangMiddleware. 'django.middleware.locale.LocaleMiddleware', - 'django_comment_client.utils.ViewNameMiddleware', + 'lms.djangoapps.discussion.django_comment_client.utils.ViewNameMiddleware', 'codejail.django_integration.ConfigureCodeJailMiddleware', # catches any uncaught RateLimitExceptions and returns a 403 instead of a 500 @@ -2123,7 +2123,6 @@ INSTALLED_APPS = [ 'openedx.core.djangoapps.util.apps.UtilConfig', # Discussion forums - 'django_comment_client', 'django_comment_common', # Notes diff --git a/lms/envs/devstack.py b/lms/envs/devstack.py index 9e523eed7d..e7f737a4ae 100644 --- a/lms/envs/devstack.py +++ b/lms/envs/devstack.py @@ -36,7 +36,7 @@ import logging LOG_OVERRIDES = [ ('track.contexts', logging.CRITICAL), ('track.middleware', logging.CRITICAL), - ('django_comment_client.utils', logging.CRITICAL), + ('lms.djangoapps.discussion.django_comment_client.utils', logging.CRITICAL), ] for log_name, log_level in LOG_OVERRIDES: logging.getLogger(log_name).setLevel(log_level) @@ -60,7 +60,7 @@ DJFS = { INSTALLED_APPS += ['debug_toolbar', 'debug_toolbar_mongo'] MIDDLEWARE_CLASSES += [ - 'django_comment_client.utils.QueryCountDebugMiddleware', + 'lms.djangoapps.discussion.django_comment_client.utils.QueryCountDebugMiddleware', 'debug_toolbar.middleware.DebugToolbarMiddleware', ] diff --git a/lms/urls.py b/lms/urls.py index 991b0df787..de454a14aa 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -710,7 +710,7 @@ if settings.FEATURES.get('ENABLE_DISCUSSION_SERVICE'): r'^courses/{}/discussion/'.format( settings.COURSE_ID_PATTERN, ), - include('django_comment_client.urls') + include('lms.djangoapps.discussion.django_comment_client.urls') ), url( r'^notification_prefs/enable/', diff --git a/openedx/core/djangoapps/content/course_overviews/models.py b/openedx/core/djangoapps/content/course_overviews/models.py index 96f2334302..722f665588 100644 --- a/openedx/core/djangoapps/content/course_overviews/models.py +++ b/openedx/core/djangoapps/content/course_overviews/models.py @@ -17,7 +17,7 @@ from opaque_keys.edx.django.models import CourseKeyField, UsageKeyField from six import text_type from config_models.models import ConfigurationModel -from lms.djangoapps import django_comment_client +from lms.djangoapps.discussion import django_comment_client from openedx.core.djangoapps.catalog.models import CatalogIntegration from openedx.core.djangoapps.lang_pref.api import get_closest_released_language from openedx.core.djangoapps.models.course_details import CourseDetails diff --git a/openedx/core/lib/xblock_builtin/xblock_discussion/xblock_discussion/__init__.py b/openedx/core/lib/xblock_builtin/xblock_discussion/xblock_discussion/__init__.py index 9cd4e0502e..c15952dc4b 100644 --- a/openedx/core/lib/xblock_builtin/xblock_discussion/xblock_discussion/__init__.py +++ b/openedx/core/lib/xblock_builtin/xblock_discussion/xblock_discussion/__init__.py @@ -161,7 +161,7 @@ class DiscussionXBlock(XBlock, StudioEditableXBlockMixin, XmlParserMixin): :rtype: bool """ # normal import causes the xmodule_assets command to fail due to circular import - hence importing locally - from django_comment_client.permissions import has_permission + from lms.djangoapps.discussion.django_comment_client.permissions import has_permission return has_permission(self.django_user, permission, self.course_key) diff --git a/openedx/features/content_type_gating/tests/test_access.py b/openedx/features/content_type_gating/tests/test_access.py index 1e0afac189..b7895d2013 100644 --- a/openedx/features/content_type_gating/tests/test_access.py +++ b/openedx/features/content_type_gating/tests/test_access.py @@ -19,7 +19,7 @@ from django_comment_common.models import ( FORUM_ROLE_COMMUNITY_TA, Role ) -from django_comment_client.tests.factories import RoleFactory +from lms.djangoapps.discussion.django_comment_client.tests.factories import RoleFactory from course_modes.tests.factories import CourseModeFactory from experiments.models import ExperimentData, ExperimentKeyValue from xmodule.partitions.partitions import ENROLLMENT_TRACK_PARTITION_ID diff --git a/openedx/features/course_bookmarks/templates/course_bookmarks/course-bookmarks.html b/openedx/features/course_bookmarks/templates/course_bookmarks/course-bookmarks.html index 25248dd629..6724e2f44b 100644 --- a/openedx/features/course_bookmarks/templates/course_bookmarks/course-bookmarks.html +++ b/openedx/features/course_bookmarks/templates/course_bookmarks/course-bookmarks.html @@ -15,7 +15,7 @@ import json from django.utils.translation import ugettext as _ from django.template.defaultfilters import escapejs -from django_comment_client.permissions import has_permission +from lms.djangoapps.discussion.django_comment_client.permissions import has_permission from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_string from openedx.core.djangolib.markup import HTML from openedx.features.course_experience import course_home_page_title diff --git a/openedx/features/course_duration_limits/tests/test_course_expiration.py b/openedx/features/course_duration_limits/tests/test_course_expiration.py index fb957ab697..44925d796f 100644 --- a/openedx/features/course_duration_limits/tests/test_course_expiration.py +++ b/openedx/features/course_duration_limits/tests/test_course_expiration.py @@ -11,7 +11,7 @@ import ddt import mock from course_modes.models import CourseMode -from django_comment_client.tests.factories import RoleFactory +from lms.djangoapps.discussion.django_comment_client.tests.factories import RoleFactory from django_comment_common.models import ( FORUM_ROLE_ADMINISTRATOR, FORUM_ROLE_MODERATOR, diff --git a/openedx/features/course_experience/templates/course_experience/course-home-fragment.html b/openedx/features/course_experience/templates/course_experience/course-home-fragment.html index 4512cf6cb1..5752bba969 100644 --- a/openedx/features/course_experience/templates/course_experience/course-home-fragment.html +++ b/openedx/features/course_experience/templates/course_experience/course-home-fragment.html @@ -11,7 +11,7 @@ from django.utils.translation import ugettext as _ from django.template.defaultfilters import escapejs from django.urls import reverse -from django_comment_client.permissions import has_permission +from lms.djangoapps.discussion.django_comment_client.permissions import has_permission from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_string from openedx.core.djangolib.markup import HTML from openedx.features.course_experience import UNIFIED_COURSE_TAB_FLAG, SHOW_REVIEWS_TOOL_FLAG diff --git a/openedx/features/course_experience/tests/views/test_course_home.py b/openedx/features/course_experience/tests/views/test_course_home.py index 639b6756de..bcef93c4fc 100644 --- a/openedx/features/course_experience/tests/views/test_course_home.py +++ b/openedx/features/course_experience/tests/views/test_course_home.py @@ -21,14 +21,6 @@ from waffle.testutils import override_flag from course_modes.models import CourseMode from course_modes.tests.factories import CourseModeFactory from courseware.tests.helpers import get_expiration_banner_text - -from django_comment_client.tests.factories import RoleFactory -from django_comment_common.models import ( - FORUM_ROLE_ADMINISTRATOR, - FORUM_ROLE_COMMUNITY_TA, - FORUM_ROLE_GROUP_MODERATOR, - FORUM_ROLE_MODERATOR -) from experiments.models import ExperimentData from lms.djangoapps.commerce.models import CommerceConfiguration from lms.djangoapps.commerce.utils import EcommerceService @@ -41,8 +33,15 @@ from lms.djangoapps.courseware.tests.factories import ( OrgStaffFactory, StaffFactory ) +from lms.djangoapps.discussion.django_comment_client.tests.factories import RoleFactory from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from openedx.core.djangoapps.dark_lang.models import DarkLangConfig +from openedx.core.djangoapps.django_comment_common.models import ( + FORUM_ROLE_ADMINISTRATOR, + FORUM_ROLE_COMMUNITY_TA, + FORUM_ROLE_GROUP_MODERATOR, + FORUM_ROLE_MODERATOR +) from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory from openedx.core.djangoapps.waffle_utils.testutils import WAFFLE_TABLES, override_waffle_flag from openedx.features.course_duration_limits.config import EXPERIMENT_DATA_HOLDBACK_KEY, EXPERIMENT_ID diff --git a/openedx/features/course_search/templates/course_search/course-search-fragment.html b/openedx/features/course_search/templates/course_search/course-search-fragment.html index 4a2bc45745..41cba6cc63 100644 --- a/openedx/features/course_search/templates/course_search/course-search-fragment.html +++ b/openedx/features/course_search/templates/course_search/course-search-fragment.html @@ -12,7 +12,7 @@ from django.utils.translation import ugettext as _ from django.template.defaultfilters import escapejs from django.urls import reverse -from django_comment_client.permissions import has_permission +from lms.djangoapps.discussion.django_comment_client.permissions import has_permission from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_string from openedx.core.djangolib.markup import HTML from openedx.features.course_experience import course_home_page_title