def student_view(self, context): """ Renders the student view of the block in the LMS. """ fragment = Fragment() contents = [] if context: child_context = copy(context) else: child_context = {} if 'bookmarked' not in child_context: bookmarks_service = self.runtime.service(self, 'bookmarks') child_context['bookmarked'] = bookmarks_service.is_bookmarked(usage_key=self.location), # pylint: disable=no-member if 'username' not in child_context: user_service = self.runtime.service(self, 'user') child_context['username'] = user_service.get_current_user().opt_attrs['edx-platform.username'] child_blocks = self.get_display_items() child_blocks_to_complete_on_view = set() completion_service = self.runtime.service(self, 'completion') if completion_service and completion_service.completion_tracking_enabled(): child_blocks_to_complete_on_view = completion_service.blocks_to_mark_complete_on_view(child_blocks) complete_on_view_delay = completion_service.get_complete_on_view_delay_ms() child_context['child_of_vertical'] = True is_child_of_vertical = context.get('child_of_vertical', False) # pylint: disable=no-member for child in child_blocks: child_block_context = copy(child_context) if child in child_blocks_to_complete_on_view: child_block_context['wrap_xblock_data'] = { 'mark-completed-on-view-after-delay': complete_on_view_delay } rendered_child = child.render(STUDENT_VIEW, child_block_context) fragment.add_fragment_resources(rendered_child) contents.append({ 'id': six.text_type(child.location), 'content': rendered_child.content }) fragment.add_content(self.system.render_template('vert_module.html', { 'items': contents, 'xblock_context': context, 'unit_title': self.display_name_with_default if not is_child_of_vertical else None, 'show_bookmark_button': child_context.get('show_bookmark_button', not is_child_of_vertical), 'bookmarked': child_context['bookmarked'], 'bookmark_id': u"{},{}".format(child_context['username'], unicode(self.location)), # pylint: disable=no-member })) for tag in webpack_loader.utils.get_as_tags('VerticalStudentView'): fragment.add_resource(tag, mimetype='text/html', placement='head') fragment.initialize_js('VerticalStudentView') return fragment
def test_add_resource(self): """ Tests the add_resource method. """ fragment = Fragment() fragment.add_resource(TEST_CSS, 'text/css') fragment.add_resource(TEST_JS, 'application/javascript') fragment.add_resource(TEST_JS, 'application/javascript', placement='bottom') assert fragment.to_dict()['resources'] == [ { 'kind': 'text', 'data': TEST_CSS, 'mimetype': 'text/css', 'placement': 'head', }, { 'kind': 'text', 'data': TEST_JS, 'mimetype': 'application/javascript', 'placement': 'foot', }, { 'kind': 'text', 'data': TEST_JS, 'mimetype': 'application/javascript', 'placement': 'bottom', }, ]
def problem_view(self, context=None): """Renders the problem view. The view is specific to whether or not this problem was attempted, and, if so, if it was answered correctly. """ correct = self.left == self.right # TODO: I originally named this class="data", but that conflicted with # the CSS on the page! :( We might have to do something to namespace # things. # TODO: Should we have a way to spit out JSON islands full of data? # Note the horror of mixed Python-Javascript data below... content = string.Template(self.content).substitute(**context) result = Fragment(""" <span class="mydata" data-attempted='{ecb.attempted}' data-correct='{correct}'> {content} <span class='indicator'></span> </span> """.format(ecb=self, content=content, correct=correct)) # TODO: This is a runtime-specific URL. But if each XBlock ships their # own copy of underscore.js, we won't be able to uniquify them. # Perhaps runtimes can offer a palette of popular libraries so that # XBlocks can refer to them in XBlock-standard ways? result.add_javascript_url( self.runtime.resource_url("js/vendor/underscore-min.js")) # TODO: The image tag here needs a magic URL, not a hard-coded one. format_data = { 'correct': self.runtime.local_resource_url(self, 'public/images/correct-icon.png'), 'incorrect': self.runtime.local_resource_url( self, 'public/images/incorrect-icon.png'), } result.add_resource( """ <script type="text/template" id="xblock-equality-template"> <% if (attempted !== "True") {{ %> (Not attempted) <% }} else if (correct === "True") {{ %> <img src="{correct}"> <% }} else {{ %> <img src="{incorrect}"> <% }} %> </script> """.format(**format_data), "text/html") result.add_javascript(""" function EqualityCheckerBlock(runtime, element) { var template = _.template($("#xblock-equality-template").html()); function render() { var data = $("span.mydata", element).data(); $("span.indicator", element).html(template(data)); } render(); return { handleCheck: function(result) { $("span.mydata", element) .data("correct", result ? "True" : "False") .data("attempted", "True"); render(); } } } """) result.initialize_js('EqualityCheckerBlock') return result