From 93950931fd9934592d04a35ef8131031f614af97 Mon Sep 17 00:00:00 2001 From: nsprenkle Date: Fri, 24 May 2024 13:43:25 -0400 Subject: [PATCH 1/8] feat: add filter to hook render of XBlock --- lms/djangoapps/courseware/views/views.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 7df0a1648ae4..13a479623974 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -33,10 +33,11 @@ from django.views.generic import View from edx_django_utils.monitoring import set_custom_attribute, set_custom_attributes_for_course_key from ipware.ip import get_client_ip +from lms.djangoapps.static_template_view.views import render_500 from markupsafe import escape from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey, UsageKey -from openedx_filters.learning.filters import CourseAboutRenderStarted +from openedx_filters.learning.filters import CourseAboutRenderStarted, RenderXBlockStarted from requests.exceptions import ConnectionError, Timeout # pylint: disable=redefined-builtin from pytz import UTC from rest_framework import status @@ -1669,7 +1670,18 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta **optimization_flags, } - return render_to_response('courseware/courseware-chromeless.html', context) + + try: + # .. filter_implemented_name: RenderXBlockStarted + # .. filter_type: org.openedx.learning.xblock.render.started.v1 + context, student_view_context = RenderXBlockStarted.run_filter( + context=context, student_view_context=student_view_context + ) + except RenderXBlockStarted.PreventXBlockBlockRender as exc: + log.info("Skipping rendering block %s. Reason: %s", usage_key_string, exc.message) + return render_500() + + return render_to_response('courseware/courseware-chromeless.html', context, request=request) def get_optimization_flags_for_content(block, fragment): From 7718a6d5cf0514cce7b6fbf5c7fa7fafd180b619 Mon Sep 17 00:00:00 2001 From: nsprenkle Date: Mon, 3 Jun 2024 14:51:43 -0400 Subject: [PATCH 2/8] refactor: rename xblock render filter --- lms/djangoapps/courseware/views/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 13a479623974..92602a2baabe 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -37,7 +37,7 @@ from markupsafe import escape from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey, UsageKey -from openedx_filters.learning.filters import CourseAboutRenderStarted, RenderXBlockStarted +from openedx_filters.learning.filters import CourseAboutRenderStarted, RenderXBlockCompleted from requests.exceptions import ConnectionError, Timeout # pylint: disable=redefined-builtin from pytz import UTC from rest_framework import status @@ -1674,10 +1674,10 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta try: # .. filter_implemented_name: RenderXBlockStarted # .. filter_type: org.openedx.learning.xblock.render.started.v1 - context, student_view_context = RenderXBlockStarted.run_filter( + context, student_view_context = RenderXBlockCompleted.run_filter( context=context, student_view_context=student_view_context ) - except RenderXBlockStarted.PreventXBlockBlockRender as exc: + except RenderXBlockCompleted.PreventXBlockBlockRender as exc: log.info("Skipping rendering block %s. Reason: %s", usage_key_string, exc.message) return render_500() From 9035b46c685abf604cd0bba4d6aebca3dd0b0c27 Mon Sep 17 00:00:00 2001 From: nsprenkle Date: Mon, 3 Jun 2024 14:55:58 -0400 Subject: [PATCH 3/8] Revert "refactor: rename xblock render filter" This reverts commit ce4c4963c4810dedb187c843e78713f8038e0b32. --- lms/djangoapps/courseware/views/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 92602a2baabe..13a479623974 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -37,7 +37,7 @@ from markupsafe import escape from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey, UsageKey -from openedx_filters.learning.filters import CourseAboutRenderStarted, RenderXBlockCompleted +from openedx_filters.learning.filters import CourseAboutRenderStarted, RenderXBlockStarted from requests.exceptions import ConnectionError, Timeout # pylint: disable=redefined-builtin from pytz import UTC from rest_framework import status @@ -1674,10 +1674,10 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta try: # .. filter_implemented_name: RenderXBlockStarted # .. filter_type: org.openedx.learning.xblock.render.started.v1 - context, student_view_context = RenderXBlockCompleted.run_filter( + context, student_view_context = RenderXBlockStarted.run_filter( context=context, student_view_context=student_view_context ) - except RenderXBlockCompleted.PreventXBlockBlockRender as exc: + except RenderXBlockStarted.PreventXBlockBlockRender as exc: log.info("Skipping rendering block %s. Reason: %s", usage_key_string, exc.message) return render_500() From a05b0b9b2ad1dbec8e7fc664a2973eeabeedf9c5 Mon Sep 17 00:00:00 2001 From: nsprenkle Date: Mon, 3 Jun 2024 14:58:22 -0400 Subject: [PATCH 4/8] refactor: move filter location --- lms/djangoapps/courseware/views/views.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 13a479623974..1ff17c0086ff 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -1642,11 +1642,7 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta if not _check_sequence_exam_access(request, seq_block.location): return HttpResponseForbidden("Access to exam content is restricted") - fragment = block.render(requested_view, context=student_view_context) - optimization_flags = get_optimization_flags_for_content(block, fragment) - context = { - 'fragment': fragment, 'course': course, 'block': block, 'disable_accordion': True, @@ -1667,8 +1663,6 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta 'is_learning_mfe': is_learning_mfe, 'is_mobile_app': is_mobile_app, 'render_course_wide_assets': True, - - **optimization_flags, } try: @@ -1681,6 +1675,14 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta log.info("Skipping rendering block %s. Reason: %s", usage_key_string, exc.message) return render_500() + fragment = block.render(requested_view, context=student_view_context) + optimization_flags = get_optimization_flags_for_content(block, fragment) + + context.update({ + 'fragment': fragment, + **optimization_flags, + }) + return render_to_response('courseware/courseware-chromeless.html', context, request=request) From cd1b22710485f0bd74ee92be13120a54e089fab1 Mon Sep 17 00:00:00 2001 From: nsprenkle Date: Mon, 10 Jun 2024 16:44:32 -0400 Subject: [PATCH 5/8] feat: add ability to render a custom error message from filter --- lms/djangoapps/courseware/views/views.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 1ff17c0086ff..4bd627a7b750 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -1672,8 +1672,14 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta context=context, student_view_context=student_view_context ) except RenderXBlockStarted.PreventXBlockBlockRender as exc: - log.info("Skipping rendering block %s. Reason: %s", usage_key_string, exc.message) + log.info("Halted rendering block %s. Reason: %s", usage_key_string, exc.message) return render_500() + except RenderXBlockStarted.RenderCustomResponse as exc: + log.info("Rendering custom exception for block %s. Reason: %s", usage_key_string, exc.message) + context.update({ + 'fragment': Fragment(exc.response) + }) + return render_to_response('courseware/courseware-chromeless.html', context, request=request) fragment = block.render(requested_view, context=student_view_context) optimization_flags = get_optimization_flags_for_content(block, fragment) From 854c74e3f36d274627f434e5b4020d62ae9b1adb Mon Sep 17 00:00:00 2001 From: nsprenkle Date: Fri, 21 Jun 2024 00:13:21 -0400 Subject: [PATCH 6/8] chore: bump openedx-filters to 1.9.0 --- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 639980820ab9..8e7f27129e8b 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -746,7 +746,7 @@ openedx-events==9.10.0 # edx-event-bus-redis # event-tracking # ora2 -openedx-filters==1.8.1 +openedx-filters==1.9.0 # via # -r requirements/edx/kernel.in # lti-consumer-xblock diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 0e822be3c865..51a3617eaa86 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1284,7 +1284,7 @@ openedx-events==9.10.0 # edx-event-bus-redis # event-tracking # ora2 -openedx-filters==1.8.1 +openedx-filters==1.9.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 28b251780046..1b6dbbbad573 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -872,7 +872,7 @@ openedx-events==9.10.0 # edx-event-bus-redis # event-tracking # ora2 -openedx-filters==1.8.1 +openedx-filters==1.9.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 1dedb30ae609..42aba3f50378 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -951,7 +951,7 @@ openedx-events==9.10.0 # edx-event-bus-redis # event-tracking # ora2 -openedx-filters==1.8.1 +openedx-filters==1.9.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock From 7124eeb97eed098422f4c1dc9b3c80462440ce5f Mon Sep 17 00:00:00 2001 From: nsprenkle Date: Mon, 24 Jun 2024 11:14:57 -0400 Subject: [PATCH 7/8] fix: add missing request param --- lms/djangoapps/courseware/views/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 4bd627a7b750..b32435e6d0c6 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -1673,7 +1673,7 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_sta ) except RenderXBlockStarted.PreventXBlockBlockRender as exc: log.info("Halted rendering block %s. Reason: %s", usage_key_string, exc.message) - return render_500() + return render_500(request) except RenderXBlockStarted.RenderCustomResponse as exc: log.info("Rendering custom exception for block %s. Reason: %s", usage_key_string, exc.message) context.update({ From a369602bd75acd17c8ab589e55ee3a75282c628d Mon Sep 17 00:00:00 2001 From: nsprenkle Date: Mon, 24 Jun 2024 11:55:36 -0400 Subject: [PATCH 8/8] chore: disable too-many-statements --- lms/djangoapps/courseware/views/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index b32435e6d0c6..95af0cf75f06 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -1533,7 +1533,7 @@ def _check_sequence_exam_access(request, location): @xframe_options_exempt @transaction.non_atomic_requests @ensure_csrf_cookie -def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_staff_debug_info=False): +def render_xblock(request, usage_key_string, check_if_enrolled=True, disable_staff_debug_info=False): # pylint: disable=too-many-statements """ Returns an HttpResponse with HTML content for the xBlock with the given usage_key. The returned HTML is a chromeless rendering of the xBlock (excluding content of the containing courseware).