Skip to content

Commit

Permalink
feat: adds LmsUrlCreationStarted filter
Browse files Browse the repository at this point in the history
  • Loading branch information
jignaciopm committed Aug 7, 2024
1 parent 35651da commit 20a0c38
Show file tree
Hide file tree
Showing 7 changed files with 173 additions and 6 deletions.
25 changes: 24 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.content_authoring.filters import LmsUrlCreationStarted
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,21 @@ 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)
lms_root = configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL)

try:
## .. filter_implemented_name: LmsUrlCreationStarted
## .. filter_type: org.openedx.course_authoring.lms.url.creation.started.v1
lms_root = LmsUrlCreationStarted.run_filter(
context=lms_root,
org=location.org,
val_name='LMS_ROOT_URL',
default=settings.LMS_ROOT_URL
)
except LmsUrlCreationStarted.PreventLmsUrlCreationRender as exc:
raise LmsUrlCreationNotAllowed(str(exc)) from exc

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 All @@ -732,3 +747,11 @@ def get_asset_json(display_name, content_type, date, location, thumbnail_locatio
'file_size': file_size,
'usage_locations': usage_locations,
}


class LmsUrlCreationException(Exception):
pass


class LmsUrlCreationNotAllowed(LmsUrlCreationException):
pass
25 changes: 24 additions & 1 deletion 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.content_authoring.filters import LmsUrlCreationStarted

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -54,14 +55,36 @@ 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:
about_base = configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL)

try:
## .. filter_implemented_name: LmsUrlCreationStarted
## .. filter_type: org.openedx.course_authoring.lms.url.creation.started.v1
about_base = LmsUrlCreationStarted.run_filter(
context=about_base,
org=course.id.org,
val_name='LMS_ROOT_URL',
default=settings.LMS_ROOT_URL
)
except LmsUrlCreationStarted.PreventLmsUrlCreationRender as exc:
raise LmsUrlCreationNotAllowed(str(exc)) from exc

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

return course_about_url


class LmsUrlCreationException(Exception):
pass


class LmsUrlCreationNotAllowed(LmsUrlCreationException):
pass


def has_certificates_enabled(course):
"""
Arguments:
Expand Down
121 changes: 121 additions & 0 deletions common/djangoapps/util/tests/test_filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
"""
Test that various filters are fired for models/views in the student app.
"""
from django.http import HttpResponse
from django.test import override_settings
from common.djangoapps.util import course
from openedx_filters import PipelineStep
from openedx_filters.content_authoring.filters import LmsUrlCreationStarted
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory

from common.djangoapps.util.course import LmsUrlCreationNotAllowed
from openedx.core.djangolib.testing.utils import skip_unless_lms


class TestLmsUrlCreationPipelineStep(PipelineStep):
"""
Utility class used when getting steps for pipeline.
"""

def run_filter(self, context, org, val_name, default): # pylint: disable=arguments-differ
"""Pipeline step that modifies lms url creation."""
context = "https://lms-url-creation"
return {
"context": context
}


class TestLmsUrlCreationFilterPrevent(PipelineStep):
"""
Utility class used when getting steps for pipeline.
"""

def run_filter(self, context, org, val_name, default): # pylint: disable=arguments-differ
"""Pipeline step that changes dashboard view response before the dashboard is rendered."""
response = HttpResponse("This is a custom response.")
raise LmsUrlCreationStarted.PreventLmsUrlCreationRender(
"Can't render lms url creation.",
response=response,
)


@skip_unless_lms
class LmsUrlCreationStartedFiltersTest(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:
- LmsUrlCreationStarted
"""

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.course_authoring.lms.url.creation.started.v1": {
"pipeline": [
"common.djangoapps.util.tests.test_filters.TestLmsUrlCreationPipelineStep",
],
"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:
- LmsUrlCreationStarted is triggered and executes TestLmsUrlCreationPipelineStep.
- 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={
"org.openedx.course_authoring.lms.url.creation.started.v1": {
"pipeline": [
"common.djangoapps.util.tests.test_filters.TestLmsUrlCreationFilterPrevent",
],
"fail_silently": False,
},
},
)
def test_lms_url_creation_filter_prevent(self):
"""
Test prevent the lms url creation filter through a pipeline step.
Expected result:
- TenantAwareLinkRenderStarted is triggered and executes TestLmsUrlCreationFilterPrevent.
- The user can't get lms url creation.
"""
with self.assertRaises(LmsUrlCreationNotAllowed):
course.get_link_for_about_page(self.course)

@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)
2 changes: 1 addition & 1 deletion requirements/edx/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -818,7 +818,7 @@ openedx-events==9.11.0
# edx-event-bus-redis
# event-tracking
# ora2
openedx-filters==1.9.0
git+https://github.com/eduNEXT/openedx-filters.git@jipm/add_tenant_aware_filter
# 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 @@ -1366,7 +1366,7 @@ openedx-events==9.11.0
# edx-event-bus-redis
# event-tracking
# ora2
openedx-filters==1.9.0
git+https://github.com/eduNEXT/openedx-filters.git@jipm/add_tenant_aware_filter
# 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 @@ -977,7 +977,7 @@ openedx-events==9.11.0
# edx-event-bus-redis
# event-tracking
# ora2
openedx-filters==1.9.0
git+https://github.com/eduNEXT/openedx-filters.git@jipm/add_tenant_aware_filter
# 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 @@ -1028,7 +1028,7 @@ openedx-events==9.11.0
# edx-event-bus-redis
# event-tracking
# ora2
openedx-filters==1.9.0
git+https://github.com/eduNEXT/openedx-filters.git@jipm/add_tenant_aware_filter
# via
# -r requirements/edx/base.txt
# lti-consumer-xblock
Expand Down

0 comments on commit 20a0c38

Please sign in to comment.