* refactor: deprecates ModuleSystem.render_template in favor of the added MakoSystem render_template method. Related changes: * Adds the MakoService to the StudioEditModuleRuntime, PreviewModuleSystem, LmsModuleSystem, and XBlockRuntime * MakoService constructor takes a `namespace_prefix` string, so that the CMS PreviewModuleSystem can render to LMS templates, without needing the special render_from_lms helper method. * ModuleSystem.render_template becomes a read-only property, so the constructor calls and test module systems are updated accordingly. * Adds tests for the MakoService and module system shims. (cherry picked from commit457f959356) * refactor: use MakoService.render_template to remove deprecation warnings from block code. (cherry picked from commit8d62d337f5) * refactor: use MakoService.render_template to remove deprecation warnings from test code. (cherry picked from commit26b43465a4) * test: Adds a test to verify the bug introduced by the previous changes The AuthoringMixin is automatically added to all XBlocks (see settings.XBLOCK_MIXINS), and AuthoringMixin.visibility_view expects the "mako" service. This test verifies the bug by testing the PureXBlock, which does not require the "mako" service, and so fails when the visibility_view is rendered. * fix: AuthoringMixin needs mako service which fixes the visibility_view for XBlocks which don't explicitly require the mako service. Also removes the unneeded class property _services_requested from AuthoringMixin and StudioEditableBlock. This property is better provided by the XBlockMixin class.
70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
"""
|
|
Mixin to support editing in Studio.
|
|
"""
|
|
from xblock.core import XBlock, XBlockMixin
|
|
from xmodule.x_module import AUTHOR_VIEW, STUDENT_VIEW, module_attr
|
|
|
|
|
|
@XBlock.needs('mako')
|
|
class StudioEditableBlock(XBlockMixin):
|
|
"""
|
|
Helper methods for supporting Studio editing of XBlocks.
|
|
|
|
This class is only intended to be used with an XBlock!
|
|
"""
|
|
has_author_view = True
|
|
|
|
def render_children(self, context, fragment, can_reorder=False, can_add=False):
|
|
"""
|
|
Renders the children of the module with HTML appropriate for Studio. If can_reorder is True,
|
|
then the children will be rendered to support drag and drop.
|
|
"""
|
|
contents = []
|
|
|
|
for child in self.get_children(): # pylint: disable=no-member
|
|
if can_reorder:
|
|
context['reorderable_items'].add(child.location)
|
|
context['can_add'] = can_add
|
|
rendered_child = child.render(StudioEditableModule.get_preview_view_name(child), context)
|
|
fragment.add_fragment_resources(rendered_child)
|
|
|
|
contents.append({
|
|
'id': str(child.location),
|
|
'content': rendered_child.content
|
|
})
|
|
|
|
fragment.add_content(self.runtime.service(self, 'mako').render_template("studio_render_children_view.html", { # pylint: disable=no-member
|
|
'items': contents,
|
|
'xblock_context': context,
|
|
'can_add': can_add,
|
|
'can_reorder': can_reorder,
|
|
}))
|
|
|
|
@staticmethod
|
|
def get_preview_view_name(block):
|
|
"""
|
|
Helper method for getting preview view name (student_view or author_view) for a given module.
|
|
"""
|
|
return AUTHOR_VIEW if has_author_view(block) else STUDENT_VIEW
|
|
|
|
|
|
StudioEditableModule = StudioEditableBlock
|
|
|
|
|
|
class StudioEditableDescriptor:
|
|
"""
|
|
Helper mixin for supporting Studio editing of xmodules.
|
|
|
|
This class is only intended to be used with an XModule Descriptor. This class assumes that the associated
|
|
XModule will have an "author_view" method for returning an editable preview view of the module.
|
|
"""
|
|
author_view = module_attr(AUTHOR_VIEW)
|
|
has_author_view = True
|
|
|
|
|
|
def has_author_view(descriptor):
|
|
"""
|
|
Returns True if the xmodule linked to the descriptor supports "author_view".
|
|
"""
|
|
return getattr(descriptor, 'has_author_view', False)
|