diff --git a/common/lib/xmodule/setup.py b/common/lib/xmodule/setup.py index 75ca6b9521..d0817d3aee 100644 --- a/common/lib/xmodule/setup.py +++ b/common/lib/xmodule/setup.py @@ -17,7 +17,6 @@ XMODULES = [ "videodev = xmodule.backcompat_module:TranslateCustomTagDescriptor", "videosequence = xmodule.seq_module:SequenceDescriptor", "custom_tag_template = xmodule.raw_module:RawDescriptor", - "hidden = xmodule.hidden_module:HiddenDescriptor", "raw = xmodule.raw_module:RawDescriptor", "lti = xmodule.lti_module:LTIDescriptor", ] @@ -27,6 +26,7 @@ XBLOCKS = [ "conditional = xmodule.conditional_module:ConditionalBlock", "course_info = xmodule.html_module:CourseInfoBlock", "error = xmodule.error_module:ErrorBlock", + "hidden = xmodule.hidden_module:HiddenDescriptor", "html = xmodule.html_module:HtmlBlock", "library = xmodule.library_root_xblock:LibraryRoot", "library_content = xmodule.library_content_module:LibraryContentBlock", diff --git a/common/lib/xmodule/xmodule/hidden_module.py b/common/lib/xmodule/xmodule/hidden_module.py index 00d161b7f7..0e9270f048 100644 --- a/common/lib/xmodule/xmodule/hidden_module.py +++ b/common/lib/xmodule/xmodule/hidden_module.py @@ -1,20 +1,61 @@ +""" +The Hidden XBlock. +""" + +from web_fragments.fragment import Fragment +from xblock.core import XBlock +from xmodule.raw_module import RawMixin +from xmodule.xml_module import XmlMixin +from xmodule.x_module import ( + XModuleDescriptorToXBlockMixin, + XModuleMixin, + XModuleToXBlockMixin, +) -from xmodule.raw_module import RawDescriptor -from xmodule.x_module import XModule - - -class HiddenModule(XModule): +@XBlock.needs("i18n") +class HiddenDescriptor( + RawMixin, + XmlMixin, + XModuleDescriptorToXBlockMixin, + XModuleToXBlockMixin, + XModuleMixin, +): + """ + XBlock class loaded by the runtime when another XBlock type has been disabled + or an unknown XBlock type is included in a course import. + The class name includes 'Descriptor' because this used to be an XModule and the class path is specified in the + modulestore config in a number of places. + """ HIDDEN = True + has_author_view = True - def get_html(self): - if self.system.user_is_staff: - return u"ERROR: This module is unknown--students will not see it at all" - else: - return u"" - - -class HiddenDescriptor(RawDescriptor): - module_class = HiddenModule resources_dir = None + + def author_view(self, _context): + """ + Return the author view. + """ + fragment = Fragment() + _ = self.runtime.service(self, "i18n").ugettext + content = _( + 'ERROR: "{block_type}" is an unknown component type. This component will be hidden in LMS.' + ).format(block_type=self.scope_ids.block_type) + fragment.add_content(content) + return fragment + + def studio_view(self, _context): + """ + Return the studio view. + """ + # User should not be able to edit unknown types. + fragment = Fragment() + return fragment + + def student_view(self, _context): + """ + Return the student view. + """ + fragment = Fragment() + return fragment diff --git a/openedx/core/lib/xblock_utils/__init__.py b/openedx/core/lib/xblock_utils/__init__.py index 32b121dce9..9c5a3006b3 100644 --- a/openedx/core/lib/xblock_utils/__init__.py +++ b/openedx/core/lib/xblock_utils/__init__.py @@ -33,7 +33,10 @@ from common.djangoapps.edxmako.shortcuts import render_to_string from xmodule.seq_module import SequenceModule from xmodule.util.xmodule_django import add_webpack_to_fragment from xmodule.vertical_block import VerticalBlock -from xmodule.x_module import PREVIEW_VIEWS, STUDIO_VIEW, XModule, XModuleDescriptor, shim_xmodule_js +from xmodule.x_module import ( + PREVIEW_VIEWS, STUDENT_VIEW, STUDIO_VIEW, + XModule, XModuleDescriptor, shim_xmodule_js, +) log = logging.getLogger(__name__) @@ -110,6 +113,9 @@ def wrap_xblock( ) ] + if view == STUDENT_VIEW and getattr(block, 'HIDDEN', False): + css_classes.append('is-hidden') + if isinstance(block, (XModule, XModuleDescriptor)) or getattr(block, 'uses_xmodule_styles_setup', False): if view in PREVIEW_VIEWS: # The block is acting as an XModule @@ -118,9 +124,6 @@ def wrap_xblock( # The block is acting as an XModuleDescriptor css_classes.append('xmodule_edit') - if getattr(block, 'HIDDEN', False): - css_classes.append('is-hidden') - css_classes.append('xmodule_' + markupsafe.escape(class_name)) if isinstance(block, (XModule, XModuleDescriptor)):