From 054aa95b262294e1afb5ef6fcc129724aa716be2 Mon Sep 17 00:00:00 2001 From: Andy Armstrong Date: Mon, 19 Oct 2015 12:28:48 -0400 Subject: [PATCH] Allow non-public XBlock assets in debug mode --- cms/envs/common.py | 3 +++ cms/urls.py | 2 +- lms/djangoapps/courseware/module_render.py | 18 ------------------ lms/envs/common.py | 3 +++ lms/urls.py | 2 +- .../core/djangoapps/common_views/__init__.py | 0 .../core/djangoapps/common_views}/xblock.py | 11 +++++++++-- 7 files changed, 17 insertions(+), 22 deletions(-) create mode 100644 openedx/core/djangoapps/common_views/__init__.py rename {cms/djangoapps/contentstore/views => openedx/core/djangoapps/common_views}/xblock.py (64%) diff --git a/cms/envs/common.py b/cms/envs/common.py index 449b64148f..c753a7031d 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -711,6 +711,9 @@ INSTALLED_APPS = ( 'south', 'method_override', + # Common views + 'openedx.core.djangoapps.common_views', + # History tables 'simple_history', diff --git a/cms/urls.py b/cms/urls.py index 799877ed5a..f40ef70635 100644 --- a/cms/urls.py +++ b/cms/urls.py @@ -32,7 +32,7 @@ urlpatterns = patterns( 'contentstore.views.component_handler', name='component_handler'), url(r'^xblock/resource/(?P[^/]*)/(?P.*)$', - 'contentstore.views.xblock.xblock_resource', name='xblock_resource_url'), + 'openedx.core.djangoapps.common_views.xblock.xblock_resource', name='xblock_resource_url'), # temporary landing page for a course url(r'^edge/(?P[^/]+)/(?P[^/]+)/course/(?P[^/]+)$', diff --git a/lms/djangoapps/courseware/module_render.py b/lms/djangoapps/courseware/module_render.py index 4c169391e3..39b20449f4 100644 --- a/lms/djangoapps/courseware/module_render.py +++ b/lms/djangoapps/courseware/module_render.py @@ -5,7 +5,6 @@ Module rendering import hashlib import json import logging -import mimetypes import static_replace @@ -946,23 +945,6 @@ def handle_xblock_callback(request, course_id, usage_id, handler, suffix=None): return _invoke_xblock_handler(request, course_id, usage_id, handler, suffix, course=course) -def xblock_resource(request, block_type, uri): # pylint: disable=unused-argument - """ - Return a package resource for the specified XBlock. - """ - try: - xblock_class = XBlock.load_class(block_type, select=settings.XBLOCK_SELECT_FUNCTION) - content = xblock_class.open_local_resource(uri) - except IOError: - log.info('Failed to load xblock resource', exc_info=True) - raise Http404 - except Exception: # pylint: disable=broad-except - log.error('Failed to load xblock resource', exc_info=True) - raise Http404 - mimetype, _ = mimetypes.guess_type(uri) - return HttpResponse(content, mimetype=mimetype) - - def get_module_by_usage_id(request, course_id, usage_id, disable_staff_debug_info=False, course=None): """ Gets a module instance based on its `usage_id` in a course, for a given request/user diff --git a/lms/envs/common.py b/lms/envs/common.py index 7cf5392f76..9b761399ac 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -1794,6 +1794,9 @@ INSTALLED_APPS = ( 'djcelery', 'south', + # Common views + 'openedx.core.djangoapps.common_views', + # History tables 'simple_history', diff --git a/lms/urls.py b/lms/urls.py index 5c68a58644..6ef2f67cdb 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -307,7 +307,7 @@ if settings.COURSEWARE_ENABLED: # xblock Resource URL url( r'xblock/resource/(?P[^/]+)/(?P.*)$', - 'courseware.module_render.xblock_resource', + 'openedx.core.djangoapps.common_views.xblock.xblock_resource', name='xblock_resource_url', ), diff --git a/openedx/core/djangoapps/common_views/__init__.py b/openedx/core/djangoapps/common_views/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cms/djangoapps/contentstore/views/xblock.py b/openedx/core/djangoapps/common_views/xblock.py similarity index 64% rename from cms/djangoapps/contentstore/views/xblock.py rename to openedx/core/djangoapps/common_views/xblock.py index 948a039855..e800bf2432 100644 --- a/cms/djangoapps/contentstore/views/xblock.py +++ b/openedx/core/djangoapps/common_views/xblock.py @@ -1,10 +1,11 @@ """ -Views dedicated to rendering xblocks. +Common views dedicated to rendering xblocks. """ from __future__ import absolute_import import logging import mimetypes +import pkg_resources from xblock.core import XBlock @@ -21,7 +22,13 @@ def xblock_resource(request, block_type, uri): # pylint: disable=unused-argumen """ try: xblock_class = XBlock.load_class(block_type, select=settings.XBLOCK_SELECT_FUNCTION) - content = xblock_class.open_local_resource(uri) + # Note: in debug mode, return any file rather than going through the XBlock which + # will only return public files. This allows unbundled files to be served up + # during development. + if settings.DEBUG: + content = pkg_resources.resource_stream(xblock_class.__module__, uri) + else: + content = xblock_class.open_local_resource(uri) except IOError: log.info('Failed to load xblock resource', exc_info=True) raise Http404