diff --git a/CHANGELOG.md b/CHANGELOG.md index 09e07a86..7ccc5aea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/eox_tenant/__init__.py b/eox_tenant/__init__.py index 3a51f942..f34f0acd 100644 --- a/eox_tenant/__init__.py +++ b/eox_tenant/__init__.py @@ -1,4 +1,4 @@ """ Init for eox-tenant. """ -__version__ = '12.0.0' +__version__ = '12.1.0' diff --git a/eox_tenant/filters/README.rst b/eox_tenant/filters/README.rst index a095b5a8..00d89738 100644 --- a/eox_tenant/filters/README.rst +++ b/eox_tenant/filters/README.rst @@ -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: ----------------------------- diff --git a/eox_tenant/filters/pipeline.py b/eox_tenant/filters/pipeline.py index c38ad7d5..df58acbf 100644 --- a/eox_tenant/filters/pipeline.py +++ b/eox_tenant/filters/pipeline.py @@ -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): """ @@ -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: + /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} diff --git a/eox_tenant/filters/test/test_pipeline.py b/eox_tenant/filters/test/test_pipeline.py index 1f9580be..1ad6f633 100644 --- a/eox_tenant/filters/test/test_pipeline.py +++ b/eox_tenant/filters/test/test_pipeline.py @@ -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 @@ -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) diff --git a/requirements/base.txt b/requirements/base.txt index 24343e87..b8ed076e 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -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 diff --git a/requirements/test.txt b/requirements/test.txt index 4ea101c0..3362793a 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -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 diff --git a/setup.cfg b/setup.cfg index 2b14c5d7..9be9e078 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 12.0.0 +current_version = 12.1.0 commit = False tag = False