diff --git a/common/lib/xmodule/xmodule/lti_2_util.py b/common/lib/xmodule/xmodule/lti_2_util.py index 82fcc424f8..17dfe680c0 100644 --- a/common/lib/xmodule/xmodule/lti_2_util.py +++ b/common/lib/xmodule/xmodule/lti_2_util.py @@ -78,7 +78,7 @@ class LTI20BlockMixin: except LTIError: return Response(status=401) # Unauthorized in this case. 401 is right - real_user = self.system.get_real_user(anon_id) + real_user = self.system.service(self, 'user').get_user_by_anonymous_id(anon_id) if not real_user: # that means we can't save to database, as we do not have real user id. msg = f"[LTI]: Real user not found against anon_id: {anon_id}" log.info(msg) diff --git a/common/lib/xmodule/xmodule/lti_module.py b/common/lib/xmodule/xmodule/lti_module.py index 29acd2b155..ce17fb0f11 100644 --- a/common/lib/xmodule/xmodule/lti_module.py +++ b/common/lib/xmodule/xmodule/lti_module.py @@ -78,7 +78,10 @@ from xmodule.mako_module import MakoTemplateBlockBase from openedx.core.djangolib.markup import HTML, Text from xmodule.editing_module import EditingMixin -from common.djangoapps.xblock_django.constants import ATTR_KEY_ANONYMOUS_USER_ID +from common.djangoapps.xblock_django.constants import ( + ATTR_KEY_ANONYMOUS_USER_ID, + ATTR_KEY_USER_ROLE, +) from xmodule.lti_2_util import LTI20BlockMixin, LTIError from xmodule.raw_module import EmptyDataRawMixin from xmodule.util.xmodule_django import add_webpack_to_fragment @@ -626,7 +629,8 @@ class LTIBlock( 'staff': 'Administrator', 'instructor': 'Instructor', } - return roles.get(self.system.get_user_role(), 'Student') + user_role = self.runtime.service(self, 'user').get_current_user().opt_attrs.get(ATTR_KEY_USER_ROLE) + return roles.get(user_role, 'Student') def get_icon_class(self): """ Returns the icon class """ @@ -676,17 +680,15 @@ class LTIBlock( # Username and email can't be sent in studio mode, because the user object is not defined. # To test functionality test in LMS - if callable(self.runtime.get_real_user): - user_id = self.runtime.service(self, 'user').get_current_user().opt_attrs.get(ATTR_KEY_ANONYMOUS_USER_ID) - real_user_object = self.runtime.get_real_user(user_id) - try: - self.user_email = real_user_object.email # lint-amnesty, pylint: disable=attribute-defined-outside-init - except AttributeError: - self.user_email = "" # lint-amnesty, pylint: disable=attribute-defined-outside-init - try: - self.user_username = real_user_object.username # lint-amnesty, pylint: disable=attribute-defined-outside-init - except AttributeError: - self.user_username = "" # lint-amnesty, pylint: disable=attribute-defined-outside-init + real_user_object = self.runtime.service(self, 'user').get_user_by_anonymous_id() + try: + self.user_email = real_user_object.email # lint-amnesty, pylint: disable=attribute-defined-outside-init + except AttributeError: + self.user_email = "" # lint-amnesty, pylint: disable=attribute-defined-outside-init + try: + self.user_username = real_user_object.username # lint-amnesty, pylint: disable=attribute-defined-outside-init + except AttributeError: + self.user_username = "" # lint-amnesty, pylint: disable=attribute-defined-outside-init if self.ask_to_send_username and self.user_username: body["lis_person_sourcedid"] = self.user_username @@ -837,7 +839,7 @@ oauth_consumer_key="", oauth_signature="frVp4JuvT1mVXlxktiAUjQ7%2F1cw%3D"'} log.debug("[LTI]: " + error_message) # lint-amnesty, pylint: disable=logging-not-lazy return Response(response_xml_template.format(**failure_values), content_type="application/xml") - real_user = self.system.get_real_user(parse.unquote(sourcedId.split(':')[-1])) + real_user = self.runtime.service(self, 'user').get_user_by_anonymous_id(parse.unquote(sourcedId.split(':')[-1])) if not real_user: # that means we can't save to database, as we do not have real user id. failure_values['imsx_messageIdentifier'] = escape(imsx_messageIdentifier) failure_values['imsx_description'] = "User not found." diff --git a/common/lib/xmodule/xmodule/video_module/video_module.py b/common/lib/xmodule/xmodule/video_module/video_module.py index 2216c88488..052b6d7e91 100644 --- a/common/lib/xmodule/xmodule/video_module/video_module.py +++ b/common/lib/xmodule/xmodule/video_module/video_module.py @@ -29,6 +29,7 @@ from xblock.core import XBlock from xblock.fields import ScopeIds from xblock.runtime import KvsFieldData +from common.djangoapps.xblock_django.constants import ATTR_KEY_REQUEST_COUNTRY_CODE from openedx.core.djangoapps.video_config.models import HLSPlaybackEnabledFlag, CourseYoutubeBlockedFlag from openedx.core.djangoapps.video_pipeline.config.waffle import DEPRECATE_YOUTUBE, waffle_flags from openedx.core.lib.cache_utils import request_cached @@ -108,7 +109,7 @@ EXPORT_IMPORT_STATIC_DIR = 'static' @XBlock.wants('settings', 'completion', 'i18n', 'request_cache') -@XBlock.needs('mako') +@XBlock.needs('mako', 'user') class VideoBlock( VideoFields, VideoTranscriptsMixin, VideoStudioViewHandlers, VideoStudentViewHandlers, TabsEditingMixin, EmptyDataRawMixin, XmlMixin, EditingMixin, @@ -281,7 +282,8 @@ class VideoBlock( # based on user locale. This exists to support cases where # we leverage a geography specific CDN, like China. default_cdn_url = getattr(settings, 'VIDEO_CDN_URL', {}).get('default') - cdn_url = getattr(settings, 'VIDEO_CDN_URL', {}).get(self.system.user_location, default_cdn_url) + user_location = self.runtime.service(self, 'user').get_current_user().opt_attrs[ATTR_KEY_REQUEST_COUNTRY_CODE] + cdn_url = getattr(settings, 'VIDEO_CDN_URL', {}).get(user_location, default_cdn_url) # If we have an edx_video_id, we prefer its values over what we store # internally for download links (source, html5_sources) and the youtube @@ -335,7 +337,7 @@ class VideoBlock( # Video caching is disabled for Studio. User_location is always None in Studio. # CountryMiddleware disabled for Studio. if getattr(self, 'video_speed_optimizations', True) and cdn_url: - branding_info = BrandingInfoConfig.get_config().get(self.system.user_location) + branding_info = BrandingInfoConfig.get_config().get(user_location) if self.edx_video_id and edxval_api and video_status != 'external': for index, source_url in enumerate(sources): diff --git a/lms/djangoapps/courseware/tests/test_video_mongo.py b/lms/djangoapps/courseware/tests/test_video_mongo.py index 7f33db339d..b6724a4760 100644 --- a/lms/djangoapps/courseware/tests/test_video_mongo.py +++ b/lms/djangoapps/courseware/tests/test_video_mongo.py @@ -34,6 +34,7 @@ from lxml import etree from path import Path as path from waffle.testutils import override_flag +from common.djangoapps.xblock_django.constants import ATTR_KEY_REQUEST_COUNTRY_CODE from lms.djangoapps.courseware.tests.helpers import get_context_dict_from_string from openedx.core.djangoapps.video_pipeline.config.waffle import DEPRECATE_YOUTUBE, waffle_flags from openedx.core.djangoapps.waffle_utils.models import WaffleFlagCourseOverrideModel @@ -886,7 +887,9 @@ class TestGetHtmlMethod(BaseTestVideoXBlock): self.initialize_block(data=DATA, runtime_kwargs={ 'user_location': 'CN', }) - assert self.item_descriptor.xmodule_runtime.user_location == 'CN' + user_service = self.item_descriptor.xmodule_runtime.service(self.item_descriptor, 'user') + user_location = user_service.get_current_user().opt_attrs[ATTR_KEY_REQUEST_COUNTRY_CODE] + assert user_location == 'CN' context = self.item_descriptor.render('student_view').content expected_context = dict(initial_context) expected_context['metadata'].update({ diff --git a/lms/djangoapps/edxnotes/decorators.py b/lms/djangoapps/edxnotes/decorators.py index 6c5d0ca6d9..c641bd230c 100644 --- a/lms/djangoapps/edxnotes/decorators.py +++ b/lms/djangoapps/edxnotes/decorators.py @@ -9,7 +9,6 @@ from django.conf import settings from xblock.exceptions import NoSuchServiceError from common.djangoapps.edxmako.shortcuts import render_to_string -from common.djangoapps.xblock_django.constants import ATTR_KEY_ANONYMOUS_USER_ID def edxnotes(cls): @@ -43,8 +42,7 @@ def edxnotes(cls): # - the feature flag or `edxnotes` setting of the course is set to False # - the user is not authenticated try: - user_id = self.runtime.service(self, 'user').get_current_user().opt_attrs.get(ATTR_KEY_ANONYMOUS_USER_ID) - user = self.runtime.get_real_user(user_id) + user = self.runtime.service(self, 'user').get_user_by_anonymous_id() except NoSuchServiceError: user = None diff --git a/lms/djangoapps/edxnotes/tests.py b/lms/djangoapps/edxnotes/tests.py index fc7939bbcd..a67ba7e0fa 100644 --- a/lms/djangoapps/edxnotes/tests.py +++ b/lms/djangoapps/edxnotes/tests.py @@ -33,6 +33,7 @@ from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disa from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory # lint-amnesty, pylint: disable=wrong-import-order from xmodule.tabs import CourseTab # lint-amnesty, pylint: disable=wrong-import-order +from xmodule.tests.helpers import StubUserService # lint-amnesty, pylint: disable=wrong-import-order from . import helpers from .decorators import edxnotes @@ -81,7 +82,8 @@ class TestProblem: self.system = MagicMock(is_author_mode=False) self.scope_ids = MagicMock(usage_id="test_usage_id") user = user or UserFactory() - self.runtime = MagicMock(course_id=course.id, get_real_user=lambda __: user) + user_service = StubUserService(user) + self.runtime = MagicMock(course_id=course.id, service=lambda _a, _b: user_service) self.descriptor = MagicMock() self.descriptor.runtime.modulestore.get_course.return_value = course