From 73e7ced6f99cfc9fde4c4ca92fd38fb96b3791da Mon Sep 17 00:00:00 2001 From: cahrens Date: Wed, 11 Jun 2014 14:35:28 -0400 Subject: [PATCH] Introduce constants for studio_view, student_view, and author_view. --- cms/djangoapps/contentstore/views/item.py | 7 ++-- cms/djangoapps/contentstore/views/preview.py | 5 ++- .../contentstore/views/tests/test_item.py | 5 ++- .../contentstore/views/tests/test_tabs.py | 4 +- .../views/tests/test_unit_page.py | 9 +++-- common/djangoapps/xmodule_modifiers.py | 6 +-- .../lib/xmodule/xmodule/conditional_module.py | 4 +- .../lib/xmodule/xmodule/crowdsource_hinter.py | 4 +- .../lib/xmodule/xmodule/randomize_module.py | 4 +- common/lib/xmodule/xmodule/seq_module.py | 4 +- .../lib/xmodule/xmodule/split_test_module.py | 7 ++-- common/lib/xmodule/xmodule/studio_editable.py | 6 +-- .../xmodule/tests/test_combined_open_ended.py | 13 +++--- .../xmodule/xmodule/tests/test_conditional.py | 5 ++- .../xmodule/tests/test_crowdsource_hinter.py | 7 ++-- .../xmodule/tests/test_error_module.py | 10 ++--- .../xmodule/tests/test_split_test_module.py | 9 +++-- .../xmodule/tests/test_studio_editable.py | 3 +- .../xmodule/xmodule/tests/test_vertical.py | 7 ++-- .../xmodule/tests/test_xblock_wrappers.py | 6 +-- common/lib/xmodule/xmodule/vertical_module.py | 4 +- common/lib/xmodule/xmodule/x_module.py | 21 +++++++++- lms/djangoapps/courseware/courses.py | 5 ++- .../courseware/tests/test_lti_integration.py | 3 +- .../courseware/tests/test_module_render.py | 40 +++++++++---------- .../courseware/tests/test_video_handlers.py | 9 +++-- .../courseware/tests/test_video_mongo.py | 9 +++-- .../courseware/tests/test_word_cloud.py | 3 +- lms/djangoapps/courseware/views.py | 5 ++- 29 files changed, 128 insertions(+), 96 deletions(-) diff --git a/cms/djangoapps/contentstore/views/item.py b/cms/djangoapps/contentstore/views/item.py index acb51b1a20..46ef237772 100644 --- a/cms/djangoapps/contentstore/views/item.py +++ b/cms/djangoapps/contentstore/views/item.py @@ -23,6 +23,7 @@ import xmodule from xmodule.modulestore.django import modulestore from xmodule.modulestore.exceptions import ItemNotFoundError, InvalidLocationError, DuplicateItemError from xmodule.modulestore.inheritance import own_metadata +from xmodule.x_module import PREVIEW_VIEWS, STUDIO_VIEW from util.json_request import expect_json, JsonResponse from util.string_utils import str_to_bool @@ -180,15 +181,15 @@ def xblock_view_handler(request, usage_key_string, view_name): xblock = store.get_item(usage_key) is_read_only = _is_xblock_read_only(xblock) container_views = ['container_preview', 'reorderable_container_child_preview'] - unit_views = ['student_view', 'author_view'] + unit_views = PREVIEW_VIEWS # wrap the generated fragment in the xmodule_editor div so that the javascript # can bind to it correctly xblock.runtime.wrappers.append(partial(wrap_xblock, 'StudioRuntime', usage_id_serializer=unicode)) - if view_name == 'studio_view': + if view_name == STUDIO_VIEW: try: - fragment = xblock.render('studio_view') + fragment = xblock.render(STUDIO_VIEW) # catch exceptions indiscriminately, since after this point they escape the # dungeon and surface as uneditable, unsaveable, and undeletable # component-goblins. diff --git a/cms/djangoapps/contentstore/views/preview.py b/cms/djangoapps/contentstore/views/preview.py index 408c8cff39..8401935c3d 100644 --- a/cms/djangoapps/contentstore/views/preview.py +++ b/cms/djangoapps/contentstore/views/preview.py @@ -10,6 +10,7 @@ from django.contrib.auth.decorators import login_required from edxmako.shortcuts import render_to_string from xmodule_modifiers import replace_static_urls, wrap_xblock, wrap_fragment +from xmodule.x_module import PREVIEW_VIEWS, STUDENT_VIEW, AUTHOR_VIEW from xmodule.error_module import ErrorDescriptor from xmodule.exceptions import NotFoundError, ProcessingError from xmodule.modulestore.django import modulestore, ModuleI18nService @@ -175,7 +176,7 @@ def _studio_wrap_xblock(xblock, view, frag, context, display_name_only=False): Wraps the results of rendering an XBlock view in a div which adds a header and Studio action buttons. """ # Only add the Studio wrapper when on the container page. The unit page will remain as is for now. - if context.get('container_view', None) and view in ['student_view', 'author_view']: + if context.get('container_view', None) and view in PREVIEW_VIEWS: root_xblock = context.get('root_xblock') is_root = root_xblock and xblock.location == root_xblock.location is_reorderable = _is_xblock_reorderable(xblock, context) @@ -198,7 +199,7 @@ def get_preview_fragment(request, descriptor, context): """ module = _load_preview_module(request, descriptor) - preview_view = 'author_view' if _has_author_view(module) else 'student_view' + preview_view = AUTHOR_VIEW if _has_author_view(module) else STUDENT_VIEW try: fragment = module.render(preview_view, context) diff --git a/cms/djangoapps/contentstore/views/tests/test_item.py b/cms/djangoapps/contentstore/views/tests/test_item.py index 64e2e46392..ebadd986f9 100644 --- a/cms/djangoapps/contentstore/views/tests/test_item.py +++ b/cms/djangoapps/contentstore/views/tests/test_item.py @@ -22,6 +22,7 @@ from student.tests.factories import UserFactory from xmodule.capa_module import CapaDescriptor from xmodule.modulestore.django import modulestore from xmodule.modulestore.exceptions import ItemNotFoundError +from xmodule.x_module import STUDIO_VIEW, STUDENT_VIEW from opaque_keys.edx.keys import UsageKey from opaque_keys.edx.locations import Location from xmodule.partitions.partitions import Group, UserPartition @@ -712,12 +713,12 @@ class TestEditItem(ItemTest): self.assertNotEqual(draft.data, published.data) # Get problem by 'xblock_handler' - view_url = reverse_usage_url("xblock_view_handler", self.problem_usage_key, {"view_name": "student_view"}) + view_url = reverse_usage_url("xblock_view_handler", self.problem_usage_key, {"view_name": STUDENT_VIEW}) resp = self.client.get(view_url, HTTP_ACCEPT='application/json') self.assertEqual(resp.status_code, 200) # Activate the editing view - view_url = reverse_usage_url("xblock_view_handler", self.problem_usage_key, {"view_name": "studio_view"}) + view_url = reverse_usage_url("xblock_view_handler", self.problem_usage_key, {"view_name": STUDIO_VIEW}) resp = self.client.get(view_url, HTTP_ACCEPT='application/json') self.assertEqual(resp.status_code, 200) diff --git a/cms/djangoapps/contentstore/views/tests/test_tabs.py b/cms/djangoapps/contentstore/views/tests/test_tabs.py index f938ba8880..2d84d41269 100644 --- a/cms/djangoapps/contentstore/views/tests/test_tabs.py +++ b/cms/djangoapps/contentstore/views/tests/test_tabs.py @@ -4,7 +4,7 @@ import json from contentstore.views import tabs from contentstore.tests.utils import CourseTestCase from django.test import TestCase -from xmodule.modulestore.django import loc_mapper +from xmodule.x_module import STUDENT_VIEW from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory from xmodule.tabs import CourseTabList, WikiTab from contentstore.utils import reverse_course_url @@ -178,7 +178,7 @@ class TabsPageTests(CourseTestCase): """ Verify that the static tab renders itself with the correct HTML """ - preview_url = '/xblock/{}/student_view'.format(self.test_tab.location) + preview_url = '/xblock/{}/{}'.format(self.test_tab.location, STUDENT_VIEW) resp = self.client.get(preview_url, HTTP_ACCEPT='application/json') self.assertEqual(resp.status_code, 200) diff --git a/cms/djangoapps/contentstore/views/tests/test_unit_page.py b/cms/djangoapps/contentstore/views/tests/test_unit_page.py index 569d7ab9d5..695ca090b1 100644 --- a/cms/djangoapps/contentstore/views/tests/test_unit_page.py +++ b/cms/djangoapps/contentstore/views/tests/test_unit_page.py @@ -5,6 +5,7 @@ Unit tests for the unit page. from contentstore.views.tests.utils import StudioPageTestCase from xmodule.modulestore.django import modulestore from xmodule.modulestore.tests.factories import ItemFactory +from xmodule.x_module import STUDENT_VIEW class UnitPageTestCase(StudioPageTestCase): @@ -38,7 +39,7 @@ class UnitPageTestCase(StudioPageTestCase): """ Verify that a public xblock's preview returns the expected HTML. """ - self.validate_preview_html(self.video, 'student_view', + self.validate_preview_html(self.video, STUDENT_VIEW, can_edit=True, can_reorder=True, can_add=False) def test_draft_component_preview_html(self): @@ -47,7 +48,7 @@ class UnitPageTestCase(StudioPageTestCase): """ modulestore('draft').convert_to_draft(self.vertical.location) draft_video = modulestore('draft').convert_to_draft(self.video.location) - self.validate_preview_html(draft_video, 'student_view', + self.validate_preview_html(draft_video, STUDENT_VIEW, can_edit=True, can_reorder=True, can_add=False) def test_public_child_container_preview_html(self): @@ -59,7 +60,7 @@ class UnitPageTestCase(StudioPageTestCase): category='split_test', display_name='Split Test') ItemFactory.create(parent_location=child_container.location, category='html', display_name='grandchild') - self.validate_preview_html(child_container, 'student_view', + self.validate_preview_html(child_container, STUDENT_VIEW, can_reorder=True, can_edit=True, can_add=False) def test_draft_child_container_preview_html(self): @@ -73,5 +74,5 @@ class UnitPageTestCase(StudioPageTestCase): category='html', display_name='grandchild') modulestore('draft').convert_to_draft(self.vertical.location) draft_child_container = modulestore('draft').get_item(child_container.location) - self.validate_preview_html(draft_child_container, 'student_view', + self.validate_preview_html(draft_child_container, STUDENT_VIEW, can_reorder=True, can_edit=True, can_add=False) diff --git a/common/djangoapps/xmodule_modifiers.py b/common/djangoapps/xmodule_modifiers.py index a92160ca89..1baffd2e59 100644 --- a/common/djangoapps/xmodule_modifiers.py +++ b/common/djangoapps/xmodule_modifiers.py @@ -15,7 +15,7 @@ from xblock.fragment import Fragment from xmodule.seq_module import SequenceModule from xmodule.vertical_module import VerticalModule -from xmodule.x_module import shim_xmodule_js, XModuleDescriptor, XModule +from xmodule.x_module import shim_xmodule_js, XModuleDescriptor, XModule, PREVIEW_VIEWS, STUDIO_VIEW from xmodule.modulestore import MONGO_MODULESTORE_TYPE from xmodule.modulestore.django import modulestore @@ -59,10 +59,10 @@ def wrap_xblock(runtime_class, block, view, frag, context, usage_id_serializer, css_classes = ['xblock', 'xblock-' + view] if isinstance(block, (XModule, XModuleDescriptor)): - if view in ['student_view', 'author_view']: + if view in PREVIEW_VIEWS: # The block is acting as an XModule css_classes.append('xmodule_display') - elif view == 'studio_view': + elif view == STUDIO_VIEW: # The block is acting as an XModuleDescriptor css_classes.append('xmodule_edit') diff --git a/common/lib/xmodule/xmodule/conditional_module.py b/common/lib/xmodule/xmodule/conditional_module.py index d68dd00741..c887670a7a 100644 --- a/common/lib/xmodule/xmodule/conditional_module.py +++ b/common/lib/xmodule/xmodule/conditional_module.py @@ -8,7 +8,7 @@ from lazy import lazy from lxml import etree from pkg_resources import resource_string -from xmodule.x_module import XModule +from xmodule.x_module import XModule, STUDENT_VIEW from xmodule.seq_module import SequenceDescriptor from xblock.fields import Scope, ReferenceList from xmodule.modulestore.exceptions import ItemNotFoundError @@ -160,7 +160,7 @@ class ConditionalModule(ConditionalFields, XModule): context) return json.dumps({'html': [html], 'message': bool(message)}) - html = [child.render('student_view').content for child in self.get_display_items()] + html = [child.render(STUDENT_VIEW).content for child in self.get_display_items()] return json.dumps({'html': html}) diff --git a/common/lib/xmodule/xmodule/crowdsource_hinter.py b/common/lib/xmodule/xmodule/crowdsource_hinter.py index 0ccd7d6613..1d0d0c56a5 100644 --- a/common/lib/xmodule/xmodule/crowdsource_hinter.py +++ b/common/lib/xmodule/xmodule/crowdsource_hinter.py @@ -13,7 +13,7 @@ from pkg_resources import resource_string from lxml import etree -from xmodule.x_module import XModule +from xmodule.x_module import XModule, STUDENT_VIEW from xmodule.raw_module import RawDescriptor from xblock.fields import Scope, String, Integer, Boolean, Dict, List @@ -113,7 +113,7 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule): try: child = self.get_display_items()[0] - out = child.render('student_view').content + out = child.render(STUDENT_VIEW).content # The event listener uses the ajax url to find the child. child_id = child.id except IndexError: diff --git a/common/lib/xmodule/xmodule/randomize_module.py b/common/lib/xmodule/xmodule/randomize_module.py index 30febac9b2..6827a68c35 100644 --- a/common/lib/xmodule/xmodule/randomize_module.py +++ b/common/lib/xmodule/xmodule/randomize_module.py @@ -1,7 +1,7 @@ import logging import random -from xmodule.x_module import XModule +from xmodule.x_module import XModule, STUDENT_VIEW from xmodule.seq_module import SequenceDescriptor from lxml import etree @@ -83,7 +83,7 @@ class RandomizeModule(RandomizeFields, XModule): # raise error instead? In fact, could complain on descriptor load... return Fragment(content=u"
Nothing to randomize between
") - return self.child.render('student_view', context) + return self.child.render(STUDENT_VIEW, context) def get_icon_class(self): return self.child.get_icon_class() if self.child else 'other' diff --git a/common/lib/xmodule/xmodule/seq_module.py b/common/lib/xmodule/xmodule/seq_module.py index 6cb25884a4..b449763a6f 100644 --- a/common/lib/xmodule/xmodule/seq_module.py +++ b/common/lib/xmodule/xmodule/seq_module.py @@ -11,7 +11,7 @@ from .exceptions import NotFoundError from .fields import Date from .mako_module import MakoModuleDescriptor from .progress import Progress -from .x_module import XModule +from .x_module import XModule, STUDENT_VIEW from .xml_module import XmlDescriptor log = logging.getLogger(__name__) @@ -85,7 +85,7 @@ class SequenceModule(SequenceFields, XModule): for child in self.get_display_items(): progress = child.get_progress() - rendered_child = child.render('student_view', context) + rendered_child = child.render(STUDENT_VIEW, context) fragment.add_frag_resources(rendered_child) titles = child.get_content_titles() diff --git a/common/lib/xmodule/xmodule/split_test_module.py b/common/lib/xmodule/xmodule/split_test_module.py index 649ffb0bb2..62bcfe5d84 100644 --- a/common/lib/xmodule/xmodule/split_test_module.py +++ b/common/lib/xmodule/xmodule/split_test_module.py @@ -6,12 +6,11 @@ import logging import json from webob import Response from uuid import uuid4 -from pkg_resources import resource_string from xmodule.progress import Progress from xmodule.seq_module import SequenceDescriptor from xmodule.studio_editable import StudioEditableModule, StudioEditableDescriptor -from xmodule.x_module import XModule, module_attr +from xmodule.x_module import XModule, module_attr, STUDENT_VIEW from xmodule.modulestore.inheritance import UserPartitionList from lxml import etree @@ -235,7 +234,7 @@ class SplitTestModule(SplitTestFields, XModule, StudioEditableModule): child_location = self.group_id_to_child[group_id] child_descriptor = self.get_child_descriptor_by_location(child_location) child = self.system.get_module(child_descriptor) - rendered_child = child.render('student_view', context) + rendered_child = child.render(STUDENT_VIEW, context) fragment.add_frag_resources(rendered_child) contents.append({ @@ -312,7 +311,7 @@ class SplitTestModule(SplitTestFields, XModule, StudioEditableModule): if self.system.user_is_staff: return self._staff_view(context) else: - child_fragment = self.child.render('student_view', context) + child_fragment = self.child.render(STUDENT_VIEW, context) fragment = Fragment(self.system.render_template('split_test_student_view.html', { 'child_content': child_fragment.content, 'child_id': self.child.scope_ids.usage_id, diff --git a/common/lib/xmodule/xmodule/studio_editable.py b/common/lib/xmodule/xmodule/studio_editable.py index 3e8ba36de6..da29b19c6a 100644 --- a/common/lib/xmodule/xmodule/studio_editable.py +++ b/common/lib/xmodule/xmodule/studio_editable.py @@ -1,7 +1,7 @@ """ Mixin to support editing in Studio. """ -from xmodule.x_module import module_attr +from xmodule.x_module import module_attr, STUDENT_VIEW, AUTHOR_VIEW class StudioEditableModule(object): @@ -43,7 +43,7 @@ class StudioEditableModule(object): """ Helper method for getting preview view name (student_view or author_view) for a given module. """ - return 'author_view' if hasattr(block, 'author_view') else 'student_view' + return AUTHOR_VIEW if hasattr(block, AUTHOR_VIEW) else STUDENT_VIEW class StudioEditableDescriptor(object): @@ -53,5 +53,5 @@ class StudioEditableDescriptor(object): 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") + author_view = module_attr(AUTHOR_VIEW) has_author_view = True diff --git a/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py b/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py index e74d6d16c2..502de99884 100644 --- a/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py +++ b/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py @@ -25,6 +25,7 @@ from xmodule.combined_open_ended_module import CombinedOpenEndedModule from opaque_keys.edx.locations import Location from xmodule.tests import get_test_system, test_util_open_ended from xmodule.progress import Progress +from xmodule.x_module import STUDENT_VIEW from xmodule.tests.test_util_open_ended import ( DummyModulestore, TEST_STATE_SA_IN, MOCK_INSTANCE_STATE, TEST_STATE_SA, TEST_STATE_AI, TEST_STATE_AI2, TEST_STATE_AI2_INVALID, @@ -1041,7 +1042,7 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): self._handle_ajax("next_problem", {}) self.assertEqual(self._module().current_task_number, 0) - html = self._module().render('student_view').content + html = self._module().render(STUDENT_VIEW).content self.assertIsInstance(html, basestring) rubric = self._handle_ajax("get_combined_rubric", {}) @@ -1098,7 +1099,7 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): # Move to the next step in the problem self._handle_ajax("next_problem", {}) self.assertEqual(self._module().current_task_number, 1) - self._module().render('student_view') + self._module().render(STUDENT_VIEW) # Try to get the rubric from the module self._handle_ajax("get_combined_rubric", {}) @@ -1131,7 +1132,7 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): self.assertEqual(module.current_task_number, 1) # Get html and other data client will request - module.render('student_view') + module.render(STUDENT_VIEW) self._handle_ajax("skip_post_assessment", {}) @@ -1167,7 +1168,7 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): # Move to the next step in the problem self._handle_ajax("next_problem", {}) self.assertEqual(self._module().current_task_number, 1) - self._module().render('student_view') + self._module().render(STUDENT_VIEW) # Try to get the rubric from the module self._handle_ajax("get_combined_rubric", {}) @@ -1198,7 +1199,7 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): self.assertEqual(module.current_task_number, 1) # Get html and other data client will request - module.render('student_view') + module.render(STUDENT_VIEW) self._handle_ajax("skip_post_assessment", {}) @@ -1268,7 +1269,7 @@ class OpenEndedModuleXmlAttemptTest(unittest.TestCase, DummyModulestore): self._handle_ajax("next_problem", {}) self.assertEqual(self._module().current_task_number, 0) - html = self._module().render('student_view').content + html = self._module().render(STUDENT_VIEW).content self.assertIsInstance(html, basestring) # Module should now be done diff --git a/common/lib/xmodule/xmodule/tests/test_conditional.py b/common/lib/xmodule/xmodule/tests/test_conditional.py index c083877abc..bc20075704 100644 --- a/common/lib/xmodule/xmodule/tests/test_conditional.py +++ b/common/lib/xmodule/xmodule/tests/test_conditional.py @@ -11,6 +11,7 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey, Location from xmodule.modulestore.xml import ImportSystem, XMLModuleStore, CourseLocationGenerator from xmodule.conditional_module import ConditionalDescriptor from xmodule.tests import DATA_DIR, get_test_system, get_test_descriptor_system +from xmodule.x_module import STUDENT_VIEW ORG = 'test_org' @@ -129,7 +130,7 @@ class ConditionalModuleBasicTest(unittest.TestCase): modules = ConditionalFactory.create(self.test_system) # because get_test_system returns the repr of the context dict passed to render_template, # we reverse it here - html = modules['cond_module'].render('student_view').content + html = modules['cond_module'].render(STUDENT_VIEW).content expected = modules['cond_module'].xmodule_runtime.render_template('conditional_ajax.html', { 'ajax_url': modules['cond_module'].xmodule_runtime.ajax_url, 'element_id': u'i4x-edX-conditional_test-conditional-SampleConditional', @@ -219,7 +220,7 @@ class ConditionalModuleXmlTest(unittest.TestCase): print "module children: ", module.get_children() print "module display items (children): ", module.get_display_items() - html = module.render('student_view').content + html = module.render(STUDENT_VIEW).content print "html type: ", type(html) print "html: ", html html_expect = module.xmodule_runtime.render_template( diff --git a/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py b/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py index 0521b32c94..f32b9c1a83 100644 --- a/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py +++ b/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py @@ -8,6 +8,7 @@ import copy from xmodule.crowdsource_hinter import CrowdsourceHinterModule from xmodule.vertical_module import VerticalModule, VerticalDescriptor +from xmodule.x_module import STUDENT_VIEW from xblock.field_data import DictFieldData from xblock.fragment import Fragment from xblock.core import XBlock @@ -245,7 +246,7 @@ class CrowdsourceHinterTest(unittest.TestCase): """ return [FakeChild()] mock_module.get_display_items = fake_get_display_items - out_html = mock_module.render('student_view').content + out_html = mock_module.render(STUDENT_VIEW).content self.assertTrue('This is supposed to be test html.' in out_html) self.assertTrue('i4x://this/is/a/fake/id' in out_html) @@ -262,7 +263,7 @@ class CrowdsourceHinterTest(unittest.TestCase): """ return [] mock_module.get_display_items = fake_get_display_items - out_html = mock_module.render('student_view').content + out_html = mock_module.render(STUDENT_VIEW).content self.assertTrue('Error in loading crowdsourced hinter' in out_html) @unittest.skip("Needs to be finished.") @@ -273,7 +274,7 @@ class CrowdsourceHinterTest(unittest.TestCase): NOT WORKING RIGHT NOW """ mock_module = VerticalWithModulesFactory.create() - out_html = mock_module.render('student_view').content + out_html = mock_module.render(STUDENT_VIEW).content self.assertTrue('Test numerical problem.' in out_html) self.assertTrue('Another test numerical problem.' in out_html) diff --git a/common/lib/xmodule/xmodule/tests/test_error_module.py b/common/lib/xmodule/xmodule/tests/test_error_module.py index cb7cebb935..85c28de7ca 100644 --- a/common/lib/xmodule/xmodule/tests/test_error_module.py +++ b/common/lib/xmodule/xmodule/tests/test_error_module.py @@ -6,7 +6,7 @@ from xmodule.tests import get_test_system from xmodule.error_module import ErrorDescriptor, ErrorModule, NonStaffErrorDescriptor from xmodule.modulestore.xml import CourseLocationGenerator from opaque_keys.edx.locations import SlashSeparatedCourseKey, Location -from xmodule.x_module import XModuleDescriptor, XModule +from xmodule.x_module import XModuleDescriptor, XModule, STUDENT_VIEW from mock import MagicMock, Mock, patch from xblock.runtime import Runtime, IdReader from xblock.field_data import FieldData @@ -39,7 +39,7 @@ class TestErrorModule(unittest.TestCase, SetupTestErrorModules): ) self.assertIsInstance(descriptor, ErrorDescriptor) descriptor.xmodule_runtime = self.system - context_repr = self.system.render(descriptor, 'student_view').content + context_repr = self.system.render(descriptor, STUDENT_VIEW).content self.assertIn(self.error_msg, context_repr) self.assertIn(repr(self.valid_xml), context_repr) @@ -53,7 +53,7 @@ class TestErrorModule(unittest.TestCase, SetupTestErrorModules): descriptor, self.error_msg) self.assertIsInstance(error_descriptor, ErrorDescriptor) error_descriptor.xmodule_runtime = self.system - context_repr = self.system.render(error_descriptor, 'student_view').content + context_repr = self.system.render(error_descriptor, STUDENT_VIEW).content self.assertIn(self.error_msg, context_repr) self.assertIn(repr(descriptor), context_repr) @@ -80,7 +80,7 @@ class TestNonStaffErrorModule(unittest.TestCase, SetupTestErrorModules): CourseLocationGenerator(self.course_id) ) descriptor.xmodule_runtime = self.system - context_repr = self.system.render(descriptor, 'student_view').content + context_repr = self.system.render(descriptor, STUDENT_VIEW).content self.assertNotIn(self.error_msg, context_repr) self.assertNotIn(repr(self.valid_xml), context_repr) @@ -94,7 +94,7 @@ class TestNonStaffErrorModule(unittest.TestCase, SetupTestErrorModules): descriptor, self.error_msg) self.assertIsInstance(error_descriptor, ErrorDescriptor) error_descriptor.xmodule_runtime = self.system - context_repr = self.system.render(error_descriptor, 'student_view').content + context_repr = self.system.render(error_descriptor, STUDENT_VIEW).content self.assertNotIn(self.error_msg, context_repr) self.assertNotIn(str(descriptor), context_repr) diff --git a/common/lib/xmodule/xmodule/tests/test_split_test_module.py b/common/lib/xmodule/xmodule/tests/test_split_test_module.py index b1a9947a19..f98c28ada6 100644 --- a/common/lib/xmodule/xmodule/tests/test_split_test_module.py +++ b/common/lib/xmodule/xmodule/tests/test_split_test_module.py @@ -9,6 +9,7 @@ from fs.memoryfs import MemoryFS from xmodule.tests.xml import factories as xml from xmodule.tests.xml import XModuleXmlImportTest from xmodule.tests import get_test_system +from xmodule.x_module import AUTHOR_VIEW, STUDENT_VIEW from xmodule.split_test_module import SplitTestDescriptor, SplitTestFields, ValidationMessageType from xmodule.partitions.partitions import Group, UserPartition from xmodule.partitions.test_partitions import StaticPartitionService, MemoryUserTagsService @@ -113,7 +114,7 @@ class SplitTestModuleLMSTest(SplitTestModuleTest): self.assertIn( child_content, - self.module_system.render(self.split_test_module, 'student_view').content + self.module_system.render(self.split_test_module, STUDENT_VIEW).content ) @ddt.data(('0',), ('1',)) @@ -176,7 +177,7 @@ class SplitTestModuleStudioTest(SplitTestModuleTest): # The split_test module should render both its groups when it is the root context = create_studio_context(self.split_test_module) - html = self.module_system.render(self.split_test_module, 'author_view', context).content + html = self.module_system.render(self.split_test_module, AUTHOR_VIEW, context).content self.assertIn('HTML FOR GROUP 0', html) self.assertIn('HTML FOR GROUP 1', html) # Note that the mock xblock system doesn't render the template but the parameters instead @@ -184,7 +185,7 @@ class SplitTestModuleStudioTest(SplitTestModuleTest): # When rendering as a child, it shouldn't render either of its groups context = create_studio_context(self.course_sequence) - html = self.module_system.render(self.split_test_module, 'author_view', context).content + html = self.module_system.render(self.split_test_module, AUTHOR_VIEW, context).content self.assertNotIn('HTML FOR GROUP 0', html) self.assertNotIn('HTML FOR GROUP 1', html) @@ -194,7 +195,7 @@ class SplitTestModuleStudioTest(SplitTestModuleTest): UserPartition(0, 'first_partition', 'First Partition', [Group("0", 'alpha'), Group("1", 'beta'), Group("2", 'gamma')]) ] - html = self.module_system.render(self.split_test_module, 'author_view', context).content + html = self.module_system.render(self.split_test_module, AUTHOR_VIEW, context).content self.assertIn('HTML FOR GROUP 0', html) self.assertIn('HTML FOR GROUP 1', html) # Note that the mock xblock system doesn't render the template but the parameters instead diff --git a/common/lib/xmodule/xmodule/tests/test_studio_editable.py b/common/lib/xmodule/xmodule/tests/test_studio_editable.py index 567c9a7bcf..327e82a75a 100644 --- a/common/lib/xmodule/xmodule/tests/test_studio_editable.py +++ b/common/lib/xmodule/xmodule/tests/test_studio_editable.py @@ -3,6 +3,7 @@ Tests for StudioEditableModule. """ from xmodule.tests.test_vertical import BaseVerticalModuleTest +from xmodule.x_module import AUTHOR_VIEW class StudioEditableModuleTestCase(BaseVerticalModuleTest): @@ -19,6 +20,6 @@ class StudioEditableModuleTestCase(BaseVerticalModuleTest): } # Both children of the vertical should be rendered as reorderable - self.module_system.render(self.vertical, 'author_view', context).content # pylint: disable=expression-not-assigned + self.module_system.render(self.vertical, AUTHOR_VIEW, context).content # pylint: disable=expression-not-assigned self.assertIn(self.vertical.get_children()[0].location, reorderable_items) self.assertIn(self.vertical.get_children()[1].location, reorderable_items) diff --git a/common/lib/xmodule/xmodule/tests/test_vertical.py b/common/lib/xmodule/xmodule/tests/test_vertical.py index 0b53b809a1..d1e0047313 100644 --- a/common/lib/xmodule/xmodule/tests/test_vertical.py +++ b/common/lib/xmodule/xmodule/tests/test_vertical.py @@ -6,6 +6,7 @@ from fs.memoryfs import MemoryFS from xmodule.tests import get_test_system from xmodule.tests.xml import XModuleXmlImportTest from xmodule.tests.xml import factories as xml +from xmodule.x_module import STUDENT_VIEW, AUTHOR_VIEW class BaseVerticalModuleTest(XModuleXmlImportTest): @@ -46,7 +47,7 @@ class VerticalModuleTestCase(BaseVerticalModuleTest): """ Test the rendering of the student view. """ - html = self.module_system.render(self.vertical, 'student_view', {}).content + html = self.module_system.render(self.vertical, STUDENT_VIEW, {}).content self.assertIn(self.test_html_1, html) self.assertIn(self.test_html_2, html) @@ -58,7 +59,7 @@ class VerticalModuleTestCase(BaseVerticalModuleTest): context = { 'container_view': False, } - html = self.module_system.render(self.vertical, 'author_view', context).content + html = self.module_system.render(self.vertical, AUTHOR_VIEW, context).content self.assertNotIn(self.test_html_1, html) self.assertNotIn(self.test_html_2, html) @@ -68,6 +69,6 @@ class VerticalModuleTestCase(BaseVerticalModuleTest): 'container_view': True, 'reorderable_items': reorderable_items, } - html = self.module_system.render(self.vertical, 'author_view', context).content + html = self.module_system.render(self.vertical, AUTHOR_VIEW, context).content self.assertIn(self.test_html_1, html) self.assertIn(self.test_html_2, html) diff --git a/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py b/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py index 37c812a5c2..62add6cca3 100644 --- a/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py +++ b/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py @@ -26,7 +26,7 @@ from xblock.fields import ScopeIds from opaque_keys.edx.locations import Location -from xmodule.x_module import ModuleSystem, XModule, XModuleDescriptor, DescriptorSystem +from xmodule.x_module import ModuleSystem, XModule, XModuleDescriptor, DescriptorSystem, STUDENT_VIEW, STUDIO_VIEW from xmodule.annotatable_module import AnnotatableDescriptor from xmodule.capa_module import CapaDescriptor from xmodule.course_module import CourseDescriptor @@ -324,7 +324,7 @@ class TestStudentView(XBlockWrapperTestMixin, TestCase): """ self.assertEqual( descriptor._xmodule.get_html(), - descriptor.render('student_view').content + descriptor.render(STUDENT_VIEW).content ) @@ -343,7 +343,7 @@ class TestStudioView(XBlockWrapperTestMixin, TestCase): """ Assert that studio_view and get_html render the same. """ - self.assertEqual(descriptor.get_html(), descriptor.render('studio_view').content) + self.assertEqual(descriptor.get_html(), descriptor.render(STUDIO_VIEW).content) class TestXModuleHandler(TestCase): diff --git a/common/lib/xmodule/xmodule/vertical_module.py b/common/lib/xmodule/xmodule/vertical_module.py index 2ee88480f5..292553ab6f 100644 --- a/common/lib/xmodule/xmodule/vertical_module.py +++ b/common/lib/xmodule/xmodule/vertical_module.py @@ -1,5 +1,5 @@ from xblock.fragment import Fragment -from xmodule.x_module import XModule +from xmodule.x_module import XModule, STUDENT_VIEW from xmodule.seq_module import SequenceDescriptor from xmodule.progress import Progress from xmodule.studio_editable import StudioEditableModule, StudioEditableDescriptor @@ -26,7 +26,7 @@ class VerticalModule(VerticalFields, XModule, StudioEditableModule): child_context['child_of_vertical'] = True for child in self.get_display_items(): - rendered_child = child.render('student_view', child_context) + rendered_child = child.render(STUDENT_VIEW, child_context) fragment.add_frag_resources(rendered_child) contents.append({ diff --git a/common/lib/xmodule/xmodule/x_module.py b/common/lib/xmodule/xmodule/x_module.py index 7c9f4575a6..1d3d8b66b1 100644 --- a/common/lib/xmodule/xmodule/x_module.py +++ b/common/lib/xmodule/xmodule/x_module.py @@ -32,6 +32,23 @@ log = logging.getLogger(__name__) XMODULE_METRIC_NAME = 'edxapp.xmodule' +# xblock view names + +# This is the view that will be rendered to display the XBlock in the LMS. +STUDENT_VIEW = 'student_view' + +# An optional view of the xblock similar to student_view, but with possible inline +# editing capabilities. This view differs from studio_view in that it should be as similar to student_view +# as possible. When previewing xblocks within Studio, Studio will prefer author_view to student_view. +AUTHOR_VIEW = 'author_view' + +# The view used to render an editor in Studio. The editor rendering can be completely different +# from the LMS student_view, and it is only shown with the author selects "Edit". +STUDIO_VIEW = 'studio_view' + +# Views that present a "preview" view of an xblock (as opposed to an editing view). +PREVIEW_VIEWS = [STUDENT_VIEW, AUTHOR_VIEW] + class OpaqueKeyReader(IdReader): """ @@ -934,7 +951,7 @@ class XModuleDescriptor(XModuleMixin, HTMLSnippet, ResourceTemplates, XBlock): get_score = module_attr('get_score') handle_ajax = module_attr('handle_ajax') max_score = module_attr('max_score') - student_view = module_attr('student_view') + student_view = module_attr(STUDENT_VIEW) get_child_descriptors = module_attr('get_child_descriptors') xmodule_handler = module_attr('xmodule_handler') @@ -1138,7 +1155,7 @@ class DescriptorSystem(MetricsMixin, ConfigurableFragmentWrapper, Runtime): # p return result def render(self, block, view_name, context=None): - if view_name in ['student_view', 'author_view']: + if view_name in PREVIEW_VIEWS: assert block.xmodule_runtime is not None if isinstance(block, (XModule, XModuleDescriptor)): to_render = block._xmodule diff --git a/lms/djangoapps/courseware/courses.py b/lms/djangoapps/courseware/courses.py index 3d524699e7..81e7a2f072 100644 --- a/lms/djangoapps/courseware/courses.py +++ b/lms/djangoapps/courseware/courses.py @@ -15,6 +15,7 @@ from xmodule.contentstore.content import StaticContent from xmodule.modulestore.exceptions import ItemNotFoundError from static_replace import replace_static_urls from xmodule.modulestore import MONGO_MODULESTORE_TYPE +from xmodule.x_module import STUDENT_VIEW from courseware.access import has_access from courseware.model_data import FieldDataCache @@ -196,7 +197,7 @@ def get_course_about_section(course, section_key): if about_module is not None: try: - html = about_module.render('student_view').content + html = about_module.render(STUDENT_VIEW).content except Exception: # pylint: disable=broad-except html = render_to_string('courseware/error-message.html', None) log.exception( @@ -250,7 +251,7 @@ def get_course_info_section(request, course, section_key): if info_module is not None: try: - html = info_module.render('student_view').content + html = info_module.render(STUDENT_VIEW).content except Exception: # pylint: disable=broad-except html = render_to_string('courseware/error-message.html', None) log.exception( diff --git a/lms/djangoapps/courseware/tests/test_lti_integration.py b/lms/djangoapps/courseware/tests/test_lti_integration.py index 0d95fd0172..6b53ac7a3e 100644 --- a/lms/djangoapps/courseware/tests/test_lti_integration.py +++ b/lms/djangoapps/courseware/tests/test_lti_integration.py @@ -12,6 +12,7 @@ from django.conf import settings from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory +from xmodule.x_module import STUDENT_VIEW from courseware.tests import BaseTestXmodule from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE @@ -108,7 +109,7 @@ class TestLTI(BaseTestXmodule): self.addCleanup(patcher.stop) def test_lti_constructor(self): - generated_content = self.item_descriptor.render('student_view').content + generated_content = self.item_descriptor.render(STUDENT_VIEW).content expected_content = self.runtime.render_template('lti.html', self.expected_context) self.assertEqual(generated_content, expected_content) diff --git a/lms/djangoapps/courseware/tests/test_module_render.py b/lms/djangoapps/courseware/tests/test_module_render.py index 4f58281c4a..c9770ff691 100644 --- a/lms/djangoapps/courseware/tests/test_module_render.py +++ b/lms/djangoapps/courseware/tests/test_module_render.py @@ -22,7 +22,7 @@ from xmodule.lti_module import LTIDescriptor from xmodule.modulestore.django import modulestore from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import ItemFactory, CourseFactory -from xmodule.x_module import XModuleDescriptor +from xmodule.x_module import XModuleDescriptor, STUDENT_VIEW from opaque_keys.edx.locations import SlashSeparatedCourseKey from courseware import module_render as render @@ -94,7 +94,7 @@ class ModuleRenderTestCase(ModuleStoreTestCase, LoginEnrollmentTestCase): ) # get the rendered HTML output which should have the rewritten link - html = module.render('student_view').content + html = module.render(STUDENT_VIEW).content # See if the url got rewritten to the target link # note if the URL mapping changes then this assertion will break @@ -416,7 +416,7 @@ class TestHtmlModifiers(ModuleStoreTestCase): self.course.id, wrap_xmodule_display=True, ) - result_fragment = module.render('student_view') + result_fragment = module.render(STUDENT_VIEW) self.assertIn('div class="xblock xblock-student_view xmodule_display xmodule_HtmlModule"', result_fragment.content) @@ -429,7 +429,7 @@ class TestHtmlModifiers(ModuleStoreTestCase): self.course.id, wrap_xmodule_display=False, ) - result_fragment = module.render('student_view') + result_fragment = module.render(STUDENT_VIEW) self.assertNotIn('div class="xblock xblock-student_view xmodule_display xmodule_HtmlModule"', result_fragment.content) @@ -441,7 +441,7 @@ class TestHtmlModifiers(ModuleStoreTestCase): self.field_data_cache, self.course.id, ) - result_fragment = module.render('student_view') + result_fragment = module.render(STUDENT_VIEW) self.assertIn( '/c4x/{org}/{course}/asset/foo_content'.format( @@ -459,7 +459,7 @@ class TestHtmlModifiers(ModuleStoreTestCase): self.field_data_cache, self.course.id, ) - result_fragment = module.render('student_view') + result_fragment = module.render(STUDENT_VIEW) self.assertIn( '/c4x/{org}/{course}/asset/_file.jpg'.format( @@ -483,7 +483,7 @@ class TestHtmlModifiers(ModuleStoreTestCase): self.course.id, static_asset_path="toy_course_dir", ) - result_fragment = module.render('student_view') + result_fragment = module.render(STUDENT_VIEW) self.assertIn('href="/static/toy_course_dir', result_fragment.content) def test_course_image(self): @@ -509,7 +509,7 @@ class TestHtmlModifiers(ModuleStoreTestCase): self.field_data_cache, self.course.id, ) - result_fragment = module.render('student_view') + result_fragment = module.render(STUDENT_VIEW) self.assertIn( '/courses/{course_id}/bar/content'.format( @@ -590,14 +590,14 @@ class MongoViewInStudioTest(ViewInStudioTest): def test_view_in_studio_link_studio_course(self): """Regular Studio courses should see 'View in Studio' links.""" self.setup_mongo_course() - result_fragment = self.module.render('student_view') + result_fragment = self.module.render(STUDENT_VIEW) self.assertIn('View Unit in Studio', result_fragment.content) def test_view_in_studio_link_only_in_top_level_vertical(self): """Regular Studio courses should not see 'View in Studio' for child verticals of verticals.""" self.setup_mongo_course() # Render the parent vertical, then check that there is only a single "View Unit in Studio" link. - result_fragment = self.module.render('student_view') + result_fragment = self.module.render(STUDENT_VIEW) # The single "View Unit in Studio" link should appear before the first xmodule vertical definition. parts = result_fragment.content.split('xmodule_VerticalModule') self.assertEqual(3, len(parts), "Did not find two vertical modules") @@ -608,7 +608,7 @@ class MongoViewInStudioTest(ViewInStudioTest): def test_view_in_studio_link_xml_authored(self): """Courses that change 'course_edit_method' setting can hide 'View in Studio' links.""" self.setup_mongo_course(course_edit_method='XML') - result_fragment = self.module.render('student_view') + result_fragment = self.module.render(STUDENT_VIEW) self.assertNotIn('View Unit in Studio', result_fragment.content) @@ -622,19 +622,19 @@ class MixedViewInStudioTest(ViewInStudioTest): def test_view_in_studio_link_mongo_backed(self): """Mixed mongo courses that are mongo backed should see 'View in Studio' links.""" self.setup_mongo_course() - result_fragment = self.module.render('student_view') + result_fragment = self.module.render(STUDENT_VIEW) self.assertIn('View Unit in Studio', result_fragment.content) def test_view_in_studio_link_xml_authored(self): """Courses that change 'course_edit_method' setting can hide 'View in Studio' links.""" self.setup_mongo_course(course_edit_method='XML') - result_fragment = self.module.render('student_view') + result_fragment = self.module.render(STUDENT_VIEW) self.assertNotIn('View Unit in Studio', result_fragment.content) def test_view_in_studio_link_xml_backed(self): """Course in XML only modulestore should not see 'View in Studio' links.""" self.setup_xml_course() - result_fragment = self.module.render('student_view') + result_fragment = self.module.render(STUDENT_VIEW) self.assertNotIn('View Unit in Studio', result_fragment.content) @@ -648,7 +648,7 @@ class XmlViewInStudioTest(ViewInStudioTest): def test_view_in_studio_link_xml_backed(self): """Course in XML only modulestore should not see 'View in Studio' links.""" self.setup_xml_course() - result_fragment = self.module.render('student_view') + result_fragment = self.module.render(STUDENT_VIEW) self.assertNotIn('View Unit in Studio', result_fragment.content) @@ -694,7 +694,7 @@ class TestStaffDebugInfo(ModuleStoreTestCase): self.field_data_cache, self.course.id, ) - result_fragment = module.render('student_view') + result_fragment = module.render(STUDENT_VIEW) self.assertNotIn('Staff Debug', result_fragment.content) def test_staff_debug_info_enabled(self): @@ -705,7 +705,7 @@ class TestStaffDebugInfo(ModuleStoreTestCase): self.field_data_cache, self.course.id, ) - result_fragment = module.render('student_view') + result_fragment = module.render(STUDENT_VIEW) self.assertIn('Staff Debug', result_fragment.content) @patch.dict('django.conf.settings.FEATURES', {'DISPLAY_HISTOGRAMS_TO_STAFF': False}) @@ -717,7 +717,7 @@ class TestStaffDebugInfo(ModuleStoreTestCase): self.field_data_cache, self.course.id, ) - result_fragment = module.render('student_view') + result_fragment = module.render(STUDENT_VIEW) self.assertNotIn('histrogram', result_fragment.content) def test_histogram_enabled_for_unscored_xmodules(self): @@ -741,7 +741,7 @@ class TestStaffDebugInfo(ModuleStoreTestCase): field_data_cache, self.course.id, ) - module.render('student_view') + module.render(STUDENT_VIEW) self.assertFalse(mock_grade_histogram.called) def test_histogram_enabled_for_scored_xmodules(self): @@ -764,7 +764,7 @@ class TestStaffDebugInfo(ModuleStoreTestCase): self.field_data_cache, self.course.id, ) - module.render('student_view') + module.render(STUDENT_VIEW) self.assertTrue(mock_grade_histogram.called) diff --git a/lms/djangoapps/courseware/tests/test_video_handlers.py b/lms/djangoapps/courseware/tests/test_video_handlers.py index 28126a4970..0a502cb77d 100644 --- a/lms/djangoapps/courseware/tests/test_video_handlers.py +++ b/lms/djangoapps/courseware/tests/test_video_handlers.py @@ -12,6 +12,7 @@ from webob import Request from xmodule.contentstore.content import StaticContent from xmodule.contentstore.django import contentstore from xmodule.modulestore.django import editable_modulestore +from xmodule.x_module import STUDENT_VIEW from . import BaseTestXmodule from .test_video_xml import SOURCE_XML from cache_toolbox.core import del_cached_content @@ -175,7 +176,7 @@ class TestTranscriptAvailableTranslationsDispatch(TestVideo): def setUp(self): super(TestTranscriptAvailableTranslationsDispatch, self).setUp() - self.item_descriptor.render('student_view') + self.item_descriptor.render(STUDENT_VIEW) self.item = self.item_descriptor.xmodule_runtime.xmodule_instance self.subs = {"start": [10], "end": [100], "text": ["Hi, welcome to Edx."]} @@ -234,7 +235,7 @@ class TestTranscriptDownloadDispatch(TestVideo): def setUp(self): super(TestTranscriptDownloadDispatch, self).setUp() - self.item_descriptor.render('student_view') + self.item_descriptor.render(STUDENT_VIEW) self.item = self.item_descriptor.xmodule_runtime.xmodule_instance def test_download_transcript_not_exist(self): @@ -299,7 +300,7 @@ class TestTranscriptTranslationGetDispatch(TestVideo): def setUp(self): super(TestTranscriptTranslationGetDispatch, self).setUp() - self.item_descriptor.render('student_view') + self.item_descriptor.render(STUDENT_VIEW) self.item = self.item_descriptor.xmodule_runtime.xmodule_instance def test_translation_fails(self): @@ -609,7 +610,7 @@ class TestGetTranscript(TestVideo): def setUp(self): super(TestGetTranscript, self).setUp() - self.item_descriptor.render('student_view') + self.item_descriptor.render(STUDENT_VIEW) self.item = self.item_descriptor.xmodule_runtime.xmodule_instance def test_good_transcript(self): diff --git a/lms/djangoapps/courseware/tests/test_video_mongo.py b/lms/djangoapps/courseware/tests/test_video_mongo.py index d4053753e3..0a8beca65a 100644 --- a/lms/djangoapps/courseware/tests/test_video_mongo.py +++ b/lms/djangoapps/courseware/tests/test_video_mongo.py @@ -13,6 +13,7 @@ from xblock.field_data import DictFieldData from xmodule.video_module import create_youtube_string from xmodule.tests import get_test_descriptor_system from xmodule.video_module import VideoDescriptor +from xmodule.x_module import STUDENT_VIEW from opaque_keys.edx.locations import SlashSeparatedCourseKey from . import BaseTestXmodule @@ -25,7 +26,7 @@ class TestVideoYouTube(TestVideo): def test_video_constructor(self): """Make sure that all parameters extracted correctly from xml""" - context = self.item_descriptor.render('student_view').content + context = self.item_descriptor.render(STUDENT_VIEW).content sources = json.dumps([u'example.mp4', u'example.webm']) expected_context = { @@ -89,7 +90,7 @@ class TestVideoNonYouTube(TestVideo): """Make sure that if the 'youtube' attribute is omitted in XML, then the template generates an empty string for the YouTube streams. """ - context = self.item_descriptor.render('student_view').content + context = self.item_descriptor.render(STUDENT_VIEW).content sources = json.dumps([u'example.mp4', u'example.webm']) expected_context = { @@ -231,7 +232,7 @@ class TestGetHtmlMethod(BaseTestXmodule): self.item_descriptor, 'transcript', 'download' ).rstrip('/?') - context = self.item_descriptor.render('student_view').content + context = self.item_descriptor.render(STUDENT_VIEW).content expected_context.update({ 'transcript_download_format': None if self.item_descriptor.track and self.item_descriptor.download_track else 'srt', @@ -344,7 +345,7 @@ class TestGetHtmlMethod(BaseTestXmodule): sources=data['sources'] ) self.initialize_module(data=DATA) - context = self.item_descriptor.render('student_view').content + context = self.item_descriptor.render(STUDENT_VIEW).content expected_context = dict(initial_context) expected_context.update({ diff --git a/lms/djangoapps/courseware/tests/test_word_cloud.py b/lms/djangoapps/courseware/tests/test_word_cloud.py index 3d2a235e41..1721abd9b9 100644 --- a/lms/djangoapps/courseware/tests/test_word_cloud.py +++ b/lms/djangoapps/courseware/tests/test_word_cloud.py @@ -5,6 +5,7 @@ import json from operator import itemgetter from . import BaseTestXmodule +from xmodule.x_module import STUDENT_VIEW class TestWordCloud(BaseTestXmodule): @@ -242,7 +243,7 @@ class TestWordCloud(BaseTestXmodule): def test_word_cloud_constructor(self): """Make sure that all parameters extracted correclty from xml""" - fragment = self.runtime.render(self.item_descriptor, 'student_view') + fragment = self.runtime.render(self.item_descriptor, STUDENT_VIEW) expected_context = { 'ajax_url': self.item_descriptor.xmodule_runtime.ajax_url, diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py index ce9a9d15a5..dc256dbc5d 100644 --- a/lms/djangoapps/courseware/views.py +++ b/lms/djangoapps/courseware/views.py @@ -42,6 +42,7 @@ from xmodule.modulestore.django import modulestore from xmodule.modulestore.exceptions import ItemNotFoundError, NoPathToItem from xmodule.modulestore.search import path_to_location from xmodule.tabs import CourseTabList, StaffGradingTab, PeerGradingTab, OpenEndedGradingTab +from xmodule.x_module import STUDENT_VIEW import shoppingcart from opaque_keys import InvalidKeyError @@ -377,7 +378,7 @@ def index(request, course_id, chapter=None, section=None, # Save where we are in the chapter save_child_position(chapter_module, section) - context['fragment'] = section_module.render('student_view') + context['fragment'] = section_module.render(STUDENT_VIEW) context['section_title'] = section_descriptor.display_name_with_default else: # section is none, so display a message @@ -865,7 +866,7 @@ def get_static_tab_contents(request, course, tab): html = '' if tab_module is not None: try: - html = tab_module.render('student_view').content + html = tab_module.render(STUDENT_VIEW).content except Exception: # pylint: disable=broad-except html = render_to_string('courseware/error-message.html', None) log.exception(