diff --git a/cms/djangoapps/contentstore/views/preview.py b/cms/djangoapps/contentstore/views/preview.py index d627f64d60..8fb72e3c61 100644 --- a/cms/djangoapps/contentstore/views/preview.py +++ b/cms/djangoapps/contentstore/views/preview.py @@ -223,7 +223,7 @@ def _preview_module_system(request, descriptor, field_data): # Set up functions to modify the fragment produced by student_view descriptor.runtime.wrappers = wrappers descriptor.runtime.wrappers_asides = wrappers_asides - descriptor.runtime._services.update(services) + descriptor.runtime._runtime_services.update(services) # lint-amnesty, pylint: disable=protected-access # xmodules can check for this attribute during rendering to determine if # they are being rendered for preview (i.e. in Studio) diff --git a/lms/djangoapps/courseware/block_render.py b/lms/djangoapps/courseware/block_render.py index d7afe5bd11..025b15894e 100644 --- a/lms/djangoapps/courseware/block_render.py +++ b/lms/djangoapps/courseware/block_render.py @@ -627,7 +627,7 @@ def get_module_system_for_user( descriptor.runtime.mixins = descriptor.runtime.mixologist._mixins descriptor.runtime.wrappers = block_wrappers - descriptor.runtime._services.update(services) + descriptor.runtime._runtime_services.update(services) # lint-amnesty, pylint: disable=protected-access descriptor.runtime.request_token = request_token descriptor.runtime.wrap_asides_override = lms_wrappers_aside diff --git a/xmodule/x_module.py b/xmodule/x_module.py index 8f04b284a2..c2fd4e0085 100644 --- a/xmodule/x_module.py +++ b/xmodule/x_module.py @@ -1070,7 +1070,7 @@ class ModuleSystemShim: 'runtime.anonymous_student_id is deprecated. Please use the user service instead.', DeprecationWarning, stacklevel=3, ) - user_service = self._services.get('user') + user_service = self._runtime_services.get('user') or self._services.get('user') if user_service: return user_service.get_current_user().opt_attrs.get(ATTR_KEY_ANONYMOUS_USER_ID) return None @@ -1100,7 +1100,7 @@ class ModuleSystemShim: 'runtime.user_id is deprecated. Please use the user service instead.', DeprecationWarning, stacklevel=3, ) - user_service = self._services.get('user') + user_service = self._runtime_services.get('user') or self._services.get('user') if user_service: return user_service.get_current_user().opt_attrs.get(ATTR_KEY_USER_ID) return None @@ -1116,9 +1116,9 @@ class ModuleSystemShim: 'runtime.user_is_staff is deprecated. Please use the user service instead.', DeprecationWarning, stacklevel=3, ) - user_service = self._services.get('user') + user_service = self._runtime_services.get('user') or self._services.get('user') if user_service: - return self._services['user'].get_current_user().opt_attrs.get(ATTR_KEY_USER_IS_STAFF) + return user_service.get_current_user().opt_attrs.get(ATTR_KEY_USER_IS_STAFF) return None @property @@ -1132,9 +1132,9 @@ class ModuleSystemShim: 'runtime.user_location is deprecated. Please use the user service instead.', DeprecationWarning, stacklevel=3, ) - user_service = self._services.get('user') + user_service = self._runtime_services.get('user') or self._services.get('user') if user_service: - return self._services['user'].get_current_user().opt_attrs.get(ATTR_KEY_REQUEST_COUNTRY_CODE) + return user_service.get_current_user().opt_attrs.get(ATTR_KEY_REQUEST_COUNTRY_CODE) return None @property @@ -1152,9 +1152,9 @@ class ModuleSystemShim: 'runtime.get_real_user is deprecated. Please use the user service instead.', DeprecationWarning, stacklevel=3, ) - user_service = self._services.get('user') + user_service = self._runtime_services.get('user') or self._services.get('user') if user_service: - return self._services['user'].get_user_by_anonymous_id + return user_service.get_user_by_anonymous_id return None @property @@ -1170,9 +1170,9 @@ class ModuleSystemShim: 'runtime.get_user_role is deprecated. Please use the user service instead.', DeprecationWarning, stacklevel=3, ) - user_service = self._services.get('user') + user_service = self._runtime_services.get('user') or self._services.get('user') if user_service: - return partial(self._services['user'].get_current_user().opt_attrs.get, ATTR_KEY_USER_ROLE) + return partial(user_service.get_current_user().opt_attrs.get, ATTR_KEY_USER_ROLE) @property def render_template(self): @@ -1188,7 +1188,7 @@ class ModuleSystemShim: ) if hasattr(self, '_deprecated_render_template'): return self._deprecated_render_template - render_service = self._services.get('mako') + render_service = self._runtime_services.get('mako') or self._services.get('mako') if render_service: return render_service.render_template return None @@ -1222,7 +1222,7 @@ class ModuleSystemShim: 'runtime.xqueue is deprecated. Please use the xqueue service instead.', DeprecationWarning, stacklevel=3, ) - xqueue_service = self._services.get('xqueue') + xqueue_service = self._runtime_services.get('xqueue') or self._services.get('xqueue') if xqueue_service: return { 'interface': xqueue_service.interface, @@ -1244,7 +1244,7 @@ class ModuleSystemShim: 'runtime.can_execute_unsafe_code is deprecated. Please use the sandbox service instead.', DeprecationWarning, stacklevel=3, ) - sandbox_service = self._services.get('sandbox') + sandbox_service = self._runtime_services.get('sandbox') or self._services.get('sandbox') if sandbox_service: return sandbox_service.can_execute_unsafe_code # Default to saying "no unsafe code". @@ -1264,7 +1264,7 @@ class ModuleSystemShim: 'runtime.get_python_lib_zip is deprecated. Please use the sandbox service instead.', DeprecationWarning, stacklevel=3, ) - sandbox_service = self._services.get('sandbox') + sandbox_service = self._runtime_services.get('sandbox') or self._services.get('sandbox') if sandbox_service: return sandbox_service.get_python_lib_zip # Default to saying "no lib data" @@ -1283,7 +1283,7 @@ class ModuleSystemShim: 'runtime.cache is deprecated. Please use the cache service instead.', DeprecationWarning, stacklevel=3, ) - return self._services.get('cache') or DoNothingCache() + return self._runtime_services.get('cache') or self._services.get('cache') or DoNothingCache() @property def replace_urls(self): @@ -1296,7 +1296,7 @@ class ModuleSystemShim: 'runtime.replace_urls is deprecated. Please use the replace_urls service instead.', DeprecationWarning, stacklevel=3, ) - replace_urls_service = self._services.get('replace_urls') + replace_urls_service = self._runtime_services.get('replace_urls') or self._services.get('replace_urls') if replace_urls_service: return partial(replace_urls_service.replace_urls, static_replace_only=True) @@ -1311,7 +1311,7 @@ class ModuleSystemShim: 'runtime.replace_course_urls is deprecated. Please use the replace_urls service instead.', DeprecationWarning, stacklevel=3, ) - replace_urls_service = self._services.get('replace_urls') + replace_urls_service = self._runtime_services.get('replace_urls') or self._services.get('replace_urls') if replace_urls_service: return partial(replace_urls_service.replace_urls) @@ -1326,7 +1326,7 @@ class ModuleSystemShim: 'runtime.replace_jump_to_id_urls is deprecated. Please use the replace_urls service instead.', DeprecationWarning, stacklevel=3, ) - replace_urls_service = self._services.get('replace_urls') + replace_urls_service = self._runtime_services.get('replace_urls') or self._services.get('replace_urls') if replace_urls_service: return partial(replace_urls_service.replace_urls) @@ -1379,7 +1379,7 @@ class ModuleSystemShim: "rebind_noauth_module_to_user is deprecated. Please use the 'rebind_user' service instead.", DeprecationWarning, stacklevel=3 ) - rebind_user_service = self._services.get('rebind_user') + rebind_user_service = self._runtime_services.get('rebind_user') or self._services.get('rebind_user') if rebind_user_service: return partial(rebind_user_service.rebind_noauth_module_to_user) @@ -1466,6 +1466,7 @@ class DescriptorSystem(MetricsMixin, ConfigurableFragmentWrapper, ModuleSystemSh self.get_policy = lambda u: {} self.disabled_xblock_types = disabled_xblock_types + self._runtime_services = {} def get(self, attr): """ provide uniform access to attributes (like etree).""" @@ -1559,7 +1560,7 @@ class DescriptorSystem(MetricsMixin, ConfigurableFragmentWrapper, ModuleSystemSh Publish events through the `EventPublishingService`. This ensures that the correct track method is used for Instructor tasks. """ - if publish_service := self._services.get('publish'): + if publish_service := self._runtime_services.get('publish') or self._services.get('publish'): publish_service.publish(block, event_type, event) def service(self, block, service_name): @@ -1576,8 +1577,11 @@ class DescriptorSystem(MetricsMixin, ConfigurableFragmentWrapper, ModuleSystemSh Returns: An object implementing the requested service, or None. """ - # getting the service from parent module. making sure of block service declarations. - service = super().service(block=block, service_name=service_name) + declaration = block.service_declaration(service_name) + service = self._runtime_services.get(service_name) + if declaration is None or service is None: + # getting the service from parent module. making sure of block service declarations. + service = super().service(block=block, service_name=service_name) # Passing the block to service if it is callable e.g. XBlockI18nService. It is the responsibility of calling # service to handle the passing argument. if callable(service):