33
33
from django .views .generic import View
34
34
from edx_django_utils .monitoring import set_custom_attribute , set_custom_attributes_for_course_key
35
35
from ipware .ip import get_client_ip
36
+ from lms .djangoapps .static_template_view .views import render_500
36
37
from markupsafe import escape
37
38
from opaque_keys import InvalidKeyError
38
39
from opaque_keys .edx .keys import CourseKey , UsageKey
39
- from openedx_filters .learning .filters import CourseAboutRenderStarted
40
+ from openedx_filters .learning .filters import CourseAboutRenderStarted , RenderXBlockStarted
40
41
from requests .exceptions import ConnectionError , Timeout # pylint: disable=redefined-builtin
41
42
from pytz import UTC
42
43
from rest_framework import status
@@ -1532,7 +1533,7 @@ def _check_sequence_exam_access(request, location):
1532
1533
@xframe_options_exempt
1533
1534
@transaction .non_atomic_requests
1534
1535
@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
1536
1537
"""
1537
1538
Returns an HttpResponse with HTML content for the xBlock with the given usage_key.
1538
1539
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
1641
1642
if not _check_sequence_exam_access (request , seq_block .location ):
1642
1643
return HttpResponseForbidden ("Access to exam content is restricted" )
1643
1644
1644
- fragment = block .render (requested_view , context = student_view_context )
1645
- optimization_flags = get_optimization_flags_for_content (block , fragment )
1646
-
1647
1645
context = {
1648
- 'fragment' : fragment ,
1649
1646
'course' : course ,
1650
1647
'block' : block ,
1651
1648
'disable_accordion' : True ,
@@ -1666,10 +1663,33 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta
1666
1663
'is_learning_mfe' : is_learning_mfe ,
1667
1664
'is_mobile_app' : is_mobile_app ,
1668
1665
'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 )
1669
1683
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 ,
1670
1689
** 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 )
1673
1693
1674
1694
1675
1695
def get_optimization_flags_for_content (block , fragment ):
0 commit comments