3333from django .views .generic import View
3434from edx_django_utils .monitoring import set_custom_attribute , set_custom_attributes_for_course_key
3535from ipware .ip import get_client_ip
36+ from lms .djangoapps .static_template_view .views import render_500
3637from markupsafe import escape
3738from opaque_keys import InvalidKeyError
3839from opaque_keys .edx .keys import CourseKey , UsageKey
39- from openedx_filters .learning .filters import CourseAboutRenderStarted
40+ from openedx_filters .learning .filters import CourseAboutRenderStarted , RenderXBlockStarted
4041from requests .exceptions import ConnectionError , Timeout # pylint: disable=redefined-builtin
4142from pytz import UTC
4243from rest_framework import status
@@ -1532,7 +1533,7 @@ def _check_sequence_exam_access(request, location):
15321533@xframe_options_exempt
15331534@transaction .non_atomic_requests
15341535@ensure_csrf_cookie
1535- def render_xblock (request , usage_key_string , check_if_enrolled = True , disable_staff_debug_info = False ):
1536+ def render_xblock (request , usage_key_string , check_if_enrolled = True , disable_staff_debug_info = False ): # pylint: disable=too-many-statements
15361537 """
15371538 Returns an HttpResponse with HTML content for the xBlock with the given usage_key.
15381539 The returned HTML is a chromeless rendering of the xBlock (excluding content of the containing courseware).
@@ -1641,11 +1642,7 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta
16411642 if not _check_sequence_exam_access (request , seq_block .location ):
16421643 return HttpResponseForbidden ("Access to exam content is restricted" )
16431644
1644- fragment = block .render (requested_view , context = student_view_context )
1645- optimization_flags = get_optimization_flags_for_content (block , fragment )
1646-
16471645 context = {
1648- 'fragment' : fragment ,
16491646 'course' : course ,
16501647 'block' : block ,
16511648 'disable_accordion' : True ,
@@ -1666,10 +1663,33 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta
16661663 'is_learning_mfe' : is_learning_mfe ,
16671664 'is_mobile_app' : is_mobile_app ,
16681665 'render_course_wide_assets' : True ,
1666+ }
1667+
1668+ try :
1669+ # .. filter_implemented_name: RenderXBlockStarted
1670+ # .. filter_type: org.openedx.learning.xblock.render.started.v1
1671+ context , student_view_context = RenderXBlockStarted .run_filter (
1672+ context = context , student_view_context = student_view_context
1673+ )
1674+ except RenderXBlockStarted .PreventXBlockBlockRender as exc :
1675+ log .info ("Halted rendering block %s. Reason: %s" , usage_key_string , exc .message )
1676+ return render_500 (request )
1677+ except RenderXBlockStarted .RenderCustomResponse as exc :
1678+ log .info ("Rendering custom exception for block %s. Reason: %s" , usage_key_string , exc .message )
1679+ context .update ({
1680+ 'fragment' : Fragment (exc .response )
1681+ })
1682+ return render_to_response ('courseware/courseware-chromeless.html' , context , request = request )
16691683
1684+ fragment = block .render (requested_view , context = student_view_context )
1685+ optimization_flags = get_optimization_flags_for_content (block , fragment )
1686+
1687+ context .update ({
1688+ 'fragment' : fragment ,
16701689 ** optimization_flags ,
1671- }
1672- return render_to_response ('courseware/courseware-chromeless.html' , context )
1690+ })
1691+
1692+ return render_to_response ('courseware/courseware-chromeless.html' , context , request = request )
16731693
16741694
16751695def get_optimization_flags_for_content (block , fragment ):
0 commit comments