diff --git a/cms/djangoapps/contentstore/views/component.py b/cms/djangoapps/contentstore/views/component.py index 716a38e1b2..5d938eef8a 100644 --- a/cms/djangoapps/contentstore/views/component.py +++ b/cms/djangoapps/contentstore/views/component.py @@ -16,6 +16,7 @@ from xmodule.modulestore.django import modulestore from xblock.core import XBlock from xblock.django.request import webob_to_django_response, django_to_webob_request from xblock.exceptions import NoSuchHandlerError +from xblock.fields import Scope from xblock.plugin import PluginMissingError from xblock.runtime import Mixologist diff --git a/cms/djangoapps/contentstore/views/item.py b/cms/djangoapps/contentstore/views/item.py index 95a5111bde..0568ca747f 100644 --- a/cms/djangoapps/contentstore/views/item.py +++ b/cms/djangoapps/contentstore/views/item.py @@ -264,7 +264,7 @@ def xblock_view_handler(request, usage_key_string, view_name): # pylint: disable=too-many-format-args return HttpResponse( content="Couldn't parse paging parameters: enable_paging: " - "%s, page_number: %s, page_size: %s".format( + "{0}, page_number: {1}, page_size: {2}".format( request.REQUEST.get('enable_paging', 'false'), request.REQUEST.get('page_number', 0), request.REQUEST.get('page_size', 0) @@ -273,6 +273,8 @@ def xblock_view_handler(request, usage_key_string, view_name): content_type="text/plain", ) + force_render = request.REQUEST.get('force_render', None) + # Set up the context to be passed to each XBlock's render method. context = { 'is_pages_view': is_pages_view, # This setting disables the recursive wrapping of xblocks @@ -281,6 +283,7 @@ def xblock_view_handler(request, usage_key_string, view_name): 'root_xblock': xblock if (view_name == 'container_preview') else None, 'reorderable_items': reorderable_items, 'paging': paging, + 'force_render': force_render, } fragment = get_preview_fragment(request, xblock, context) diff --git a/cms/djangoapps/contentstore/views/library.py b/cms/djangoapps/contentstore/views/library.py index eee21bfc1d..0a7a0e2504 100644 --- a/cms/djangoapps/contentstore/views/library.py +++ b/cms/djangoapps/contentstore/views/library.py @@ -231,4 +231,5 @@ def manage_library_users(request, library_key_string): 'allow_actions': bool(user_perms & STUDIO_EDIT_ROLES), 'library_key': unicode(library_key), 'lib_users_url': reverse_library_url('manage_library_users', library_key_string), + 'show_children_previews': library.show_children_previews }) diff --git a/cms/djangoapps/contentstore/views/preview.py b/cms/djangoapps/contentstore/views/preview.py index f192121d2a..e831ca7dd1 100644 --- a/cms/djangoapps/contentstore/views/preview.py +++ b/cms/djangoapps/contentstore/views/preview.py @@ -113,6 +113,12 @@ class PreviewModuleSystem(ModuleSystem): # pylint: disable=abstract-method if aside_type != 'acid_aside' ] + def render_child_placeholder(self, block, view_name, context): + """ + Renders a placeholder XBlock. + """ + return self.wrap_xblock(block, view_name, Fragment(), context) + class StudioPermissionsService(object): """ @@ -240,6 +246,7 @@ def _studio_wrap_xblock(xblock, view, frag, context, display_name_only=False): template_context = { 'xblock_context': context, 'xblock': xblock, + 'show_preview': context.get('show_preview', True), 'content': frag.content, 'is_root': is_root, 'is_reorderable': is_reorderable, diff --git a/cms/static/js/spec/views/paged_container_spec.js b/cms/static/js/spec/views/paged_container_spec.js index 524f88e552..a165610c18 100644 --- a/cms/static/js/spec/views/paged_container_spec.js +++ b/cms/static/js/spec/views/paged_container_spec.js @@ -1,12 +1,23 @@ define([ "jquery", "underscore", "js/common_helpers/ajax_helpers", "URI", "js/models/xblock_info", - "js/views/paged_container", "js/views/paging_header", "js/views/paging_footer"], - function ($, _, AjaxHelpers, URI, XBlockInfo, PagedContainer, PagingHeader, PagingFooter) { + "js/views/paged_container", "js/views/paging_header", "js/views/paging_footer", "js/views/xblock"], + function ($, _, AjaxHelpers, URI, XBlockInfo, PagedContainer, PagingHeader, PagingFooter, XBlockView) { var htmlResponseTpl = _.template('' + - '
' + '
' ); - function getResponseHtml(options){ + function getResponseHtml(override_options){ + var default_options = { + start: 0, + displayed: PAGE_SIZE, + total: PAGE_SIZE + 1, + previews: true + }; + var options = _.extend(default_options, override_options); return '
' + '
' + htmlResponseTpl(options) + @@ -14,43 +25,43 @@ define([ "jquery", "underscore", "js/common_helpers/ajax_helpers", "URI", "js/mo '
' } + var makePage = function(html_parameters) { + return { + resources: [], + html: getResponseHtml(html_parameters) + }; + }; + var PAGE_SIZE = 3; - var mockFirstPage = { - resources: [], - html: getResponseHtml({ + var mockFirstPage = makePage({ start: 0, displayed: PAGE_SIZE, total: PAGE_SIZE + 1 - }) - }; + }); - var mockSecondPage = { - resources: [], - html: getResponseHtml({ - start: PAGE_SIZE, - displayed: 1, - total: PAGE_SIZE + 1 - }) - }; + var mockSecondPage = makePage({ + start: PAGE_SIZE, + displayed: 1, + total: PAGE_SIZE + 1 + }); - var mockEmptyPage = { - resources: [], - html: getResponseHtml({ - start: 0, - displayed: 0, - total: 0 - }) - }; + var mockEmptyPage = makePage({ + start: 0, + displayed: 0, + total: 0 + }); - var respondWithMockPage = function(requests) { + var respondWithMockPage = function(requests, mockPage) { var requestIndex = requests.length - 1; - var request = requests[requestIndex]; - var url = new URI(request.url); - var queryParameters = url.query(true); // Returns an object with each query parameter stored as a value - var page = queryParameters.page_number; - var response = page === "0" ? mockFirstPage : mockSecondPage; - AjaxHelpers.respondWithJson(requests, response, requestIndex); + if (typeof mockPage == 'undefined') { + var request = requests[requestIndex]; + var url = new URI(request.url); + var queryParameters = url.query(true); // Returns an object with each query parameter stored as a value + var page = queryParameters.page_number; + mockPage = page === "0" ? mockFirstPage : mockSecondPage; + } + AjaxHelpers.respondWithJson(requests, mockPage, requestIndex); }; var MockPagingView = PagedContainer.extend({ @@ -65,10 +76,26 @@ define([ "jquery", "underscore", "js/common_helpers/ajax_helpers", "URI", "js/mo beforeEach(function () { var feedbackTpl = readFixtures('system-feedback.underscore'); setFixtures($(" + + +
+ +
+
+
+
+ +
+
    +
  • + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
    +
  • + +
  • +
+
+
+
+ +
+
+
+
+
+
+
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ diff --git a/cms/templates/library.html b/cms/templates/library.html index 24d69bffd8..77406ce0a7 100644 --- a/cms/templates/library.html +++ b/cms/templates/library.html @@ -27,7 +27,8 @@ from django.utils.translation import ugettext as _ { isUnitPage: false, page_size: 10, - canEdit: ${"true" if can_edit else "false"} + canEdit: ${"true" if can_edit else "false"}, + showChildrenPreviews: ${'true' if show_children_previews else 'false'} } ); }); @@ -53,7 +54,13 @@ from django.utils.translation import ugettext as _ ${_("Add Component")} - + + diff --git a/cms/templates/studio_xblock_wrapper.html b/cms/templates/studio_xblock_wrapper.html index 8f22f245ae..e8217b8545 100644 --- a/cms/templates/studio_xblock_wrapper.html +++ b/cms/templates/studio_xblock_wrapper.html @@ -47,7 +47,11 @@ messages = json.dumps(xblock.validate().to_json()) % endif
-
+