Skip to content

Commit

Permalink
feat: adds CourseAboutPageURLRequested and LMSPageURLRequested filters
Browse files Browse the repository at this point in the history
  • Loading branch information
jignaciopm committed Oct 3, 2024
1 parent 9ff0dac commit b409d20
Show file tree
Hide file tree
Showing 8 changed files with 202 additions and 5 deletions.
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,
)

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 whether the lms url requested filter is triggered before the user's
render site process.
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 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.
"""
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
82 changes: 82 additions & 0 deletions common/djangoapps/util/tests/test_filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
"""
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 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()

@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_requested_filter_executed(self):
"""
Test whether the lms url requested 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_lms_url_requested_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)
2 changes: 1 addition & 1 deletion requirements/edx/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion requirements/edx/development.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion requirements/edx/doc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion requirements/edx/testing.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit b409d20

Please sign in to comment.