From 1ac7680bf271cc0c5fda7d584f75cc4fac579f7b Mon Sep 17 00:00:00 2001 From: XnpioChV Date: Fri, 6 Oct 2023 13:26:35 -0500 Subject: [PATCH 1/7] feat: New link on studio home to Taxonomy list and flag added --- .../rest_api/v1/serializers/home.py | 2 ++ cms/djangoapps/contentstore/toggles.py | 18 ++++++++++++++++++ cms/djangoapps/contentstore/utils.py | 13 ++++++++++++- cms/templates/index.html | 3 +++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/cms/djangoapps/contentstore/rest_api/v1/serializers/home.py b/cms/djangoapps/contentstore/rest_api/v1/serializers/home.py index 5abcda673aa7..aefab2c6b1df 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/serializers/home.py +++ b/cms/djangoapps/contentstore/rest_api/v1/serializers/home.py @@ -47,7 +47,9 @@ class CourseHomeSerializer(serializers.Serializer): in_process_course_actions = UnsucceededCourseSerializer(many=True, required=False, allow_null=True) libraries = LibraryViewSerializer(many=True, required=False, allow_null=True) libraries_enabled = serializers.BooleanField() + taxonomies_enabled = serializers.BooleanField() library_authoring_mfe_url = serializers.CharField() + taxonomy_list_mfe_url = serializers.CharField() optimization_enabled = serializers.BooleanField() redirect_to_library_authoring_mfe = serializers.BooleanField() request_course_creator_url = serializers.CharField() diff --git a/cms/djangoapps/contentstore/toggles.py b/cms/djangoapps/contentstore/toggles.py index a2a8055b5a6b..ac8469678f78 100644 --- a/cms/djangoapps/contentstore/toggles.py +++ b/cms/djangoapps/contentstore/toggles.py @@ -537,3 +537,21 @@ def default_enable_flexible_peer_openassessments(course_key): level to opt in/out of rolling forward this feature. """ return DEFAULT_ENABLE_FLEXIBLE_PEER_OPENASSESSMENTS.is_enabled(course_key) + + +# .. toggle_name: new_studio_mfe.use_tagging_taxonomy_list_page +# .. toggle_implementation: WaffleFlag +# .. toggle_default: False +# .. toggle_description: This flag enables the use of the taxonomy list page. +# .. toggle_use_cases: temporary +# .. toggle_creation_date: 2023-10-06 +# .. toggle_target_removal_date: TBA +# .. toggle_warning: +ENABLE_TAGGING_TAXONOMY_LIST_PAGE = WaffleFlag('new_studio_mfe.use_tagging_taxonomy_list_page', __name__) + + +def use_tagging_taxonomy_list_page(): + """ + Returns a boolean if taxonomy list page is enabled + """ + return ENABLE_TAGGING_TAXONOMY_LIST_PAGE.is_enabled() diff --git a/cms/djangoapps/contentstore/utils.py b/cms/djangoapps/contentstore/utils.py index 1a4b709622e6..355fa430e619 100644 --- a/cms/djangoapps/contentstore/utils.py +++ b/cms/djangoapps/contentstore/utils.py @@ -76,6 +76,7 @@ use_new_video_editor, use_new_video_uploads_page, use_new_custom_pages, + use_tagging_taxonomy_list_page, ) from cms.djangoapps.models.settings.course_grading import CourseGradingModel from xmodule.library_tools import LibraryToolsService @@ -433,6 +434,15 @@ def get_custom_pages_url(course_locator) -> str: return custom_pages_url +def get_taxonomy_list_url(): + taxonomy_list_url = None + if use_tagging_taxonomy_list_page(): + mfe_base_url = settings.COURSE_AUTHORING_MICROFRONTEND_URL + if mfe_base_url: + taxonomy_list_url = f'{mfe_base_url}/taxonomy-list' + return taxonomy_list_url + + def course_import_olx_validation_is_enabled(): """ Check if course olx validation is enabled on course import. @@ -1514,8 +1524,10 @@ def format_in_process_course_view(uca): 'archived_courses': archived_courses, 'in_process_course_actions': in_process_course_actions, 'libraries_enabled': LIBRARIES_ENABLED, + 'taxonomies_enabled': use_tagging_taxonomy_list_page(), 'redirect_to_library_authoring_mfe': should_redirect_to_library_authoring_mfe(), 'library_authoring_mfe_url': LIBRARY_AUTHORING_MICROFRONTEND_URL, + 'taxonomy_list_mfe_url': get_taxonomy_list_url(), 'libraries': libraries, 'show_new_library_button': user_can_create_library(user) and not should_redirect_to_library_authoring_mfe(), 'user': user, @@ -1552,7 +1564,6 @@ def get_course_rerun_context(course_key, course_block, user): return course_rerun_context - class StudioPermissionsService: """ Service that can provide information about a user's permissions. diff --git a/cms/templates/index.html b/cms/templates/index.html index dbd83b2ff518..766d68da780c 100644 --- a/cms/templates/index.html +++ b/cms/templates/index.html @@ -360,6 +360,9 @@

${course_info['display_name']}

% endif % endif + % if taxonomies_enabled: +
  • ${_("Taxonomies")}
  • + % endif % endif From 3a066794b31d793898ab681906adf30c0caa5af3 Mon Sep 17 00:00:00 2001 From: XnpioChV Date: Thu, 12 Oct 2023 17:50:23 -0500 Subject: [PATCH 2/7] chore: Change openedx-learning version to point to opencraft branch --- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/kernel.in | 2 +- requirements/edx/testing.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index c5ed717a7720..f8c2a196926b 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -785,7 +785,7 @@ openedx-filters==1.6.0 # via # -r requirements/edx/kernel.in # lti-consumer-xblock -openedx-learning==0.2.3 +openedx-learning @ git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 86cb1ccb51d4..f1e886ded04d 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1318,7 +1318,7 @@ openedx-filters==1.6.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # lti-consumer-xblock -openedx-learning==0.2.3 +openedx-learning @ git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page # via # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 4f6abf333fda..cfbb34ca4f79 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -925,7 +925,7 @@ openedx-filters==1.6.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock -openedx-learning==0.2.3 +openedx-learning @ git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt diff --git a/requirements/edx/kernel.in b/requirements/edx/kernel.in index 1c727d2f9c2c..8fd85bbb1416 100644 --- a/requirements/edx/kernel.in +++ b/requirements/edx/kernel.in @@ -117,7 +117,7 @@ openedx-calc # Library supporting mathematical calculatio openedx-django-require openedx-events # Open edX Events from Hooks Extension Framework (OEP-50) openedx-filters # Open edX Filters from Hooks Extension Framework (OEP-50) -openedx-learning # Open edX Learning core (experimental) +openedx-learning@git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page#egg=0.2.3 # Open edX Learning core (experimental) openedx-mongodbproxy openedx-django-wiki openedx-blockstore diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 2aabad42efe6..85353939a4d7 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -992,7 +992,7 @@ openedx-filters==1.6.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock -openedx-learning==0.2.3 +openedx-learning @ git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt From 0f35ac28e403c1fb38f68084da5b2bebbbb12619 Mon Sep 17 00:00:00 2001 From: XnpioChV Date: Thu, 12 Oct 2023 20:19:17 -0500 Subject: [PATCH 3/7] test: test_views of content_tagging updated --- .../rest_api/v1/tests/test_views.py | 126 +++++++++--------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py b/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py index 8cb4b94fd227..7caccf7e81cc 100644 --- a/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py +++ b/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py @@ -270,18 +270,18 @@ def test_list_invalid_page(self): assert response.status_code == status.HTTP_404_NOT_FOUND @ddt.data( - (None, "ot1", status.HTTP_403_FORBIDDEN), - (None, "ot2", status.HTTP_403_FORBIDDEN), - (None, "st1", status.HTTP_403_FORBIDDEN), - (None, "st2", status.HTTP_403_FORBIDDEN), - (None, "t1", status.HTTP_403_FORBIDDEN), - (None, "t2", status.HTTP_403_FORBIDDEN), - (None, "tA1", status.HTTP_403_FORBIDDEN), - (None, "tA2", status.HTTP_403_FORBIDDEN), - (None, "tB1", status.HTTP_403_FORBIDDEN), - (None, "tB2", status.HTTP_403_FORBIDDEN), - (None, "tC1", status.HTTP_403_FORBIDDEN), - (None, "tC2", status.HTTP_403_FORBIDDEN), + (None, "ot1", status.HTTP_401_UNAUTHORIZED), + (None, "ot2", status.HTTP_401_UNAUTHORIZED), + (None, "st1", status.HTTP_401_UNAUTHORIZED), + (None, "st2", status.HTTP_401_UNAUTHORIZED), + (None, "t1", status.HTTP_401_UNAUTHORIZED), + (None, "t2", status.HTTP_401_UNAUTHORIZED), + (None, "tA1", status.HTTP_401_UNAUTHORIZED), + (None, "tA2", status.HTTP_401_UNAUTHORIZED), + (None, "tB1", status.HTTP_401_UNAUTHORIZED), + (None, "tB2", status.HTTP_401_UNAUTHORIZED), + (None, "tC1", status.HTTP_401_UNAUTHORIZED), + (None, "tC2", status.HTTP_401_UNAUTHORIZED), ("user", "ot1", status.HTTP_200_OK), ("user", "ot2", status.HTTP_404_NOT_FOUND), ("user", "st1", status.HTTP_200_OK), @@ -336,7 +336,7 @@ def test_detail_taxonomy(self, user_attr, taxonomy_attr, expected_status): check_taxonomy(response.data, taxonomy.pk, **(TaxonomySerializer(taxonomy.cast()).data)) @ddt.data( - (None, status.HTTP_403_FORBIDDEN), + (None, status.HTTP_401_UNAUTHORIZED), ("user", status.HTTP_403_FORBIDDEN), ("userA", status.HTTP_403_FORBIDDEN), ("userS", status.HTTP_201_CREATED), @@ -368,18 +368,18 @@ def test_create_taxonomy(self, user_attr, expected_status): check_taxonomy(response.data, response.data["id"], **create_data) @ddt.data( - (None, "ot1", status.HTTP_403_FORBIDDEN), - (None, "ot2", status.HTTP_403_FORBIDDEN), - (None, "st1", status.HTTP_403_FORBIDDEN), - (None, "st2", status.HTTP_403_FORBIDDEN), - (None, "t1", status.HTTP_403_FORBIDDEN), - (None, "t2", status.HTTP_403_FORBIDDEN), - (None, "tA1", status.HTTP_403_FORBIDDEN), - (None, "tA2", status.HTTP_403_FORBIDDEN), - (None, "tB1", status.HTTP_403_FORBIDDEN), - (None, "tB2", status.HTTP_403_FORBIDDEN), - (None, "tC1", status.HTTP_403_FORBIDDEN), - (None, "tC2", status.HTTP_403_FORBIDDEN), + (None, "ot1", status.HTTP_401_UNAUTHORIZED), + (None, "ot2", status.HTTP_401_UNAUTHORIZED), + (None, "st1", status.HTTP_401_UNAUTHORIZED), + (None, "st2", status.HTTP_401_UNAUTHORIZED), + (None, "t1", status.HTTP_401_UNAUTHORIZED), + (None, "t2", status.HTTP_401_UNAUTHORIZED), + (None, "tA1", status.HTTP_401_UNAUTHORIZED), + (None, "tA2", status.HTTP_401_UNAUTHORIZED), + (None, "tB1", status.HTTP_401_UNAUTHORIZED), + (None, "tB2", status.HTTP_401_UNAUTHORIZED), + (None, "tC1", status.HTTP_401_UNAUTHORIZED), + (None, "tC2", status.HTTP_401_UNAUTHORIZED), ("user", "ot1", status.HTTP_403_FORBIDDEN), ("user", "ot2", status.HTTP_403_FORBIDDEN), ("user", "st1", status.HTTP_403_FORBIDDEN), @@ -465,18 +465,18 @@ def test_update_taxonomy_system_defined(self, update_value, expected_status): assert response.data["system_defined"] is True @ddt.data( - (None, "ot1", status.HTTP_403_FORBIDDEN), - (None, "ot2", status.HTTP_403_FORBIDDEN), - (None, "st1", status.HTTP_403_FORBIDDEN), - (None, "st2", status.HTTP_403_FORBIDDEN), - (None, "t1", status.HTTP_403_FORBIDDEN), - (None, "t2", status.HTTP_403_FORBIDDEN), - (None, "tA1", status.HTTP_403_FORBIDDEN), - (None, "tA2", status.HTTP_403_FORBIDDEN), - (None, "tB1", status.HTTP_403_FORBIDDEN), - (None, "tB2", status.HTTP_403_FORBIDDEN), - (None, "tC1", status.HTTP_403_FORBIDDEN), - (None, "tC2", status.HTTP_403_FORBIDDEN), + (None, "ot1", status.HTTP_401_UNAUTHORIZED), + (None, "ot2", status.HTTP_401_UNAUTHORIZED), + (None, "st1", status.HTTP_401_UNAUTHORIZED), + (None, "st2", status.HTTP_401_UNAUTHORIZED), + (None, "t1", status.HTTP_401_UNAUTHORIZED), + (None, "t2", status.HTTP_401_UNAUTHORIZED), + (None, "tA1", status.HTTP_401_UNAUTHORIZED), + (None, "tA2", status.HTTP_401_UNAUTHORIZED), + (None, "tB1", status.HTTP_401_UNAUTHORIZED), + (None, "tB2", status.HTTP_401_UNAUTHORIZED), + (None, "tC1", status.HTTP_401_UNAUTHORIZED), + (None, "tC2", status.HTTP_401_UNAUTHORIZED), ("user", "ot1", status.HTTP_403_FORBIDDEN), ("user", "ot2", status.HTTP_403_FORBIDDEN), ("user", "st1", status.HTTP_403_FORBIDDEN), @@ -560,18 +560,18 @@ def test_patch_taxonomy_system_defined(self, update_value, expected_status): assert response.data["system_defined"] is True @ddt.data( - (None, "ot1", status.HTTP_403_FORBIDDEN), - (None, "ot2", status.HTTP_403_FORBIDDEN), - (None, "st1", status.HTTP_403_FORBIDDEN), - (None, "st2", status.HTTP_403_FORBIDDEN), - (None, "t1", status.HTTP_403_FORBIDDEN), - (None, "t2", status.HTTP_403_FORBIDDEN), - (None, "tA1", status.HTTP_403_FORBIDDEN), - (None, "tA2", status.HTTP_403_FORBIDDEN), - (None, "tB1", status.HTTP_403_FORBIDDEN), - (None, "tB2", status.HTTP_403_FORBIDDEN), - (None, "tC1", status.HTTP_403_FORBIDDEN), - (None, "tC2", status.HTTP_403_FORBIDDEN), + (None, "ot1", status.HTTP_401_UNAUTHORIZED), + (None, "ot2", status.HTTP_401_UNAUTHORIZED), + (None, "st1", status.HTTP_401_UNAUTHORIZED), + (None, "st2", status.HTTP_401_UNAUTHORIZED), + (None, "t1", status.HTTP_401_UNAUTHORIZED), + (None, "t2", status.HTTP_401_UNAUTHORIZED), + (None, "tA1", status.HTTP_401_UNAUTHORIZED), + (None, "tA2", status.HTTP_401_UNAUTHORIZED), + (None, "tB1", status.HTTP_401_UNAUTHORIZED), + (None, "tB2", status.HTTP_401_UNAUTHORIZED), + (None, "tC1", status.HTTP_401_UNAUTHORIZED), + (None, "tC2", status.HTTP_401_UNAUTHORIZED), ("user", "ot1", status.HTTP_403_FORBIDDEN), ("user", "ot2", status.HTTP_403_FORBIDDEN), ("user", "st1", status.HTTP_403_FORBIDDEN), @@ -695,24 +695,24 @@ def setUp(self): @ddt.data( # userA and userS are staff in courseA and can tag using enabled taxonomies - (None, "tA1", ["Tag 1"], status.HTTP_403_FORBIDDEN), + (None, "tA1", ["Tag 1"], status.HTTP_401_UNAUTHORIZED), ("user", "tA1", ["Tag 1"], status.HTTP_403_FORBIDDEN), ("userA", "tA1", ["Tag 1"], status.HTTP_200_OK), ("userS", "tA1", ["Tag 1"], status.HTTP_200_OK), - (None, "tA1", [], status.HTTP_403_FORBIDDEN), + (None, "tA1", [], status.HTTP_401_UNAUTHORIZED), ("user", "tA1", [], status.HTTP_403_FORBIDDEN), ("userA", "tA1", [], status.HTTP_200_OK), ("userS", "tA1", [], status.HTTP_200_OK), - (None, "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_403_FORBIDDEN), + (None, "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_401_UNAUTHORIZED), ("user", "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_403_FORBIDDEN), ("userA", "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_200_OK), ("userS", "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_200_OK), - (None, "open_taxonomy", ["tag1"], status.HTTP_403_FORBIDDEN), + (None, "open_taxonomy", ["tag1"], status.HTTP_401_UNAUTHORIZED), ("user", "open_taxonomy", ["tag1"], status.HTTP_403_FORBIDDEN), ("userA", "open_taxonomy", ["tag1"], status.HTTP_200_OK), ("userS", "open_taxonomy", ["tag1"], status.HTTP_200_OK), # Only userS is Tagging Admin and can tag objects using disabled taxonomies - (None, "tA2", ["Tag 1"], status.HTTP_403_FORBIDDEN), + (None, "tA2", ["Tag 1"], status.HTTP_401_UNAUTHORIZED), ("user", "tA2", ["Tag 1"], status.HTTP_403_FORBIDDEN), ("userA", "tA2", ["Tag 1"], status.HTTP_403_FORBIDDEN), ("userS", "tA2", ["Tag 1"], status.HTTP_200_OK), @@ -736,11 +736,11 @@ def test_tag_course(self, user_attr, taxonomy_attr, tag_values, expected_status) @ddt.data( # Can't add invalid tags to a object using a closed taxonomy - (None, "tA1", ["invalid"], status.HTTP_403_FORBIDDEN), + (None, "tA1", ["invalid"], status.HTTP_401_UNAUTHORIZED), ("user", "tA1", ["invalid"], status.HTTP_403_FORBIDDEN), ("userA", "tA1", ["invalid"], status.HTTP_400_BAD_REQUEST), ("userS", "tA1", ["invalid"], status.HTTP_400_BAD_REQUEST), - (None, "multiple_taxonomy", ["invalid"], status.HTTP_403_FORBIDDEN), + (None, "multiple_taxonomy", ["invalid"], status.HTTP_401_UNAUTHORIZED), ("user", "multiple_taxonomy", ["invalid"], status.HTTP_403_FORBIDDEN), ("userA", "multiple_taxonomy", ["invalid"], status.HTTP_400_BAD_REQUEST), ("userS", "multiple_taxonomy", ["invalid"], status.HTTP_400_BAD_REQUEST), @@ -763,24 +763,24 @@ def test_tag_course_invalid(self, user_attr, taxonomy_attr, tag_values, expected @ddt.data( # userA and userS are staff in courseA (owner of xblockA) and can tag using enabled taxonomies - (None, "tA1", ["Tag 1"], status.HTTP_403_FORBIDDEN), + (None, "tA1", ["Tag 1"], status.HTTP_401_UNAUTHORIZED), ("user", "tA1", ["Tag 1"], status.HTTP_403_FORBIDDEN), ("userA", "tA1", ["Tag 1"], status.HTTP_200_OK), ("userS", "tA1", ["Tag 1"], status.HTTP_200_OK), - (None, "tA1", [], status.HTTP_403_FORBIDDEN), + (None, "tA1", [], status.HTTP_401_UNAUTHORIZED), ("user", "tA1", [], status.HTTP_403_FORBIDDEN), ("userA", "tA1", [], status.HTTP_200_OK), ("userS", "tA1", [], status.HTTP_200_OK), - (None, "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_403_FORBIDDEN), + (None, "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_401_UNAUTHORIZED), ("user", "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_403_FORBIDDEN), ("userA", "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_200_OK), ("userS", "multiple_taxonomy", ["Tag 1", "Tag 2"], status.HTTP_200_OK), - (None, "open_taxonomy", ["tag1"], status.HTTP_403_FORBIDDEN), + (None, "open_taxonomy", ["tag1"], status.HTTP_401_UNAUTHORIZED), ("user", "open_taxonomy", ["tag1"], status.HTTP_403_FORBIDDEN), ("userA", "open_taxonomy", ["tag1"], status.HTTP_200_OK), ("userS", "open_taxonomy", ["tag1"], status.HTTP_200_OK), # Only userS is Tagging Admin and can tag objects using disabled taxonomies - (None, "tA2", ["Tag 1"], status.HTTP_403_FORBIDDEN), + (None, "tA2", ["Tag 1"], status.HTTP_401_UNAUTHORIZED), ("user", "tA2", ["Tag 1"], status.HTTP_403_FORBIDDEN), ("userA", "tA2", ["Tag 1"], status.HTTP_403_FORBIDDEN), ("userS", "tA2", ["Tag 1"], status.HTTP_200_OK), @@ -804,11 +804,11 @@ def test_tag_xblock(self, user_attr, taxonomy_attr, tag_values, expected_status) @ddt.data( # Can't add invalid tags to a object using a closed taxonomy - (None, "tA1", ["invalid"], status.HTTP_403_FORBIDDEN), + (None, "tA1", ["invalid"], status.HTTP_401_UNAUTHORIZED), ("user", "tA1", ["invalid"], status.HTTP_403_FORBIDDEN), ("userA", "tA1", ["invalid"], status.HTTP_400_BAD_REQUEST), ("userS", "tA1", ["invalid"], status.HTTP_400_BAD_REQUEST), - (None, "multiple_taxonomy", ["invalid"], status.HTTP_403_FORBIDDEN), + (None, "multiple_taxonomy", ["invalid"], status.HTTP_401_UNAUTHORIZED), ("user", "multiple_taxonomy", ["invalid"], status.HTTP_403_FORBIDDEN), ("userA", "multiple_taxonomy", ["invalid"], status.HTTP_400_BAD_REQUEST), ("userS", "multiple_taxonomy", ["invalid"], status.HTTP_400_BAD_REQUEST), From 7af7082f302b0473ee8377ddb205b37c98ca9719 Mon Sep 17 00:00:00 2001 From: XnpioChV Date: Fri, 13 Oct 2023 09:46:57 -0500 Subject: [PATCH 4/7] style: Nits for lint --- cms/djangoapps/contentstore/utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cms/djangoapps/contentstore/utils.py b/cms/djangoapps/contentstore/utils.py index 355fa430e619..83c26197a4a7 100644 --- a/cms/djangoapps/contentstore/utils.py +++ b/cms/djangoapps/contentstore/utils.py @@ -435,6 +435,9 @@ def get_custom_pages_url(course_locator) -> str: def get_taxonomy_list_url(): + """ + Gets course authoring microfrontend URL for taxonomy list page view. + """ taxonomy_list_url = None if use_tagging_taxonomy_list_page(): mfe_base_url = settings.COURSE_AUTHORING_MICROFRONTEND_URL @@ -1564,6 +1567,7 @@ def get_course_rerun_context(course_key, course_block, user): return course_rerun_context + class StudioPermissionsService: """ Service that can provide information about a user's permissions. From b8288647a05c9261ddc300d612d988430d0aa0b1 Mon Sep 17 00:00:00 2001 From: XnpioChV Date: Fri, 13 Oct 2023 10:05:09 -0500 Subject: [PATCH 5/7] test: Tests for taxonomy list waffle flag --- .../rest_api/v1/views/tests/test_home.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_home.py b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_home.py index 110ee24ba150..6abfc403eed4 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_home.py +++ b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_home.py @@ -4,11 +4,15 @@ import ddt from django.conf import settings from django.urls import reverse -from edx_toggles.toggles.testutils import override_waffle_switch +from edx_toggles.toggles.testutils import ( + override_waffle_switch, + override_waffle_flag, +) from rest_framework import status from cms.djangoapps.contentstore.tests.utils import CourseTestCase from cms.djangoapps.contentstore.views.course import ENABLE_GLOBAL_STAFF_OPTIMIZATION +from cms.djangoapps.contentstore.toggles import ENABLE_TAGGING_TAXONOMY_LIST_PAGE from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory from xmodule.modulestore.tests.factories import CourseFactory @@ -49,7 +53,9 @@ def test_home_page_response(self): "in_process_course_actions": [], "libraries": [], "libraries_enabled": True, + "taxonomies_enabled": False, "library_authoring_mfe_url": settings.LIBRARY_AUTHORING_MICROFRONTEND_URL, + "taxonomy_list_mfe_url": None, "optimization_enabled": False, "redirect_to_library_authoring_mfe": False, "request_course_creator_url": "/request_course_creator", @@ -87,3 +93,12 @@ def test_org_query_if_empty(self): response = self.client.get(self.url) self.assertEqual(len(response.data['courses']), 0) self.assertEqual(response.status_code, status.HTTP_200_OK) + + @override_waffle_flag(ENABLE_TAGGING_TAXONOMY_LIST_PAGE, True) + def test_taxonomy_list_link(self): + response = self.client.get(self.url) + self.assertTrue(response.data['taxonomies_enabled']) + self.assertEqual( + response.data['taxonomy_list_mfe_url'], + f'{settings.COURSE_AUTHORING_MICROFRONTEND_URL}/taxonomy-list' + ) From 706c5c20ff2f0b8cb0ed7a0a92dd73f903778e5c Mon Sep 17 00:00:00 2001 From: XnpioChV Date: Fri, 13 Oct 2023 10:52:55 -0500 Subject: [PATCH 6/7] style: Nit for lints --- .../contentstore/rest_api/v1/views/tests/test_home.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_home.py b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_home.py index 6abfc403eed4..99f1b450cc0d 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_home.py +++ b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_home.py @@ -7,7 +7,7 @@ from edx_toggles.toggles.testutils import ( override_waffle_switch, override_waffle_flag, -) +) from rest_framework import status from cms.djangoapps.contentstore.tests.utils import CourseTestCase From 731722b7d23d59326d03fb680a96aa2e9ea16053 Mon Sep 17 00:00:00 2001 From: XnpioChV Date: Fri, 13 Oct 2023 15:47:22 -0500 Subject: [PATCH 7/7] chore: Bump version of openedx-learning. --- requirements/constraints.txt | 2 +- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/kernel.in | 2 +- requirements/edx/testing.txt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index f39da29f11c5..6b68db0e11bf 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -121,7 +121,7 @@ libsass==0.10.0 click==8.1.6 # pinning this version to avoid updates while the library is being developed -openedx-learning==0.2.3 +openedx-learning==0.2.4 # lti-consumer-xblock 9.6.2 contains a breaking change that makes # existing custom parameter configurations unusable. diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index f8c2a196926b..119461936aa8 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -785,7 +785,7 @@ openedx-filters==1.6.0 # via # -r requirements/edx/kernel.in # lti-consumer-xblock -openedx-learning @ git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page +openedx-learning==0.2.4 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index f1e886ded04d..29b9567f14a4 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1318,7 +1318,7 @@ openedx-filters==1.6.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # lti-consumer-xblock -openedx-learning @ git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page +openedx-learning==0.2.4 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index cfbb34ca4f79..c5b3e10f6d6e 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -925,7 +925,7 @@ openedx-filters==1.6.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock -openedx-learning @ git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page +openedx-learning==0.2.4 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt diff --git a/requirements/edx/kernel.in b/requirements/edx/kernel.in index 8fd85bbb1416..1c727d2f9c2c 100644 --- a/requirements/edx/kernel.in +++ b/requirements/edx/kernel.in @@ -117,7 +117,7 @@ openedx-calc # Library supporting mathematical calculatio openedx-django-require openedx-events # Open edX Events from Hooks Extension Framework (OEP-50) openedx-filters # Open edX Filters from Hooks Extension Framework (OEP-50) -openedx-learning@git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page#egg=0.2.3 # Open edX Learning core (experimental) +openedx-learning # Open edX Learning core (experimental) openedx-mongodbproxy openedx-django-wiki openedx-blockstore diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 85353939a4d7..831ee3136d6f 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -992,7 +992,7 @@ openedx-filters==1.6.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock -openedx-learning @ git+https://github.com/open-craft/openedx-learning.git@chris/FAL-3522-taxonomy-list-page +openedx-learning==0.2.4 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt