From 3fdfce1fd757871567d2924cd806b358022c39f8 Mon Sep 17 00:00:00 2001 From: Jose Ignacio Palma Date: Thu, 18 Jul 2024 20:56:59 -0400 Subject: [PATCH] feat: adds CourseAboutPageURLRequested and LMSPageURLRequested filters --- .../contentstore/asset_storage_handlers.py | 11 ++- common/djangoapps/util/course.py | 10 ++- common/djangoapps/util/tests/test_filters.py | 86 +++++++++++++++++++ requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 7 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 common/djangoapps/util/tests/test_filters.py diff --git a/cms/djangoapps/contentstore/asset_storage_handlers.py b/cms/djangoapps/contentstore/asset_storage_handlers.py index 281258e03a8d..1972a43c9180 100644 --- a/cms/djangoapps/contentstore/asset_storage_handlers.py +++ b/cms/djangoapps/contentstore/asset_storage_handlers.py @@ -25,6 +25,7 @@ from common.djangoapps.util.json_request import JsonResponse from openedx.core.djangoapps.contentserver.caching import del_cached_content from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers +from openedx_filters.course_authoring.filters import LMSPageURLRequested from xmodule.contentstore.content import StaticContent # lint-amnesty, pylint: disable=wrong-import-order from xmodule.contentstore.django import contentstore # lint-amnesty, pylint: disable=wrong-import-order from xmodule.exceptions import NotFoundError # lint-amnesty, pylint: disable=wrong-import-order @@ -714,7 +715,15 @@ def get_asset_json(display_name, content_type, date, location, thumbnail_locatio Helper method for formatting the asset information to send to client. ''' asset_url = StaticContent.serialize_asset_key_with_slash(location) - external_url = urljoin(configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL), asset_url) + + ## .. filter_implemented_name: LMSPageURLRequested + ## .. filter_type: org.openedx.course_authoring.lms.page.url.requested.v1 + lms_root, _ = LMSPageURLRequested.run_filter( + url=lms_root, + org=location.org, + ) + + external_url = urljoin(lms_root, asset_url) portable_url = StaticContent.get_static_path_from_location(location) usage_locations = [] if usage is None else usage return { diff --git a/common/djangoapps/util/course.py b/common/djangoapps/util/course.py index 721410ff6976..ca0b550e8581 100644 --- a/common/djangoapps/util/course.py +++ b/common/djangoapps/util/course.py @@ -10,6 +10,7 @@ from opaque_keys.edx.keys import CourseKey, UsageKey from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers +from openedx_filters.learning.filters import CourseAboutPageURLRequested log = logging.getLogger(__name__) @@ -54,8 +55,15 @@ def get_link_for_about_page(course): elif settings.FEATURES.get('ENABLE_MKTG_SITE') and getattr(course, 'marketing_url', None): course_about_url = course.marketing_url else: + ## .. filter_implemented_name: CourseAboutPageURLRequested + ## .. filter_type: org.openedx.learning.course_about.page.url.requested.v1 + about_base, _ = CourseAboutPageURLRequested.run_filter( + url=configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL), + org=course.id.org, + ) + course_about_url = '{about_base_url}/courses/{course_key}/about'.format( - about_base_url=configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL), + about_base_url=about_base, course_key=str(course.id), ) diff --git a/common/djangoapps/util/tests/test_filters.py b/common/djangoapps/util/tests/test_filters.py new file mode 100644 index 000000000000..de854db62b2c --- /dev/null +++ b/common/djangoapps/util/tests/test_filters.py @@ -0,0 +1,86 @@ +""" +Test that various filters are fired for models/views in the student app. +""" +from django.test import override_settings +from common.djangoapps.util import course +from openedx_filters import PipelineStep +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.factories import CourseFactory + +from openedx.core.djangolib.testing.utils import skip_unless_lms + + +class TestPageURLRequestedPipelineStep(PipelineStep): + """ + Utility class used when getting steps for pipeline. + """ + + def run_filter(self, url, org): # pylint: disable=arguments-differ + """Pipeline step that modifies lms url creation.""" + url = "https://lms-url-creation" + org = "org" + return { + "url": url, + "org": org, + } + + +@skip_unless_lms +class CourseAboutPageURLRequestedFiltersTest(ModuleStoreTestCase): + """ + Tests for the Open edX Filters associated with the lms url creation process. + This class guarantees that the following filters are triggered during the microsite render: + - CourseAboutPageURLRequested + """ + + def setUp(self): # pylint: disable=arguments-differ + super().setUp() + self.course = CourseFactory.create() + self.org = "test" + self.val_name = 'LMS_ROOT_URL' + self.default = "https://lms-base" + + @override_settings( + OPEN_EDX_FILTERS_CONFIG={ + "org.openedx.learning.course_about.page.url.requested.v1": { + "pipeline": [ + "common.djangoapps.util.tests.test_filters.TestPageURLRequestedPipelineStep", + ], + "fail_silently": False, + }, + }, + ) + def test_lms_url_creation_filter_executed(self): + """ + Test whether the lms url creation filter is triggered before the user's + render site process. + Expected result: + - CourseAboutPageURLRequested is triggered and executes TestPageURLRequestedPipelineStep. + - The arguments that the receiver gets are the arguments used by the filter. + """ + course_about_url = course.get_link_for_about_page(self.course) + + expected_course_about = '{about_base_url}/courses/{course_key}/about'.format( + about_base_url='https://lms-url-creation', + course_key=str(self.course.id), + ) + + self.assertEqual(expected_course_about, course_about_url) + + @override_settings(OPEN_EDX_FILTERS_CONFIG={}, LMS_ROOT_URL="https://lms-base") + def test_enrollment_without_filter_configuration(self): + """ + Test usual get link for about page process, without filter's intervention. + Expected result: + - Returns the course sharing url, this can be one of course's social sharing url, marketing url, or + lms course about url. + - The get process ends successfully. + """ + course_about_url = course.get_link_for_about_page(self.course) + + expected_course_about = '{about_base_url}/courses/{course_key}/about'.format( + about_base_url='https://lms-base', + course_key=str(self.course.id), + ) + + self.assertEqual(expected_course_about, course_about_url) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 01ea398bb48a..ab0dd40f1ded 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -819,7 +819,7 @@ openedx-events==9.14.1 # edx-event-bus-redis # event-tracking # ora2 -openedx-filters==1.10.0 +openedx-filters==1.11.0 # via # -r requirements/edx/kernel.in # lti-consumer-xblock diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index e87b8b33f229..203c4c8d7c95 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1367,7 +1367,7 @@ openedx-events==9.14.1 # edx-event-bus-redis # event-tracking # ora2 -openedx-filters==1.10.0 +openedx-filters==1.11.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 5cb7390aa777..63a6485cfc0f 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -978,7 +978,7 @@ openedx-events==9.14.1 # edx-event-bus-redis # event-tracking # ora2 -openedx-filters==1.10.0 +openedx-filters==1.11.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 64564a9c5fad..13a4f6c78057 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -1029,7 +1029,7 @@ openedx-events==9.14.1 # edx-event-bus-redis # event-tracking # ora2 -openedx-filters==1.10.0 +openedx-filters==1.11.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock