Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: adds CourseAboutPageURLRequested and LMSPageURLRequested filters #35142

Merged
merged 5 commits into from
Oct 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion cms/djangoapps/contentstore/asset_storage_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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=configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL),
org=location.org,
)
jignaciopm marked this conversation as resolved.
Show resolved Hide resolved

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 {
Expand Down
98 changes: 98 additions & 0 deletions cms/djangoapps/contentstore/tests/test_filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
"""
Unit tests for the asset upload endpoint.
"""
from datetime import datetime
from urllib.parse import urljoin

from pytz import UTC

from django.test import override_settings
from cms.djangoapps.contentstore import asset_storage_handlers
from opaque_keys.edx.locator import CourseLocator
from openedx_filters import PipelineStep
from xmodule.contentstore.content import StaticContent
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase


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,
}


class LMSPageURLRequestedFiltersTest(ModuleStoreTestCase):
"""
Tests for the Open edX Filters associated with the lms url requested process.
This class guarantees that the following filters are triggered during the microsite render:
- LMSPageURLRequested
"""

def setUp(self): # pylint: disable=arguments-differ
super().setUp()
self.upload_date = datetime(2013, 6, 1, 10, 30, tzinfo=UTC)
self.content_type = 'image/jpg'
self.course_key = CourseLocator('org', 'class', 'run')
self.location = self.course_key.make_asset_key('asset', 'my_file_name.jpg')
self.thumbnail_location = self.course_key.make_asset_key('thumbnail', 'my_file_name_thumb.jpg')

self.asset_url = StaticContent.serialize_asset_key_with_slash(self.location)

@override_settings(
OPEN_EDX_FILTERS_CONFIG={
"org.openedx.course_authoring.lms.page.url.requested.v1": {
"pipeline": [
"common.djangoapps.util.tests.test_filters.TestPageURLRequestedPipelineStep",
],
"fail_silently": False,
},
},
)
def test_lms_url_requested_filter_executed(self):
"""
Test that filter get new LMS URL for asset URL generation
based on the course organization settings for org.
Expected result:
- LMSPageURLRequested is triggered and executes TestPageURLRequestedPipelineStep.
- The arguments that the receiver gets are the arguments used by the filter.
"""
output = asset_storage_handlers.get_asset_json(
"my_file",
self.content_type,
self.upload_date,
self.location,
self.thumbnail_location,
True,
self.course_key
)

self.assertEqual(output.get('external_url'), urljoin('https://lms-url-creation', self.asset_url))

@override_settings(OPEN_EDX_FILTERS_CONFIG={}, LMS_ROOT_URL="https://lms-base")
def test_lms_url_requested_without_filter_configuration(self):
"""
Test that filter get new LMS URL for asset URL generation
based on LMS_ROOT_URL settings because OPEN_EDX_FILTERS_CONFIG is not set.
Expected result:
- Returns the asset URL with domain base LMS_ROOT_URL.
- The get process ends successfully.
"""
output = asset_storage_handlers.get_asset_json(
"my_file",
self.content_type,
self.upload_date,
self.location,
self.thumbnail_location,
True,
self.course_key
)

self.assertEqual(output.get('external_url'), urljoin('https://lms-base', self.asset_url))
8 changes: 8 additions & 0 deletions common/djangoapps/util/course.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down Expand Up @@ -59,6 +60,13 @@ def get_link_for_about_page(course):
course_key=str(course.id),
)

## .. filter_implemented_name: CourseAboutPageURLRequested
## .. filter_type: org.openedx.learning.course_about.page.url.requested.v1
course_about_url, _ = CourseAboutPageURLRequested.run_filter(
url=course_about_url,
org=course.id.org,
)

return course_about_url


Expand Down
77 changes: 77 additions & 0 deletions common/djangoapps/util/tests/test_filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
"""
jignaciopm marked this conversation as resolved.
Show resolved Hide resolved
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 requested."""
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 course about page url requested.
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()

@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_course_about_page_url_requested_filter_executed(self):
"""
Test that filter get new course about URL based
on the course organization settings for org.
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)

self.assertEqual("https://lms-url-creation", course_about_url)

@override_settings(OPEN_EDX_FILTERS_CONFIG={}, LMS_ROOT_URL="https://lms-base")
def test_course_about_page_url_requested_without_filter_configuration(self):
"""
Test that filter get new course about URL based
on the LMS_ROOT_URL settings because OPEN_EDX_FILTERS_CONFIG is not set.
Expected result:
- Returns the course about URL with domain base LMS_ROOT_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)
Loading