Skip to content

Commit

Permalink
feat: adds FilterTenantAwareLinksFromStudio in filters pipeline
Browse files Browse the repository at this point in the history
  • Loading branch information
JuanDavidBuitrago authored and jignaciopm committed Nov 7, 2024
1 parent 602e6b0 commit 838804d
Show file tree
Hide file tree
Showing 8 changed files with 165 additions and 7 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [v12.1.0](https://github.com/eduNEXT/eox-tenant/compare/v12.0.0...v12.1.0) - (2024-11-07)

#### Features

- adds FilterTenantAwareLinksFromStudio in filters pipeline ([2b82024](https://github.com/eduNEXT/eox-tenant/commit/2b820245433f8889448e70390b5b9efed9aa0dba))

## [v12.0.0](https://github.com/eduNEXT/eox-tenant/compare/v11.7.0...v12.0.0) - (2024-10-22)

#### ⚠ BREAKING CHANGES
Expand Down
2 changes: 1 addition & 1 deletion eox_tenant/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""
Init for eox-tenant.
"""
__version__ = '12.0.0'
__version__ = '12.1.0'
10 changes: 8 additions & 2 deletions eox_tenant/filters/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,14 @@ Filters steps list:
-------------------

* `FilterUserCourseEnrollmentsByTenant`_: Filters the course enrollments of a user from the tenant site where the request is made.

.. _FilterUserCourseEnrollmentsByTenant: ./pipeline.py#L9
* `FilterRenderCertificatesByOrg`_: Stop certificate generation process raising a exception if course org is different to tenant orgs.
* `OrgAwareLMSURLStudio`_: Generates a new LMS URL for asset URL generation based on the course organization settings.
* `OrgAwareCourseAboutPageURL`_: Generates a new course about URL based on the course organization settings.

.. _FilterUserCourseEnrollmentsByTenant: ./pipeline.py#L12
.. _FilterRenderCertificatesByOrg: ./pipeline.py#L35
.. _OrgAwareLMSURLStudio: ./pipeline.py#L66
.. _OrgAwareCourseAboutPageURL: ./pipeline#L93

How to add a new Filter Step:
-----------------------------
Expand Down
62 changes: 62 additions & 0 deletions eox_tenant/filters/pipeline.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
"""
The pipeline module defines custom Filters functions that are used in openedx-filters.
"""
from django.conf import settings
from openedx_filters import PipelineStep
from openedx_filters.learning.filters import CertificateRenderStarted

from eox_tenant.edxapp_wrapper.site_configuration_module import get_configuration_helpers
from eox_tenant.organizations import get_organizations
from eox_tenant.tenant_aware_functions.enrollments import filter_enrollments

configuration_helpers = get_configuration_helpers()


class FilterUserCourseEnrollmentsByTenant(PipelineStep):
"""
Expand Down Expand Up @@ -57,3 +61,61 @@ def run_filter(self, context, custom_template, *args, **kwargs): # pylint: disa
raise CertificateRenderStarted.RenderAlternativeInvalidCertificate(
"You can't generate a certificate from this site.",
)


class OrgAwareLMSURLStudio(PipelineStep):
"""
Generates a new LMS URL for asset URL generation based on the course organization settings.
"""

def run_filter(self, url, org): # pylint: disable=arguments-differ,unused-argument
"""
Filter especific tenant aware link form Studio to the LMS.
Example Usage:
Add the following configurations to you configuration file
"OPEN_EDX_FILTERS_CONFIG": {
"org.openedx.course_authoring.lms.page.url.requested.v1": {
"fail_silently": false,
"pipeline": [
"eox_tenant.filters.pipeline.OrgAwareLMSURLStudio"
]
}
}
"""
lms_root = configuration_helpers.get_value_for_org(
org,
'LMS_ROOT_URL',
settings.LMS_ROOT_URL
)
return {"url": lms_root, "org": org}


class OrgAwareCourseAboutPageURL(PipelineStep):
"""
Generates a new course about URL based on the course organization settings.
"""

def run_filter(self, url, org): # pylint: disable=arguments-differ,unused-argument
"""
The url looks like this:
<LMS_ROOT>/courses/course-v1:org+course+number/about
This method will filter the url to be tenant aware.
Example Usage:
Add the following configurations to you configuration file
"OPEN_EDX_FILTERS_CONFIG": {
"org.openedx.learning.course_about.page.url.requested.v1": {
"fail_silently": false,
"pipeline": [
"eox_tenant.filters.pipeline.OrgAwareCourseAboutPageURL"
]
},
}
"""
lms_root = configuration_helpers.get_value_for_org(
org,
'LMS_ROOT_URL',
settings.LMS_ROOT_URL
)
course_about_url = url.replace(settings.LMS_ROOT_URL, lms_root)
return {"url": course_about_url, "org": org}
86 changes: 85 additions & 1 deletion eox_tenant/filters/test/test_pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from django.test import TestCase, override_settings
from openedx_filters.learning.filters import CertificateRenderStarted, CourseEnrollmentQuerysetRequested

from eox_tenant.filters.pipeline import FilterRenderCertificatesByOrg
from eox_tenant.filters.pipeline import FilterRenderCertificatesByOrg, OrgAwareCourseAboutPageURL, OrgAwareLMSURLStudio
from eox_tenant.tenant_aware_functions.enrollments import filter_enrollments


Expand Down Expand Up @@ -161,3 +161,87 @@ def test_filter_render_certificates_by_org(self, organizations, render, mock_get
else:
FilterRenderCertificatesByOrg.run_filter(self, context, {})
mock_get_organizations.assert_called_once()


class OrgAwareLMSURLStudioTestCase(TestCase):
"""
Test OrgAwareLMSURLStudioTestCase that generates a new LMS URL for asset URL generation
based on the course organization settings.
"""

def setUp(self):
"""This method initializes the URL and ORG variables for the pipeline"""

self.url = "https://lms-base"
self.org = "test"

@override_settings(
LMS_ROOT_URL="https://lms-base"
)
@mock.patch('eox_tenant.filters.pipeline.configuration_helpers')
def test_get_lms_url_based_for_org(self, configuration_helpers_mock):
"""
Test that filter get new LMS URL for asset URL generation
based on the course organization settings for org.
Args:
configuration_helpers_mock (patch): mock for configuration_helpers method.
Expected result:
- The url return is equal to expected.
- The org return is equal to expected.
"""
results_get_value = "https://test-tenant-aware-link"

configuration_helpers_mock.get_value_for_org.return_value = results_get_value

result = OrgAwareLMSURLStudio.run_filter(
self,
url=self.url,
org=self.org,
)

self.assertEqual(results_get_value, result.get("url"))
self.assertEqual(result.get("org"), self.org)


class OrgAwareCourseAboutPageURLTestCase(TestCase):
"""
Test OrgAwareCourseAboutPageURLTestCase that generates a new course about URL based
on the course organization settings.
"""

def setUp(self):
"""This method initializes the URL and ORG variables for the pipeline"""

self.url = "https://lms-base"
self.org = "test"

@override_settings(
LMS_ROOT_URL="https://lms-base"
)
@mock.patch('eox_tenant.filters.pipeline.configuration_helpers')
def test_get_course_about_url_based_for_org(self, configuration_helpers_mock):
"""
Test that filter get new course about URL based
on the course organization settings for org.
Args:
configuration_helpers_mock (patch): mock for configuration_helpers method.
Expected result:
- The url return is equal to expected.
- The org return is equal to expected.
"""
results_get_value = "https://test-tenant-aware-link"

configuration_helpers_mock.get_value_for_org.return_value = results_get_value

result = OrgAwareCourseAboutPageURL.run_filter(
self,
url=self.url,
org=self.org,
)

self.assertEqual(results_get_value, result.get("url"))
self.assertEqual(result.get("org"), self.org)
2 changes: 1 addition & 1 deletion requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ oauthlib==3.2.2
# via
# requests-oauthlib
# social-auth-core
openedx-filters==1.9.0
openedx-filters==1.11.0
# via -r requirements/base.in
pbr==6.1.0
# via stevedore
Expand Down
2 changes: 1 addition & 1 deletion requirements/test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ oauthlib==3.2.2
# -r requirements/base.txt
# requests-oauthlib
# social-auth-core
openedx-filters==1.9.0
openedx-filters==1.11.0
# via -r requirements/base.txt
packaging==24.1
# via pytest
Expand Down
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 12.0.0
current_version = 12.1.0
commit = False
tag = False

Expand Down

0 comments on commit 838804d

Please sign in to comment.