From 7316111b35c8db0b93665e00aa4071685d772ab3 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Tue, 8 Oct 2024 10:22:41 -0700 Subject: [PATCH 01/32] fix: Improve v2 library block permissions checks for read-only authors (#35598) --- .../templates/xblock_v2}/xblock_iframe.html | 2 +- lms/templates/xblock_v2/xblock_iframe.html | 1 - .../content_libraries/library_context.py | 73 ++++++++++--------- .../content_libraries/permissions.py | 15 +++- .../content_libraries/tests/base.py | 9 +++ .../tests/test_content_libraries.py | 42 ++++++++--- .../djangoapps/content_libraries/views.py | 2 +- openedx/core/djangoapps/xblock/api.py | 42 ++++++++--- .../learning_context/learning_context.py | 25 +++++-- .../core/djangoapps/xblock/rest_api/views.py | 8 +- 10 files changed, 149 insertions(+), 70 deletions(-) rename {cms/templates/content_libraries => common/templates/xblock_v2}/xblock_iframe.html (99%) delete mode 120000 lms/templates/xblock_v2/xblock_iframe.html diff --git a/cms/templates/content_libraries/xblock_iframe.html b/common/templates/xblock_v2/xblock_iframe.html similarity index 99% rename from cms/templates/content_libraries/xblock_iframe.html rename to common/templates/xblock_v2/xblock_iframe.html index b6e455f785..8b733373bd 100644 --- a/cms/templates/content_libraries/xblock_iframe.html +++ b/common/templates/xblock_v2/xblock_iframe.html @@ -156,7 +156,7 @@ - + {{ fragment.body_html | safe }} diff --git a/lms/templates/xblock_v2/xblock_iframe.html b/lms/templates/xblock_v2/xblock_iframe.html deleted file mode 120000 index 7264c25346..0000000000 --- a/lms/templates/xblock_v2/xblock_iframe.html +++ /dev/null @@ -1 +0,0 @@ -../../../cms/templates/content_libraries/xblock_iframe.html \ No newline at end of file diff --git a/openedx/core/djangoapps/content_libraries/library_context.py b/openedx/core/djangoapps/content_libraries/library_context.py index 6ff426e735..4bda10eb12 100644 --- a/openedx/core/djangoapps/content_libraries/library_context.py +++ b/openedx/core/djangoapps/content_libraries/library_context.py @@ -1,19 +1,21 @@ """ Definition of "Library" as a learning context. """ - import logging from django.core.exceptions import PermissionDenied +from rest_framework.exceptions import NotFound from openedx_events.content_authoring.data import LibraryBlockData from openedx_events.content_authoring.signals import LIBRARY_BLOCK_UPDATED +from opaque_keys.edx.keys import UsageKeyV2 +from opaque_keys.edx.locator import LibraryUsageLocatorV2, LibraryLocatorV2 +from openedx_learning.api import authoring as authoring_api from openedx.core.djangoapps.content_libraries import api, permissions from openedx.core.djangoapps.content_libraries.models import ContentLibrary from openedx.core.djangoapps.xblock.api import LearningContext - -from openedx_learning.api import authoring as authoring_api +from openedx.core.types import User as UserType log = logging.getLogger(__name__) @@ -30,47 +32,51 @@ class LibraryContextImpl(LearningContext): super().__init__(**kwargs) self.use_draft = kwargs.get('use_draft', None) - def can_edit_block(self, user, usage_key): + def can_edit_block(self, user: UserType, usage_key: UsageKeyV2) -> bool: """ - Does the specified usage key exist in its context, and if so, does the - specified user have permission to edit it (make changes to the authored - data store)? + Assuming a block with the specified ID (usage_key) exists, does the + specified user have permission to edit it (make changes to the + fields / authored data store)? - user: a Django User object (may be an AnonymousUser) - - usage_key: the UsageKeyV2 subclass used for this learning context - - Must return a boolean. + May raise ContentLibraryNotFound if the library does not exist. """ - try: - api.require_permission_for_library_key(usage_key.lib_key, user, permissions.CAN_EDIT_THIS_CONTENT_LIBRARY) - except (PermissionDenied, api.ContentLibraryNotFound): - return False + assert isinstance(usage_key, LibraryUsageLocatorV2) + return self._check_perm(user, usage_key.lib_key, permissions.CAN_EDIT_THIS_CONTENT_LIBRARY) - return self.block_exists(usage_key) + def can_view_block_for_editing(self, user: UserType, usage_key: UsageKeyV2) -> bool: + """ + Assuming a block with the specified ID (usage_key) exists, does the + specified user have permission to view its fields and OLX details (but + not necessarily to make changes to it)? - def can_view_block(self, user, usage_key): + May raise ContentLibraryNotFound if the library does not exist. + """ + assert isinstance(usage_key, LibraryUsageLocatorV2) + return self._check_perm(user, usage_key.lib_key, permissions.CAN_VIEW_THIS_CONTENT_LIBRARY) + + def can_view_block(self, user: UserType, usage_key: UsageKeyV2) -> bool: """ Does the specified usage key exist in its context, and if so, does the specified user have permission to view it and interact with it (call handlers, save user state, etc.)? - user: a Django User object (may be an AnonymousUser) - - usage_key: the UsageKeyV2 subclass used for this learning context - - Must return a boolean. + May raise ContentLibraryNotFound if the library does not exist. """ + assert isinstance(usage_key, LibraryUsageLocatorV2) + return self._check_perm(user, usage_key.lib_key, permissions.CAN_LEARN_FROM_THIS_CONTENT_LIBRARY) + + def _check_perm(self, user: UserType, lib_key: LibraryLocatorV2, perm) -> bool: + """ Helper method to check a permission for the various can_ methods""" try: - api.require_permission_for_library_key( - usage_key.lib_key, user, permissions.CAN_LEARN_FROM_THIS_CONTENT_LIBRARY, - ) - except (PermissionDenied, api.ContentLibraryNotFound): + api.require_permission_for_library_key(lib_key, user, perm) + return True + except PermissionDenied: return False + except api.ContentLibraryNotFound as exc: + # A 404 is probably what you want in this case, not a 500 error, so do that by default. + raise NotFound(f"Content Library '{lib_key}' does not exist") from exc - return self.block_exists(usage_key) - - def block_exists(self, usage_key): + def block_exists(self, usage_key: LibraryUsageLocatorV2): """ Does the block for this usage_key exist in this Library? @@ -82,7 +88,7 @@ class LibraryContextImpl(LearningContext): version of it. """ try: - content_lib = ContentLibrary.objects.get_by_key(usage_key.context_key) + content_lib = ContentLibrary.objects.get_by_key(usage_key.context_key) # type: ignore[attr-defined] except ContentLibrary.DoesNotExist: return False @@ -97,12 +103,11 @@ class LibraryContextImpl(LearningContext): local_key=usage_key.block_id, ) - def send_block_updated_event(self, usage_key): + def send_block_updated_event(self, usage_key: UsageKeyV2): """ Send a "block updated" event for the library block with the given usage_key. - - usage_key: the UsageKeyV2 subclass used for this learning context """ + assert isinstance(usage_key, LibraryUsageLocatorV2) LIBRARY_BLOCK_UPDATED.send_event( library_block=LibraryBlockData( library_key=usage_key.lib_key, diff --git a/openedx/core/djangoapps/content_libraries/permissions.py b/openedx/core/djangoapps/content_libraries/permissions.py index c7da012c9f..17671b5659 100644 --- a/openedx/core/djangoapps/content_libraries/permissions.py +++ b/openedx/core/djangoapps/content_libraries/permissions.py @@ -2,7 +2,8 @@ Permissions for Content Libraries (v2, Learning-Core-based) """ from bridgekeeper import perms, rules -from bridgekeeper.rules import Attribute, ManyRelation, Relation, in_current_groups +from bridgekeeper.rules import Attribute, ManyRelation, Relation, blanket_rule, in_current_groups +from django.conf import settings from openedx.core.djangoapps.content_libraries.models import ContentLibraryPermission @@ -41,6 +42,12 @@ has_explicit_admin_permission_for_library = ( ) +# Are we in Studio? (Is there a better or more contextual way to define this, e.g. get from learning context?) +@blanket_rule +def is_studio_request(_): + return settings.SERVICE_VARIANT == "cms" + + ########################### Permissions ########################### # Is the user allowed to view XBlocks from the specified content library @@ -51,10 +58,12 @@ CAN_LEARN_FROM_THIS_CONTENT_LIBRARY = 'content_libraries.learn_from_library' perms[CAN_LEARN_FROM_THIS_CONTENT_LIBRARY] = ( # Global staff can learn from any library: is_global_staff | - # Regular users can learn if the library allows public learning: + # Regular and even anonymous users can learn if the library allows public learning: Attribute('allow_public_learning', True) | # Users/groups who are explicitly granted permission can learn from the library: - (is_user_active & has_explicit_read_permission_for_library) + (is_user_active & has_explicit_read_permission_for_library) | + # Or, in Studio (but not the LMS) any users can access libraries with "public read" permissions: + (is_studio_request & is_user_active & Attribute('allow_public_read', True)) ) # Is the user allowed to create content libraries? diff --git a/openedx/core/djangoapps/content_libraries/tests/base.py b/openedx/core/djangoapps/content_libraries/tests/base.py index 987133255f..0ed47f995f 100644 --- a/openedx/core/djangoapps/content_libraries/tests/base.py +++ b/openedx/core/djangoapps/content_libraries/tests/base.py @@ -308,3 +308,12 @@ class ContentLibrariesRestApiTest(APITransactionTestCase): """ url = URL_BLOCK_GET_HANDLER_URL.format(block_key=block_key, handler_name=handler_name) return self._api('get', url, None, expect_response=200)["handler_url"] + + def _get_library_block_fields(self, block_key, expect_response=200): + """ Get the fields of a specific block in the library. This API is only used by the MFE editors. """ + result = self._api('get', URL_BLOCK_FIELDS_URL.format(block_key=block_key), None, expect_response) + return result + + def _set_library_block_fields(self, block_key, new_fields, expect_response=200): + """ Set the fields of a specific block in the library. This API is only used by the MFE editors. """ + return self._api('post', URL_BLOCK_FIELDS_URL.format(block_key=block_key), new_fields, expect_response) diff --git a/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py b/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py index d995a2c796..56e258f8a1 100644 --- a/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py +++ b/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py @@ -502,6 +502,30 @@ class ContentLibrariesTestCase(ContentLibrariesRestApiTest, OpenEdxEventsTestMix # Add a 'problem' XBlock to the library: self._add_block_to_library(lib_id, block_type, 'test-block', expect_response=expect_response) + def test_library_not_found(self): + """Test that requests fail with 404 when the library does not exist""" + valid_not_found_key = 'lb:valid:key:video:1' + response = self.client.get(URL_BLOCK_METADATA_URL.format(block_key=valid_not_found_key)) + self.assertEqual(response.status_code, 404) + self.assertEqual(response.json(), { + 'detail': "Content Library 'lib:valid:key' does not exist", + }) + + def test_block_not_found(self): + """Test that requests fail with 404 when the library exists but the XBlock does not""" + lib = self._create_library( + slug="test_lib_block_event_delete", + title="Event Test Library", + description="Testing event in library" + ) + library_key = LibraryLocatorV2.from_string(lib['id']) + non_existent_block_key = LibraryUsageLocatorV2(lib_key=library_key, block_type='video', usage_id='123') + response = self.client.get(URL_BLOCK_METADATA_URL.format(block_key=non_existent_block_key)) + self.assertEqual(response.status_code, 404) + self.assertEqual(response.json(), { + 'detail': f"The component '{non_existent_block_key}' does not exist.", + }) + # Test that permissions are enforced for content libraries def test_library_permissions(self): # pylint: disable=too-many-statements @@ -635,21 +659,27 @@ class ContentLibrariesTestCase(ContentLibrariesRestApiTest, OpenEdxEventsTestMix # A random user cannot read OLX nor assets (this library has allow_public_read False): with self.as_user(random_user): self._get_library_block_olx(block3_key, expect_response=403) + self._get_library_block_fields(block3_key, expect_response=403) self._get_library_block_assets(block3_key, expect_response=403) self._get_library_block_asset(block3_key, file_name="whatever.png", expect_response=403) + # Nor can they preview the block: + self._render_block_view(block3_key, view_name="student_view", expect_response=403) # But if we grant allow_public_read, then they can: with self.as_user(admin): self._update_library(lib_id, allow_public_read=True) # self._set_library_block_asset(block3_key, "whatever.png", b"data") with self.as_user(random_user): self._get_library_block_olx(block3_key) + self._render_block_view(block3_key, view_name="student_view") + f = self._get_library_block_fields(block3_key) # self._get_library_block_assets(block3_key) # self._get_library_block_asset(block3_key, file_name="whatever.png") - # Users without authoring permission cannot edit nor delete XBlocks (this library has allow_public_read False): + # Users without authoring permission cannot edit nor delete XBlocks: for user in [reader, random_user]: with self.as_user(user): self._set_library_block_olx(block3_key, "", expect_response=403) + self._set_library_block_fields(block3_key, {"data": "", "metadata": {}}, expect_response=403) # self._set_library_block_asset(block3_key, "test.txt", b"data", expect_response=403) self._delete_library_block(block3_key, expect_response=403) self._commit_library_changes(lib_id, expect_response=403) @@ -659,6 +689,7 @@ class ContentLibrariesTestCase(ContentLibrariesRestApiTest, OpenEdxEventsTestMix with self.as_user(author_group_member): olx = self._get_library_block_olx(block3_key) self._set_library_block_olx(block3_key, olx) + self._set_library_block_fields(block3_key, {"data": olx, "metadata": {}}) # self._get_library_block_assets(block3_key) # self._set_library_block_asset(block3_key, "test.txt", b"data") # self._get_library_block_asset(block3_key, file_name="test.txt") @@ -1087,12 +1118,3 @@ class ContentLibraryXBlockValidationTest(APITestCase): secure_token='random', ))) self.assertEqual(response.status_code, 404) - - def test_not_found_fails_correctly(self): - """Test fails with 404 when xblock key is valid but not found.""" - valid_not_found_key = 'lb:valid:key:video:1' - response = self.client.get(URL_BLOCK_METADATA_URL.format(block_key=valid_not_found_key)) - self.assertEqual(response.status_code, 404) - self.assertEqual(response.json(), { - 'detail': f"XBlock {valid_not_found_key} does not exist, or you don't have permission to view it.", - }) diff --git a/openedx/core/djangoapps/content_libraries/views.py b/openedx/core/djangoapps/content_libraries/views.py index 835a5de1f1..3712af6e59 100644 --- a/openedx/core/djangoapps/content_libraries/views.py +++ b/openedx/core/djangoapps/content_libraries/views.py @@ -919,7 +919,7 @@ class LtiToolLaunchView(TemplateResponseMixin, LtiToolView): LTI platform. Other features and resouces are ignored. """ - template_name = 'content_libraries/xblock_iframe.html' + template_name = 'xblock_v2/xblock_iframe.html' @property def launch_data(self): diff --git a/openedx/core/djangoapps/xblock/api.py b/openedx/core/djangoapps/xblock/api.py index 80a4bd57ea..43ec3909bc 100644 --- a/openedx/core/djangoapps/xblock/api.py +++ b/openedx/core/djangoapps/xblock/api.py @@ -8,11 +8,12 @@ Note that these views are only for interacting with existing blocks. Other Studio APIs cover use cases like adding/deleting/editing blocks. """ # pylint: disable=unused-import - +from enum import Enum from datetime import datetime import logging import threading +from django.core.exceptions import PermissionDenied from django.urls import reverse from django.utils.translation import gettext as _ from openedx_learning.api import authoring as authoring_api @@ -21,7 +22,7 @@ from opaque_keys.edx.keys import UsageKeyV2 from opaque_keys.edx.locator import BundleDefinitionLocator, LibraryUsageLocatorV2 from rest_framework.exceptions import NotFound from xblock.core import XBlock -from xblock.exceptions import NoSuchViewError +from xblock.exceptions import NoSuchUsage, NoSuchViewError from xblock.plugin import PluginMissingError from openedx.core.djangoapps.xblock.apps import get_xblock_app_config @@ -43,6 +44,16 @@ from openedx.core.djangoapps.xblock.learning_context import LearningContext log = logging.getLogger(__name__) +class CheckPerm(Enum): + """ Options for the default permission check done by load_block() """ + # can view the published block and call handlers etc. but not necessarily view its OLX source nor field data + CAN_LEARN = 1 + # read-only studio view: can see the block (draft or published), see its OLX, see its field data, etc. + CAN_READ_AS_AUTHOR = 2 + # can view everything and make changes to the block + CAN_EDIT = 3 + + def get_runtime_system(): """ Return a new XBlockRuntimeSystem. @@ -74,15 +85,15 @@ def get_runtime_system(): return runtime -def load_block(usage_key, user): +def load_block(usage_key, user, *, check_permission: CheckPerm | None = CheckPerm.CAN_LEARN): """ Load the specified XBlock for the given user. Returns an instantiated XBlock. Exceptions: - NotFound - if the XBlock doesn't exist or if the user doesn't have the - necessary permissions + NotFound - if the XBlock doesn't exist + PermissionDenied - if the user doesn't have the necessary permissions Args: usage_key(OpaqueKey): block identifier @@ -94,10 +105,17 @@ def load_block(usage_key, user): # Now, check if the block exists in this context and if the user has # permission to render this XBlock view: - if user is not None and not context_impl.can_view_block(user, usage_key): - # We do not know if the block was not found or if the user doesn't have - # permission, but we want to return the same result in either case: - raise NotFound(f"XBlock {usage_key} does not exist, or you don't have permission to view it.") + if check_permission and user is not None: + if check_permission == CheckPerm.CAN_EDIT: + has_perm = context_impl.can_edit_block(user, usage_key) + elif check_permission == CheckPerm.CAN_READ_AS_AUTHOR: + has_perm = context_impl.can_view_block_for_editing(user, usage_key) + elif check_permission == CheckPerm.CAN_LEARN: + has_perm = context_impl.can_view_block(user, usage_key) + else: + has_perm = False + if not has_perm: + raise PermissionDenied(f"You don't have permission to access the component '{usage_key}'.") # TODO: load field overrides from the context # e.g. a course might specify that all 'problem' XBlocks have 'max_attempts' @@ -105,7 +123,11 @@ def load_block(usage_key, user): # field_overrides = context_impl.get_field_overrides(usage_key) runtime = get_runtime_system().get_runtime(user=user) - return runtime.get_block(usage_key) + try: + return runtime.get_block(usage_key) + except NoSuchUsage as exc: + # Convert NoSuchUsage to NotFound so we do the right thing (404 not 500) by default. + raise NotFound(f"The component '{usage_key}' does not exist.") from exc def get_block_metadata(block, includes=()): diff --git a/openedx/core/djangoapps/xblock/learning_context/learning_context.py b/openedx/core/djangoapps/xblock/learning_context/learning_context.py index 2dc5155dc4..b535e84ca7 100644 --- a/openedx/core/djangoapps/xblock/learning_context/learning_context.py +++ b/openedx/core/djangoapps/xblock/learning_context/learning_context.py @@ -2,6 +2,8 @@ A "Learning Context" is a course, a library, a program, or some other collection of content where learning happens. """ +from openedx.core.types import User as UserType +from opaque_keys.edx.keys import UsageKeyV2 class LearningContext: @@ -23,11 +25,11 @@ class LearningContext: parameters without changing the API. """ - def can_edit_block(self, user, usage_key): # pylint: disable=unused-argument + def can_edit_block(self, user: UserType, usage_key: UsageKeyV2) -> bool: # pylint: disable=unused-argument """ - Does the specified usage key exist in its context, and if so, does the - specified user have permission to edit it (make changes to the authored - data store)? + Assuming a block with the specified ID (usage_key) exists, does the + specified user have permission to edit it (make changes to the + fields / authored data store)? user: a Django User object (may be an AnonymousUser) @@ -37,11 +39,20 @@ class LearningContext: """ return False - def can_view_block(self, user, usage_key): # pylint: disable=unused-argument + def can_view_block_for_editing(self, user: UserType, usage_key: UsageKeyV2) -> bool: """ - Does the specified usage key exist in its context, and if so, does the + Assuming a block with the specified ID (usage_key) exists, does the + specified user have permission to view its fields and OLX details (but + not necessarily to make changes to it)? + """ + return self.can_edit_block(user, usage_key) + + def can_view_block(self, user: UserType, usage_key: UsageKeyV2) -> bool: # pylint: disable=unused-argument + """ + Assuming a block with the specified ID (usage_key) exists, does the specified user have permission to view it and interact with it (call - handlers, save user state, etc.)? + handlers, save user state, etc.)? This is also sometimes called the + "can_learn" permission. user: a Django User object (may be an AnonymousUser) diff --git a/openedx/core/djangoapps/xblock/rest_api/views.py b/openedx/core/djangoapps/xblock/rest_api/views.py index 7934e24bd2..20e6a6dde0 100644 --- a/openedx/core/djangoapps/xblock/rest_api/views.py +++ b/openedx/core/djangoapps/xblock/rest_api/views.py @@ -29,6 +29,7 @@ import openedx.core.djangoapps.site_configuration.helpers as configuration_helpe from openedx.core.djangoapps.xblock.learning_context.manager import get_learning_context_impl from openedx.core.lib.api.view_utils import view_auth_classes from ..api import ( + CheckPerm, get_block_metadata, get_block_display_name, get_handler_url as _get_handler_url, @@ -108,7 +109,7 @@ def embed_block_view(request, usage_key_str, view_name): raise NotFound(invalid_not_found_fmt.format(usage_key=usage_key_str)) from e try: - block = load_block(usage_key, request.user) + block = load_block(usage_key, request.user, check_permission=CheckPerm.CAN_LEARN) except NoSuchUsage as exc: raise NotFound(f"{usage_key} not found") from exc @@ -246,7 +247,8 @@ class BlockFieldsView(APIView): except InvalidKeyError as e: raise NotFound(invalid_not_found_fmt.format(usage_key=usage_key_str)) from e - block = load_block(usage_key, request.user) + # The "fields" view requires "read as author" permissions because the fields can contain answers, etc. + block = load_block(usage_key, request.user, check_permission=CheckPerm.CAN_READ_AS_AUTHOR) block_dict = { "display_name": get_block_display_name(block), # potentially duplicated from metadata "data": block.data, @@ -265,7 +267,7 @@ class BlockFieldsView(APIView): raise NotFound(invalid_not_found_fmt.format(usage_key=usage_key_str)) from e user = request.user - block = load_block(usage_key, user) + block = load_block(usage_key, user, check_permission=CheckPerm.CAN_EDIT) data = request.data.get("data") metadata = request.data.get("metadata") From 0a4d24adecbb23165b4e6472c5b79546e9707ef4 Mon Sep 17 00:00:00 2001 From: katrinan029 <71999631+katrinan029@users.noreply.github.com> Date: Tue, 8 Oct 2024 21:35:39 +0000 Subject: [PATCH 02/32] feat: Upgrade Python dependency edx-enterprise version bump Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master` --- requirements/constraints.txt | 2 +- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 3809b753a5..396b95d838 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -26,7 +26,7 @@ celery>=5.2.2,<6.0.0 # The team that owns this package will manually bump this package rather than having it pulled in automatically. # This is to allow them to better control its deployment and to do it in a process that works better # for them. -edx-enterprise==4.27.0 +edx-enterprise==4.27.2 # Stay on LTS version, remove once this is added to common constraint Django<5.0 diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 0eca9a532a..55793bd0c5 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -467,7 +467,7 @@ edx-drf-extensions==10.4.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.27.0 +edx-enterprise==4.27.2 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index abd9922253..1bdd373651 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -741,7 +741,7 @@ edx-drf-extensions==10.4.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.27.0 +edx-enterprise==4.27.2 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index f8b45c5ddc..6f12d80467 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -547,7 +547,7 @@ edx-drf-extensions==10.4.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.27.0 +edx-enterprise==4.27.2 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 7fa8962c4f..d3b14a6f43 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -571,7 +571,7 @@ edx-drf-extensions==10.4.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.27.0 +edx-enterprise==4.27.2 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt From 7cf12d861c28310b13f2e94d9e63aa45e3bef4b6 Mon Sep 17 00:00:00 2001 From: Muhammad Adeel Tajamul <77053848+muhammadadeeltajamul@users.noreply.github.com> Date: Wed, 9 Oct 2024 13:56:58 +0500 Subject: [PATCH 03/32] chore: removed style from email digest content (#35592) --- .../rest_api/discussions_notifications.py | 13 +++-- .../tests/test_discussions_notifications.py | 50 ++++++++++--------- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/lms/djangoapps/discussion/rest_api/discussions_notifications.py b/lms/djangoapps/discussion/rest_api/discussions_notifications.py index 4e372280ce..498a05fdb9 100644 --- a/lms/djangoapps/discussion/rest_api/discussions_notifications.py +++ b/lms/djangoapps/discussion/rest_api/discussions_notifications.py @@ -392,7 +392,8 @@ def clean_thread_html_body(html_body): "video", "track", # Video Tags "audio", # Audio Tags "embed", "object", "iframe", # Embedded Content - "script" + "script", + "b", "strong", "i", "em", "u", "s", "strike", "del", "ins", "mark", "sub", "sup", # Text Formatting ] # Remove the specified tags while keeping their content @@ -403,9 +404,10 @@ def clean_thread_html_body(html_body): # Replace tags that are not allowed in email tags_to_update = [ {"source": "button", "target": "span"}, - {"source": "h1", "target": "h4"}, - {"source": "h2", "target": "h4"}, - {"source": "h3", "target": "h4"}, + *[ + {"source": tag, "target": "p"} + for tag in ["div", "section", "article", "h1", "h2", "h3", "h4", "h5", "h6"] + ], ] for tag_dict in tags_to_update: for source_tag in html_body.find_all(tag_dict['source']): @@ -414,4 +416,7 @@ def clean_thread_html_body(html_body): target_tag.string = source_tag.string source_tag.replace_with(target_tag) + for tag in html_body.find_all(True): + tag.attrs = {} + tag['style'] = 'margin: 0' return str(html_body) diff --git a/lms/djangoapps/discussion/rest_api/tests/test_discussions_notifications.py b/lms/djangoapps/discussion/rest_api/tests/test_discussions_notifications.py index d92e1000fe..0a8d750416 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_discussions_notifications.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_discussions_notifications.py @@ -104,14 +104,14 @@ class TestCleanThreadHtmlBody(unittest.TestCase):

This is a link to a page.

Here is an image: image

Embedded video:

-

Script test:

+

Script test:

Some other content that should remain.

""" - expected_output = ("

This is a link to a page.

" - "

Here is an image:

" - "

Embedded video:

" - "

Script test: alert('hello');

" - "

Some other content that should remain.

") + expected_output = ('

This is a link to a page.

' + '

Here is an image:

' + '

Embedded video:

' + '

Script test: alert("hello");

' + '

Some other content that should remain.

') result = clean_thread_html_body(html_body) @@ -132,19 +132,16 @@ class TestCleanThreadHtmlBody(unittest.TestCase): """ Test that the clean_thread_html_body function truncates the HTML body to 500 characters """ - html_body = """ -

This is a long text that should be truncated to 500 characters.

- """ * 20 # Repeat to exceed 500 characters - - result = clean_thread_html_body(html_body) - self.assertGreaterEqual(500, len(result)) + html_body = "This is a long text that should be truncated to 500 characters." * 20 + result = clean_thread_html_body(f"

{html_body}

") + self.assertGreaterEqual(525, len(result)) # 500 characters + 25 characters for the HTML tags def test_no_tags_to_remove(self): """ Test that the clean_thread_html_body function does not remove any tags if there are no unwanted tags """ html_body = "

This paragraph has no tags to remove.

" - expected_output = "

This paragraph has no tags to remove.

" + expected_output = '

This paragraph has no tags to remove.

' result = clean_thread_html_body(html_body) self.assertEqual(result, expected_output) @@ -169,28 +166,33 @@ class TestCleanThreadHtmlBody(unittest.TestCase): result = clean_thread_html_body(html_body) self.assertEqual(result.strip(), expected_output) + def test_tag_replace(self): + """ + Tests if the clean_thread_html_body function replaces tags + """ + for tag in ["div", "section", "article", "h1", "h2", "h3", "h4", "h5", "h6"]: + html_body = f'<{tag}>Text' + result = clean_thread_html_body(html_body) + self.assertEqual(result, '

Text

') + def test_button_tag_replace(self): """ Tests that the clean_thread_html_body function replaces the button tag with span tag """ # Tests for button replacement tag with text html_body = '' - expected_output = 'Button' + expected_output = 'Button' result = clean_thread_html_body(html_body) self.assertEqual(result, expected_output) # Tests button tag replacement without text html_body = '' - expected_output = '' + expected_output = '' result = clean_thread_html_body(html_body) self.assertEqual(result, expected_output) - def test_heading_tag_replace(self): - """ - Tests that the clean_thread_html_body function replaces the h1, h2 and h3 tags with h4 tag - """ - for tag in ['h1', 'h2', 'h3']: - html_body = f'<{tag}>Heading' - expected_output = '

Heading

' - result = clean_thread_html_body(html_body) - self.assertEqual(result, expected_output) + def test_attributes_removal_from_tag(self): + # Tests for removal of attributes from tags + html_body = '

Paragraph

' + result = clean_thread_html_body(html_body) + self.assertEqual(result, '

Paragraph

') From f5b88392a545c3efcda7015526d0701382b70220 Mon Sep 17 00:00:00 2001 From: Hunia Fatima Date: Wed, 9 Oct 2024 14:44:07 +0500 Subject: [PATCH 04/32] chore: cleanup constraint file and format it (#35601) * chore: cleanup constraint file and format it --- requirements/constraints.txt | 218 +++++++++++++++++++++-------------- 1 file changed, 134 insertions(+), 84 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 3809b753a5..996391b2be 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -7,7 +7,8 @@ # link to other information that will help people in the future to remove the # pin when possible. Writing an issue against the offending project and # linking to it here is good. - +# For further details on how to properly write constraints here please consult +# https://openedx.atlassian.net/wiki/spaces/COMM/pages/4400250883/Adding+pinned+dependencies+in+constraint+file # This file contains all common constraints for edx-repos -c common_constraints.txt @@ -18,127 +19,176 @@ # Ticket: https://github.com/openedx/edx-platform/issues/35334 algoliasearch<4.0.0 +# Date: 2024-03-14 +# Temporary to Support the python 3.11 Upgrade +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35281 +backports.zoneinfo;python_version<"3.9" # Newer versions have zoneinfo available in the standard library + +# Date: 2020-02-26 # As it is not clarified what exact breaking changes will be introduced as per # the next major release, ensure the installed version is within boundaries. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35280 celery>=5.2.2,<6.0.0 +# Date: 2021-05-17 +# greater version breaking upgrade builds +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35279 +click==8.1.6 +# Date: 2022-07-20 +# edx-enterprise, snowflake-connector-python require charset-normalizer==2.0.0 +# Can be removed once snowflake-connector-python>2.7.9 is released with the fix. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35278 +charset-normalizer<2.1.0 + +# Date: 2024-02-02 +# Stay on LTS version, remove once this is added to common constraint +Django<5.0 + +# Date: 2020-02-10 +# django-oauth-toolkit version >=2.0.0 has breaking changes. More details +# mentioned on this issue https://github.com/openedx/edx-platform/issues/32884 +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35277 +django-oauth-toolkit==1.7.1 + +# Date: 2024-02-02 +# incremental upgrade +django-simple-history==3.4.0 + +# Date: 2021-05-17 +# greater version has breaking changes and requires some migration steps. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35276 +django-webpack-loader==0.7.0 + +# Date: 2023-06-20 +# Adding pin to avoid any major upgrade +djangorestframework<3.15.0 + +# Date: 2023-07-19 +# The version of django-stubs we can use depends on which Django release we're using +# 1.16.0 works with Django 3.2 through 4.1 +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35275 +django-stubs==1.16.0 +djangorestframework-stubs==3.14.0 # Pinned to match django-stubs. Remove this when we can remove the above pin. + +# Date: 2024-07-23 +# django-storages==1.14.4 breaks course imports +# Two lines were added in 1.14.4 that make file_exists_in_storage function always return False, +# as the default value of AWS_S3_FILE_OVERWRITE is True +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35170 +django-storages<1.14.4 + +# Date: 2019-08-16 # The team that owns this package will manually bump this package rather than having it pulled in automatically. # This is to allow them to better control its deployment and to do it in a process that works better # for them. edx-enterprise==4.27.0 -# Stay on LTS version, remove once this is added to common constraint -Django<5.0 - -# django-oauth-toolkit version >=2.0.0 has breaking changes. More details -# mentioned on this issue https://github.com/openedx/edx-platform/issues/32884 -django-oauth-toolkit==1.7.1 - -# incremental upgrade -django-simple-history==3.4.0 - -# Adding pin to avoid any major upgrade -pymongo<4.4.1 +# Date: 2024-05-09 +# This has to be constrained as well because newer versions of edx-i18n-tools need the +# newer version of lxml but that requirement was not made expilict in the 1.6.0 version +# of the package. This can be un-pinned when we're upgrading lxml. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35274 +edx-i18n-tools<1.6.0 +# Date: 2024-07-26 # To override the constraint of edx-lint # This can be removed once https://github.com/openedx/edx-platform/issues/34586 is resolved # and the upstream constraint in edx-lint has been removed. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35273 event-tracking==3.0.0 -# greater version has breaking changes and requires some migration steps. -django-webpack-loader==0.7.0 - -# At the time of writing this comment, we do not know whether py2neo>=2022 -# will support our currently-deployed Neo4j version (3.5). -# Feel free to loosen this constraint if/when it is confirmed that a later -# version of py2neo will work with Neo4j 3.5. -py2neo<2022 - -# edx-enterprise, snowflake-connector-python require charset-normalizer==2.0.0 -# Can be removed once snowflake-connector-python>2.7.9 is released with the fix. -charset-normalizer<2.1.0 - -# markdown>=3.4.0 has failures due to internal refactorings which causes the tests to fail -# pinning the version untill the issue gets resolved in the package itself -markdown<3.4.0 - -# pycodestyle==2.9.0 generates false positive error E275. -# Constraint can be removed once the issue https://github.com/PyCQA/pycodestyle/issues/1090 is fixed. -pycodestyle<2.9.0 - -pylint<2.16.0 # greater version failing quality test. Fix them in seperate ticket. - -# urllib3>=2.0.0 conflicts with elastic search && snowflake-connector-python packages -# which require urllib3<2 for now. -# Issue for unpinning: https://github.com/openedx/edx-platform/issues/32222 -urllib3<2.0.0 - - -# Adding pin to avoid any major upgrade -djangorestframework<3.15.0 - -# The version of django-stubs we can use depends on which Django release we're using -# 1.16.0 works with Django 3.2 through 4.1 -django-stubs==1.16.0 -djangorestframework-stubs==3.14.0 # Pinned to match django-stubs. Remove this when we can remove the above pin. - +# Date: 2023-07-26 # Our legacy Sass code is incompatible with anything except this ancient libsass version. # Here is a ticket to upgrade, but it's of debatable importance given that we are rapidly moving # away from legacy LMS/CMS frontends: # https://github.com/openedx/edx-platform/issues/31616 libsass==0.10.0 -# greater version breaking upgrade builds -click==8.1.6 - -# pinning this version to avoid updates while the library is being developed -openedx-learning==0.13.1 - -# Open AI version 1.0.0 dropped support for openai.ChatCompletion which is currently in use in enterprise. -openai<=0.28.1 - -# optimizely-sdk 5.0.0 is breaking following test with segmentation fault -# common/djangoapps/third_party_auth/tests/test_views.py::SAMLMetadataTest::test_secure_key_configuration -# needs to be fixed in the follow up issue -# https://github.com/openedx/edx-platform/issues/34103 -optimizely-sdk<5.0 - +# Date: 2024-04-30 # lxml>=5.0 introduced breaking changes related to system dependencies # lxml==5.2.1 introduced new extra so we'll nee to rename lxml --> lxml[html-clean] # This constraint can be removed once we upgrade to Python 3.11 +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35272 lxml<5.0 -# This has to be constrained as well because newer versions of edx-i18n-tools need the -# newer version of lxml but that requirement was not made expilict in the 1.6.0 version -# of the package. This can be un-pinned when we're upgrading lxml. -edx-i18n-tools<1.6.0 -# xmlsec==1.3.14 breaking tests for all builds, can be removed once a fix is available -xmlsec<1.3.14 +# Date: 2018-12-14 +# markdown>=3.4.0 has failures due to internal refactorings which causes the tests to fail +# pinning the version untill the issue gets resolved in the package itself +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35271 +markdown<3.4.0 +# Date: 2024-04-24 # moto==5.0 contains breaking changes. Needs to be updated separately. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35270 moto<5.0 -# path==16.12.0 breaks the unit test collections check -# needs to be investigated and fixed separately -path<16.12.0 - -# Temporary to Support the python 3.11 Upgrade -backports.zoneinfo;python_version<"3.9" # Newer versions have zoneinfo available in the standard library - -# Relevant GitHub Issue: https://github.com/openedx/edx-platform/issues/35126 +# Date: 2024-07-16 # We need to upgrade the version of elasticsearch to atleast 7.15 before we can upgrade to Numpy 2.0.0 # Otherwise we see a failure while running the following command: # export DJANGO_SETTINGS_MODULE=cms.envs.test; python manage.py cms check_reserved_keywords --override_file db_keyword_overrides.yml --report_path reports/reserved_keywords --report_file cms_reserved_keyword_report.csv +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35126 numpy<2.0.0 -# django-storages==1.14.4 breaks course imports -# Two lines were added in 1.14.4 that make file_exists_in_storage function always return False, -# as the default value of AWS_S3_FILE_OVERWRITE is True -django-storages<1.14.4 +# Date: 2024-01-26 +# optimizely-sdk 5.0.0 is breaking following test with segmentation fault +# common/djangoapps/third_party_auth/tests/test_views.py::SAMLMetadataTest::test_secure_key_configuration +# needs to be fixed in the follow up issue +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/34103 +optimizely-sdk<5.0 +# Date: 2023-09-18 +# pinning this version to avoid updates while the library is being developed +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35269 +openedx-learning==0.13.1 + +# Date: 2023-11-29 +# Open AI version 1.0.0 dropped support for openai.ChatCompletion which is currently in use in enterprise. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35268 +openai<=0.28.1 + +# Date: 2024-04-26 +# path==16.12.0 breaks the unit test collections check +# needs to be investigated and fixed separately +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35267 +path<16.12.0 + +# Date: 2022-08-03 +# pycodestyle==2.9.0 generates false positive error E275. +# Constraint can be removed once the issue https://github.com/PyCQA/pycodestyle/issues/1090 is fixed. +pycodestyle<2.9.0 + +# Date: 2021-07-12 +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/33560 +pylint<2.16.0 # greater version failing quality test. Fix them in seperate ticket. + +# Date: 2021-08-25 +# At the time of writing this comment, we do not know whether py2neo>=2022 +# will support our currently-deployed Neo4j version (3.5). +# Feel free to loosen this constraint if/when it is confirmed that a later +# version of py2neo will work with Neo4j 3.5. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35266 +py2neo<2022 + +# Date: 2020-04-08 +# Adding pin to avoid any major upgrade +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35265 +pymongo<4.4.1 + +# Date: 2024-08-06 # social-auth-app-django 5.4.2 introduces a new migration that will not play nicely with large installations. This will touch # user tables, which are quite large, especially on instances like edx.org. # We are pinning this until after all the smaller migrations get handled and then we can migrate this all at once. -# Ticket to unpin: https://github.com/edx/edx-arch-experiments/issues/760 +# Issue for unpinning: https://github.com/edx/edx-arch-experiments/issues/760 social-auth-app-django<=5.4.1 + +# Date: 2023-11-05 +# urllib3>=2.0.0 conflicts with elastic search && snowflake-connector-python packages +# which require urllib3<2 for now. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/32222 +urllib3<2.0.0 + +# Date: 2024-04-24 +# xmlsec==1.3.14 breaking tests or all builds, can be removed once a fix is available +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35264 +xmlsec<1.3.14 From f1a9286f731f20fde47ca3bdd797b3c615831536 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Wed, 9 Oct 2024 09:45:05 -0400 Subject: [PATCH 05/32] chore: changing codeowners for several components (#35574) making sure the codeowners for some maintainership is accurate. --- .github/CODEOWNERS | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a05b78e883..fc452f7acd 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -15,6 +15,7 @@ lms/djangoapps/grades/ lms/djangoapps/instructor/ lms/djangoapps/instructor_task/ lms/djangoapps/mobile_api/ +openedx/core/djangoapps/commerce/ @openedx/2u-infinity openedx/core/djangoapps/credentials @openedx/2U-aperture openedx/core/djangoapps/credit @openedx/2U-aperture openedx/core/djangoapps/enrollments/ @openedx/2U-aperture @@ -22,6 +23,7 @@ openedx/core/djangoapps/heartbeat/ openedx/core/djangoapps/oauth_dispatch openedx/core/djangoapps/user_api/ @openedx/2U-aperture openedx/core/djangoapps/user_authn/ @openedx/2U-vanguards +openedx/core/djangoapps/verified_track_content/ @openedx/2u-infinity openedx/features/course_experience/ xmodule/ @@ -36,16 +38,18 @@ common/djangoapps/track/ lms/djangoapps/certificates/ @openedx/2U-aperture # Discovery -common/djangoapps/course_modes/ +common/djangoapps/course_modes/ @openedx/2U-aperture common/djangoapps/enrollment/ -lms/djangoapps/branding/ @openedx/2U-aperture -lms/djangoapps/commerce/ -lms/djangoapps/experiments/ @openedx/2U-aperture -lms/djangoapps/learner_dashboard/ @openedx/2U-aperture -lms/djangoapps/learner_home/ @openedx/2U-aperture -openedx/features/content_type_gating/ +common/djangoapps/entitlements/ @openedx/2U-aperture +lms/djangoapps/branding/ @openedx/2U-aperture +lms/djangoapps/commerce/ @openedx/2u-infinity +lms/djangoapps/experiments/ @openedx/2u-infinity +lms/djangoapps/gating/ @openedx/2u-infinity +lms/djangoapps/learner_dashboard/ @openedx/2U-aperture +lms/djangoapps/learner_home/ @openedx/2U-aperture +openedx/features/content_type_gating/ @openedx/2u-infinity openedx/features/course_duration_limits/ -openedx/features/discounts/ +openedx/features/discounts/ @openedx/2u-infinity # Ping Axim On-call if someone uses the QuickStart # https://docs.openedx.org/en/latest/developers/quickstarts/first_openedx_pr.html From 243b1b4e2e6e065b685f678556164d5dcd47eb67 Mon Sep 17 00:00:00 2001 From: Alison Langston <46360176+alangsto@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:16:02 -0400 Subject: [PATCH 06/32] feat: update management command to manually create verified names (#35619) * feat: update management command to manually create verified names * fix: update function name --- .../commands/approve_id_verifications.py | 34 +++++++++++ .../tests/test_approve_id_verifications.py | 59 +++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/lms/djangoapps/verify_student/management/commands/approve_id_verifications.py b/lms/djangoapps/verify_student/management/commands/approve_id_verifications.py index 3a08ede0aa..4c45f415cf 100644 --- a/lms/djangoapps/verify_student/management/commands/approve_id_verifications.py +++ b/lms/djangoapps/verify_student/management/commands/approve_id_verifications.py @@ -10,9 +10,11 @@ from pprint import pformat from django.core.management.base import BaseCommand, CommandError +from common.djangoapps.student.models_api import get_name, get_pending_name_change from lms.djangoapps.verify_student.api import send_approval_email from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification from lms.djangoapps.verify_student.utils import earliest_allowed_verification_date +from openedx.features.name_affirmation_api.utils import get_name_affirmation_service log = logging.getLogger(__name__) @@ -149,5 +151,37 @@ class Command(BaseCommand): for verification in existing_id_verifications: verification.approve(service='idv_verifications command') send_approval_email(verification) + self._approve_verified_name_for_software_secure_verification(verification) return list(failed_user_ids) + + def _approve_verified_name_for_software_secure_verification(self, verification): + """ + This method manually creates a verified name given a SoftwareSecurePhotoVerification object. + """ + + name_affirmation_service = get_name_affirmation_service() + + if name_affirmation_service: + from edx_name_affirmation.exceptions import VerifiedNameDoesNotExist # pylint: disable=import-error + + pending_name_change = get_pending_name_change(verification.user) + if pending_name_change: + full_name = pending_name_change.new_name + else: + full_name = get_name(verification.user.id) + + try: + name_affirmation_service.update_verified_name_status( + verification.user, + 'approved', + verification_attempt_id=verification.id + ) + except VerifiedNameDoesNotExist: + name_affirmation_service.create_verified_name( + verification.user, + verification.name, + full_name, + verification_attempt_id=verification.id, + status='approved', + ) diff --git a/lms/djangoapps/verify_student/management/commands/tests/test_approve_id_verifications.py b/lms/djangoapps/verify_student/management/commands/tests/test_approve_id_verifications.py index e6e580c1d1..6eccee1947 100644 --- a/lms/djangoapps/verify_student/management/commands/tests/test_approve_id_verifications.py +++ b/lms/djangoapps/verify_student/management/commands/tests/test_approve_id_verifications.py @@ -6,6 +6,8 @@ import ddt import logging import os import tempfile +from unittest import skipUnless +from unittest.mock import MagicMock, patch import pytest from django.core import mail @@ -15,9 +17,12 @@ from testfixtures import LogCapture from common.djangoapps.student.tests.factories import UserFactory, UserProfileFactory from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification +from openedx.features.name_affirmation_api.utils import get_name_affirmation_service LOGGER_NAME = 'lms.djangoapps.verify_student.management.commands.approve_id_verifications' +name_affirmation_service = get_name_affirmation_service() + @ddt.ddt class TestApproveIDVerificationsCommand(TestCase): @@ -158,3 +163,57 @@ class TestApproveIDVerificationsCommand(TestCase): """ with pytest.raises(CommandError): call_command('approve_id_verifications', 'invalid/user_id/file/path') + + @skipUnless(name_affirmation_service is not None, 'Requires Name Affirmation') + @patch('lms.djangoapps.verify_student.management.commands.approve_id_verifications.get_name_affirmation_service') + def test_create_verified_names(self, mock_get_service): + mock_service = MagicMock() + mock_get_service.return_value = mock_service + + verification = SoftwareSecurePhotoVerification.objects.create( + user=self.user1_profile.user, + name=self.user1_profile.name, + status='submitted', + ) + + call_command('approve_id_verifications', self.tmp_file_path) + mock_service.update_verified_name_status.assert_called_with( + self.user1_profile.user, + 'approved', + verification_attempt_id=verification.id, + ) + + @skipUnless(name_affirmation_service is not None, 'Requires Name Affirmation') + @patch('lms.djangoapps.verify_student.management.commands.approve_id_verifications.get_name') + @patch('lms.djangoapps.verify_student.management.commands.approve_id_verifications.get_pending_name_change') + @patch('lms.djangoapps.verify_student.management.commands.approve_id_verifications.get_name_affirmation_service') + @ddt.data( + '', + MagicMock(new_name='test') + ) + def test_create_update_verified_names(self, pending_name, mock_get_service, mock_get_pending, mock_get_name): + from edx_name_affirmation.exceptions import VerifiedNameDoesNotExist # pylint: disable=import-error + + mock_service = MagicMock() + mock_get_service.return_value = mock_service + mock_service.update_verified_name_status.side_effect = VerifiedNameDoesNotExist() + + mock_get_pending.return_value = pending_name + mock_get_name.return_value = self.user1_profile.name + + verification = SoftwareSecurePhotoVerification.objects.create( + user=self.user1_profile.user, + name=self.user1_profile.name, + status='submitted', + ) + + expected_name = 'test' if pending_name else self.user1_profile.name + + call_command('approve_id_verifications', self.tmp_file_path) + mock_service.create_verified_name.assert_called_with( + verification.user, + verification.name, + expected_name, + verification_attempt_id=verification.id, + status='approved', + ) From a245dec4f4ff431b336832174f53421a5a1b987c Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Thu, 10 Oct 2024 12:32:14 -0400 Subject: [PATCH 07/32] feat: Use jammy repositories for mongo installation. Unclear if there was a change in the focal repositories or if there was an issue with something else. The noble repositories don't support 7.0, so we're stuck here until we upgrade to 8.0. --- .github/workflows/unit-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 5fef1c8352..900489256a 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -94,7 +94,7 @@ jobs: run: | if [[ "${{ matrix.mongo-version }}" != "4.4" ]]; then wget -qO - https://www.mongodb.org/static/pgp/server-${{ matrix.mongo-version }}.asc | sudo apt-key add - - echo "deb https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/${{ matrix.mongo-version }} multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-${{ matrix.mongo-version }}.list + echo "deb https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/${{ matrix.mongo-version }} multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-${{ matrix.mongo-version }}.list sudo apt-get update && sudo apt-get install -y mongodb-org="${{ matrix.mongo-version }}.*" fi From 6c045c7b390aa051484cee459a767b246f04e7d8 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Thu, 10 Oct 2024 14:07:17 -0400 Subject: [PATCH 08/32] feat: Unpin xmlsec and lxml. We are now on Python 3.11 and running tests on the latest version of Ubuntu, which seems to mean we don't need these pins anymore. In fact, it seems to break while on these pins. --- requirements/constraints.txt | 19 --- requirements/edx-sandbox/base.txt | 5 +- requirements/edx/base.txt | 74 ++++++------ requirements/edx/coverage.txt | 4 +- requirements/edx/development.txt | 110 ++++++++++-------- requirements/edx/doc.txt | 77 ++++++------ requirements/edx/paver.txt | 6 +- requirements/edx/semgrep.txt | 8 +- requirements/edx/testing.txt | 96 ++++++++------- requirements/pip-tools.txt | 4 +- .../structures_pruning/requirements/base.txt | 2 +- .../requirements/testing.txt | 2 +- scripts/user_retirement/requirements/base.txt | 23 ++-- .../user_retirement/requirements/testing.txt | 23 ++-- 14 files changed, 224 insertions(+), 229 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index dd727a4b18..2fc1a1e745 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -84,13 +84,6 @@ django-storages<1.14.4 # for them. edx-enterprise==4.27.2 -# Date: 2024-05-09 -# This has to be constrained as well because newer versions of edx-i18n-tools need the -# newer version of lxml but that requirement was not made expilict in the 1.6.0 version -# of the package. This can be un-pinned when we're upgrading lxml. -# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35274 -edx-i18n-tools<1.6.0 - # Date: 2024-07-26 # To override the constraint of edx-lint # This can be removed once https://github.com/openedx/edx-platform/issues/34586 is resolved @@ -105,13 +98,6 @@ event-tracking==3.0.0 # https://github.com/openedx/edx-platform/issues/31616 libsass==0.10.0 -# Date: 2024-04-30 -# lxml>=5.0 introduced breaking changes related to system dependencies -# lxml==5.2.1 introduced new extra so we'll nee to rename lxml --> lxml[html-clean] -# This constraint can be removed once we upgrade to Python 3.11 -# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35272 -lxml<5.0 - # Date: 2018-12-14 # markdown>=3.4.0 has failures due to internal refactorings which causes the tests to fail # pinning the version untill the issue gets resolved in the package itself @@ -187,8 +173,3 @@ social-auth-app-django<=5.4.1 # which require urllib3<2 for now. # Issue for unpinning: https://github.com/openedx/edx-platform/issues/32222 urllib3<2.0.0 - -# Date: 2024-04-24 -# xmlsec==1.3.14 breaking tests or all builds, can be removed once a fix is available -# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35264 -xmlsec<1.3.14 diff --git a/requirements/edx-sandbox/base.txt b/requirements/edx-sandbox/base.txt index bf0a4376da..0a708b2bbf 100644 --- a/requirements/edx-sandbox/base.txt +++ b/requirements/edx-sandbox/base.txt @@ -26,12 +26,11 @@ joblib==1.4.2 # via nltk kiwisolver==1.4.7 # via matplotlib -lxml==4.9.4 +lxml==5.3.0 # via - # -c requirements/edx-sandbox/../constraints.txt # -r requirements/edx-sandbox/base.in # openedx-calc -markupsafe==2.1.5 +markupsafe==3.0.1 # via # chem # openedx-calc diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 55793bd0c5..c7f7828f41 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -6,11 +6,11 @@ # -e git+https://github.com/anupdhabarde/edx-proctoring-proctortrack.git@31c6c9923a51c903ae83760ecbbac191363aa2a2#egg=edx_proctoring_proctortrack # via -r requirements/edx/github.in -acid-xblock==0.3.1 +acid-xblock==0.4.1 # via -r requirements/edx/kernel.in -aiohappyeyeballs==2.4.0 +aiohappyeyeballs==2.4.3 # via aiohttp -aiohttp==3.10.6 +aiohttp==3.10.9 # via # geoip2 # openai @@ -70,13 +70,13 @@ bleach[css]==6.1.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/kernel.in -boto3==1.35.27 +boto3==1.35.37 # via # -r requirements/edx/kernel.in # django-ses # fs-s3fs # ora2 -botocore==1.35.27 +botocore==1.35.37 # via # -r requirements/edx/kernel.in # boto3 @@ -87,7 +87,7 @@ cachecontrol==0.14.0 # via firebase-admin cachetools==5.5.0 # via google-auth -camel-converter[pydantic]==3.1.2 +camel-converter[pydantic]==4.0.1 # via meilisearch celery==5.4.0 # via @@ -328,7 +328,7 @@ django-sekizai==4.1.0 # via # -r requirements/edx/kernel.in # openedx-django-wiki -django-ses==4.1.1 +django-ses==4.2.0 # via -r requirements/edx/bundled.in django-simple-history==3.4.0 # via @@ -387,7 +387,7 @@ djangorestframework==3.14.0 # super-csv djangorestframework-xml==2.0.0 # via edx-enterprise -dnspython==2.6.1 +dnspython==2.7.0 # via # -r requirements/edx/paver.txt # pymongo @@ -429,7 +429,7 @@ edx-celeryutils==1.3.0 # super-csv edx-codejail==3.4.1 # via -r requirements/edx/kernel.in -edx-completion==4.7.1 +edx-completion==4.7.2 # via -r requirements/edx/kernel.in edx-django-release-util==1.4.0 # via @@ -438,7 +438,7 @@ edx-django-release-util==1.4.0 # edxval edx-django-sites-extensions==4.2.0 # via -r requirements/edx/kernel.in -edx-django-utils==5.16.0 +edx-django-utils==6.0.0 # via # -r requirements/edx/kernel.in # django-config-models @@ -475,9 +475,8 @@ edx-event-bus-kafka==5.8.1 # via -r requirements/edx/kernel.in edx-event-bus-redis==0.5.0 # via -r requirements/edx/kernel.in -edx-i18n-tools==1.5.0 +edx-i18n-tools==1.6.3 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/bundled.in # ora2 edx-milestones==0.6.0 @@ -517,7 +516,7 @@ edx-search==4.0.0 # via -r requirements/edx/kernel.in edx-sga==0.25.0 # via -r requirements/edx/bundled.in -edx-submissions==3.8.0 +edx-submissions==3.8.1 # via # -r requirements/edx/kernel.in # ora2 @@ -584,14 +583,14 @@ geoip2==4.8.0 # via -r requirements/edx/kernel.in glob2==0.7 # via -r requirements/edx/kernel.in -google-api-core[grpc]==2.20.0 +google-api-core[grpc]==2.21.0 # via # firebase-admin # google-api-python-client # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.147.0 +google-api-python-client==2.149.0 # via firebase-admin google-auth==2.35.0 # via @@ -621,11 +620,11 @@ googleapis-common-protos==1.65.0 # via # google-api-core # grpcio-status -grpcio==1.66.1 +grpcio==1.66.2 # via # google-api-core # grpcio-status -grpcio-status==1.66.1 +grpcio-status==1.66.2 # via google-api-core gunicorn==23.0.0 # via -r requirements/edx/kernel.in @@ -639,7 +638,7 @@ httplib2==0.22.0 # via # google-api-python-client # google-auth-httplib2 -icalendar==5.0.13 +icalendar==6.0.0 # via -r requirements/edx/kernel.in idna==3.10 # via @@ -658,7 +657,7 @@ interchange==2021.0.4 # via py2neo ipaddress==1.0.23 # via -r requirements/edx/kernel.in -isodate==0.6.1 +isodate==0.7.2 # via python3-saml jinja2==3.1.4 # via code-annotations @@ -683,7 +682,7 @@ jsonschema==4.23.0 # via # drf-spectacular # optimizely-sdk -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 # via jsonschema jwcrypto==1.5.6 # via @@ -708,19 +707,21 @@ loremipsum==1.0.5 # via ora2 lti-consumer-xblock==9.11.3 # via -r requirements/edx/kernel.in -lxml==4.9.4 +lxml[html-clean]==5.3.0 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in # edx-i18n-tools # edxval # lti-consumer-xblock + # lxml-html-clean # olxcleaner # openedx-calc # ora2 # python3-saml # xblock # xmlsec +lxml-html-clean==0.3.1 + # via lxml mailsnake==1.6.4 # via -r requirements/edx/bundled.in mako==1.3.5 @@ -737,7 +738,7 @@ markdown==3.3.7 # openedx-django-wiki # staff-graded-xblock # xblock-poll -markupsafe==2.1.5 +markupsafe==3.0.1 # via # -r requirements/edx/paver.txt # chem @@ -769,7 +770,7 @@ multidict==6.1.0 # yarl mysqlclient==2.2.4 # via -r requirements/edx/kernel.in -newrelic==9.13.0 +newrelic==10.0.0 # via # -r requirements/edx/bundled.in # edx-django-utils @@ -820,7 +821,7 @@ openedx-events==9.14.1 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.10.0 +openedx-filters==1.11.0 # via # -r requirements/edx/kernel.in # lti-consumer-xblock @@ -829,7 +830,7 @@ openedx-learning==0.13.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in -openedx-mongodbproxy==0.2.1 +openedx-mongodbproxy==0.2.2 # via -r requirements/edx/kernel.in optimizely-sdk==4.1.1 # via @@ -881,6 +882,8 @@ polib==1.2.0 # via edx-i18n-tools prompt-toolkit==3.0.48 # via click-repl +propcache==0.2.0 + # via yarl proto-plus==1.24.0 # via # google-api-core @@ -911,7 +914,7 @@ pycountry==24.6.1 # via -r requirements/edx/kernel.in pycparser==2.22 # via cffi -pycryptodomex==3.20.0 +pycryptodomex==3.21.0 # via # -r requirements/edx/kernel.in # edx-proctoring @@ -1017,7 +1020,6 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs - # icalendar # interchange # olxcleaner # ora2 @@ -1039,7 +1041,7 @@ random2==1.0.2 # via -r requirements/edx/kernel.in recommender-xblock==2.2.1 # via -r requirements/edx/bundled.in -redis==5.0.8 +redis==5.1.1 # via # -r requirements/edx/kernel.in # walrus @@ -1092,7 +1094,7 @@ rules==3.5 # edx-enterprise # edx-proctoring # openedx-learning -s3transfer==0.10.2 +s3transfer==0.10.3 # via boto3 sailthru-client==2.2.3 # via edx-ace @@ -1131,7 +1133,6 @@ six==1.16.0 # fs-s3fs # html5lib # interchange - # isodate # libsass # optimizely-sdk # pansi @@ -1208,6 +1209,7 @@ typing-extensions==4.12.2 tzdata==2024.2 # via # celery + # icalendar # kombu unicodecsv==0.14.1 # via @@ -1237,7 +1239,7 @@ voluptuous==0.15.2 # via ora2 walrus==0.9.4 # via edx-event-bus-redis -watchdog==5.0.2 +watchdog==5.0.3 # via -r requirements/edx/paver.txt wcwidth==0.2.13 # via prompt-toolkit @@ -1285,13 +1287,11 @@ xblock-utils==4.0.0 # via # edx-sga # xblock-poll -xmlsec==1.3.13 - # via - # -c requirements/edx/../constraints.txt - # python3-saml +xmlsec==1.3.14 + # via python3-saml xss-utils==0.6.0 # via -r requirements/edx/kernel.in -yarl==1.12.1 +yarl==1.14.0 # via aiohttp zipp==3.20.2 # via importlib-metadata diff --git a/requirements/edx/coverage.txt b/requirements/edx/coverage.txt index a1faf5e740..45f2429cb2 100644 --- a/requirements/edx/coverage.txt +++ b/requirements/edx/coverage.txt @@ -6,13 +6,13 @@ # chardet==5.2.0 # via diff-cover -coverage==7.6.1 +coverage==7.6.2 # via -r requirements/edx/coverage.in diff-cover==9.2.0 # via -r requirements/edx/coverage.in jinja2==3.1.4 # via diff-cover -markupsafe==2.1.5 +markupsafe==3.0.1 # via jinja2 pluggy==1.5.0 # via diff-cover diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 1bdd373651..13f3f6d5e6 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -12,16 +12,16 @@ accessible-pygments==0.0.5 # via # -r requirements/edx/doc.txt # pydata-sphinx-theme -acid-xblock==0.3.1 +acid-xblock==0.4.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -aiohappyeyeballs==2.4.0 +aiohappyeyeballs==2.4.3 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp -aiohttp==3.10.6 +aiohttp==3.10.9 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -140,14 +140,14 @@ boto==2.49.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -boto3==1.35.27 +boto3==1.35.37 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.27 +botocore==1.35.37 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -157,7 +157,7 @@ bridgekeeper==0.9 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -build==1.2.2 +build==1.2.2.post1 # via # -r requirements/edx/../pip-tools.txt # pip-tools @@ -172,7 +172,7 @@ cachetools==5.5.0 # -r requirements/edx/testing.txt # google-auth # tox -camel-converter[pydantic]==3.1.2 +camel-converter[pydantic]==4.0.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -278,7 +278,7 @@ colorama==0.4.6 # via # -r requirements/edx/testing.txt # tox -coverage[toml]==7.6.1 +coverage[toml]==7.6.2 # via # -r requirements/edx/testing.txt # pytest-cov @@ -325,11 +325,11 @@ defusedxml==0.7.1 # social-auth-core diff-cover==9.2.0 # via -r requirements/edx/testing.txt -dill==0.3.8 +dill==0.3.9 # via # -r requirements/edx/testing.txt # pylint -distlib==0.3.8 +distlib==0.3.9 # via # -r requirements/edx/testing.txt # virtualenv @@ -544,7 +544,7 @@ django-sekizai==4.1.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki -django-ses==4.1.1 +django-ses==4.2.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -627,7 +627,7 @@ djangorestframework-xml==2.0.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise -dnspython==2.6.1 +dnspython==2.7.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -696,7 +696,7 @@ edx-codejail==3.4.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-completion==4.7.1 +edx-completion==4.7.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -710,7 +710,7 @@ edx-django-sites-extensions==4.2.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-django-utils==5.16.0 +edx-django-utils==6.0.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -754,9 +754,8 @@ edx-event-bus-redis==0.5.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-i18n-tools==1.5.0 +edx-i18n-tools==1.6.3 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 @@ -814,7 +813,7 @@ edx-sga==0.25.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-submissions==3.8.0 +edx-submissions==3.8.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -879,7 +878,7 @@ execnet==2.1.1 # pytest-xdist factory-boy==3.3.1 # via -r requirements/edx/testing.txt -faker==30.0.0 +faker==30.3.0 # via # -r requirements/edx/testing.txt # factory-boy @@ -943,7 +942,7 @@ glob2==0.7 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -google-api-core[grpc]==2.20.0 +google-api-core[grpc]==2.21.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -952,7 +951,7 @@ google-api-core[grpc]==2.20.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.147.0 +google-api-python-client==2.149.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1005,17 +1004,17 @@ googleapis-common-protos==1.65.0 # -r requirements/edx/testing.txt # google-api-core # grpcio-status -grimp==3.4.1 +grimp==3.5 # via # -r requirements/edx/testing.txt # import-linter -grpcio==1.66.1 +grpcio==1.66.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # google-api-core # grpcio-status -grpcio-status==1.66.1 +grpcio-status==1.66.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1045,7 +1044,7 @@ httplib2==0.22.0 # google-auth-httplib2 httpretty==1.1.4 # via -r requirements/edx/testing.txt -icalendar==5.0.13 +icalendar==6.0.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1062,7 +1061,7 @@ imagesize==1.4.1 # via # -r requirements/edx/doc.txt # sphinx -import-linter==2.0 +import-linter==2.1 # via -r requirements/edx/testing.txt importlib-metadata==8.5.0 # via @@ -1087,7 +1086,7 @@ ipaddress==1.0.23 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -isodate==0.6.1 +isodate==0.7.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1136,7 +1135,7 @@ jsonschema==4.23.0 # drf-spectacular # optimizely-sdk # sphinxcontrib-openapi -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1183,14 +1182,14 @@ lti-consumer-xblock==9.11.3 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -lxml==4.9.4 +lxml[html-clean]==5.3.0 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-i18n-tools # edxval # lti-consumer-xblock + # lxml-html-clean # olxcleaner # openedx-calc # ora2 @@ -1198,6 +1197,11 @@ lxml==4.9.4 # python3-saml # xblock # xmlsec +lxml-html-clean==0.3.1 + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt + # lxml mailsnake==1.6.4 # via # -r requirements/edx/doc.txt @@ -1218,7 +1222,7 @@ markdown==3.3.7 # openedx-django-wiki # staff-graded-xblock # xblock-poll -markupsafe==2.1.5 +markupsafe==3.0.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1290,7 +1294,7 @@ mysqlclient==2.2.4 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -newrelic==9.13.0 +newrelic==10.0.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1368,7 +1372,7 @@ openedx-events==9.14.1 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.10.0 +openedx-filters==1.11.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1379,7 +1383,7 @@ openedx-learning==0.13.1 # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -openedx-mongodbproxy==0.2.1 +openedx-mongodbproxy==0.2.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1407,7 +1411,7 @@ packaging==24.1 # snowflake-connector-python # sphinx # tox -pact-python==2.2.1 +pact-python==2.2.2 # via -r requirements/edx/testing.txt pansi==2020.7.3 # via @@ -1488,6 +1492,11 @@ prompt-toolkit==3.0.48 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # click-repl +propcache==0.2.0 + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt + # yarl proto-plus==1.24.0 # via # -r requirements/edx/doc.txt @@ -1542,7 +1551,7 @@ pycparser==2.22 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # cffi -pycryptodomex==3.20.0 +pycryptodomex==3.21.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1666,7 +1675,7 @@ pyproject-api==1.8.0 # via # -r requirements/edx/testing.txt # tox -pyproject-hooks==1.1.0 +pyproject-hooks==1.2.0 # via # -r requirements/edx/../pip-tools.txt # build @@ -1767,7 +1776,6 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs - # icalendar # interchange # olxcleaner # ora2 @@ -1799,7 +1807,7 @@ recommender-xblock==2.2.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -redis==5.0.8 +redis==5.1.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1869,7 +1877,7 @@ rules==3.5 # edx-enterprise # edx-proctoring # openedx-learning -s3transfer==0.10.2 +s3transfer==0.10.3 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1926,7 +1934,6 @@ six==1.16.0 # fs-s3fs # html5lib # interchange - # isodate # libsass # optimizely-sdk # pact-python @@ -1986,7 +1993,7 @@ soupsieve==2.6 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # beautifulsoup4 -sphinx==8.0.2 +sphinx==8.1.0 # via # -r requirements/edx/doc.txt # pydata-sphinx-theme @@ -2087,7 +2094,7 @@ tinycss2==1.2.1 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # bleach -tomli==2.0.1 +tomli==2.0.2 # via django-stubs tomlkit==0.13.2 # via @@ -2095,7 +2102,7 @@ tomlkit==0.13.2 # -r requirements/edx/testing.txt # pylint # snowflake-connector-python -tox==4.20.0 +tox==4.21.2 # via -r requirements/edx/testing.txt tqdm==4.66.5 # via @@ -2103,7 +2110,7 @@ tqdm==4.66.5 # -r requirements/edx/testing.txt # nltk # openai -types-pytz==2024.2.0.20240913 +types-pytz==2024.2.0.20241003 # via django-stubs types-pyyaml==6.0.12.20240917 # via @@ -2122,6 +2129,7 @@ typing-extensions==4.12.2 # django-stubs-ext # djangorestframework-stubs # edx-opaque-keys + # faker # fastapi # grimp # import-linter @@ -2137,6 +2145,7 @@ tzdata==2024.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery + # icalendar # kombu unicodecsv==0.14.1 # via @@ -2165,7 +2174,7 @@ user-util==1.1.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -uvicorn==0.30.6 +uvicorn==0.31.1 # via # -r requirements/edx/testing.txt # pact-python @@ -2176,7 +2185,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.26.5 +virtualenv==20.26.6 # via # -r requirements/edx/testing.txt # tox @@ -2185,14 +2194,14 @@ voluptuous==0.15.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 -vulture==2.12 +vulture==2.13 # via -r requirements/edx/development.in walrus==0.9.4 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-event-bus-redis -watchdog==5.0.2 +watchdog==5.0.3 # via # -r requirements/edx/development.in # -r requirements/edx/doc.txt @@ -2266,9 +2275,8 @@ xblock-utils==4.0.0 # -r requirements/edx/testing.txt # edx-sga # xblock-poll -xmlsec==1.3.13 +xmlsec==1.3.14 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # python3-saml @@ -2276,7 +2284,7 @@ xss-utils==0.6.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -yarl==1.12.1 +yarl==1.14.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 6f12d80467..30736a21a3 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -8,13 +8,13 @@ # via -r requirements/edx/base.txt accessible-pygments==0.0.5 # via pydata-sphinx-theme -acid-xblock==0.3.1 +acid-xblock==0.4.1 # via -r requirements/edx/base.txt -aiohappyeyeballs==2.4.0 +aiohappyeyeballs==2.4.3 # via # -r requirements/edx/base.txt # aiohttp -aiohttp==3.10.6 +aiohttp==3.10.9 # via # -r requirements/edx/base.txt # geoip2 @@ -102,13 +102,13 @@ bleach[css]==6.1.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -boto3==1.35.27 +boto3==1.35.37 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.27 +botocore==1.35.37 # via # -r requirements/edx/base.txt # boto3 @@ -123,7 +123,7 @@ cachetools==5.5.0 # via # -r requirements/edx/base.txt # google-auth -camel-converter[pydantic]==3.1.2 +camel-converter[pydantic]==4.0.1 # via # -r requirements/edx/base.txt # meilisearch @@ -398,7 +398,7 @@ django-sekizai==4.1.0 # via # -r requirements/edx/base.txt # openedx-django-wiki -django-ses==4.1.1 +django-ses==4.2.0 # via -r requirements/edx/base.txt django-simple-history==3.4.0 # via @@ -459,7 +459,7 @@ djangorestframework-xml==2.0.0 # via # -r requirements/edx/base.txt # edx-enterprise -dnspython==2.6.1 +dnspython==2.7.0 # via # -r requirements/edx/base.txt # pymongo @@ -509,7 +509,7 @@ edx-celeryutils==1.3.0 # super-csv edx-codejail==3.4.1 # via -r requirements/edx/base.txt -edx-completion==4.7.1 +edx-completion==4.7.2 # via -r requirements/edx/base.txt edx-django-release-util==1.4.0 # via @@ -518,7 +518,7 @@ edx-django-release-util==1.4.0 # edxval edx-django-sites-extensions==4.2.0 # via -r requirements/edx/base.txt -edx-django-utils==5.16.0 +edx-django-utils==6.0.0 # via # -r requirements/edx/base.txt # django-config-models @@ -555,9 +555,8 @@ edx-event-bus-kafka==5.8.1 # via -r requirements/edx/base.txt edx-event-bus-redis==0.5.0 # via -r requirements/edx/base.txt -edx-i18n-tools==1.5.0 +edx-i18n-tools==1.6.3 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # ora2 edx-milestones==0.6.0 @@ -598,7 +597,7 @@ edx-search==4.0.0 # via -r requirements/edx/base.txt edx-sga==0.25.0 # via -r requirements/edx/base.txt -edx-submissions==3.8.0 +edx-submissions==3.8.1 # via # -r requirements/edx/base.txt # ora2 @@ -683,7 +682,7 @@ gitpython==3.1.43 # via -r requirements/edx/doc.in glob2==0.7 # via -r requirements/edx/base.txt -google-api-core[grpc]==2.20.0 +google-api-core[grpc]==2.21.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -691,7 +690,7 @@ google-api-core[grpc]==2.20.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.147.0 +google-api-python-client==2.149.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -735,12 +734,12 @@ googleapis-common-protos==1.65.0 # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio==1.66.1 +grpcio==1.66.2 # via # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio-status==1.66.1 +grpcio-status==1.66.2 # via # -r requirements/edx/base.txt # google-api-core @@ -757,7 +756,7 @@ httplib2==0.22.0 # -r requirements/edx/base.txt # google-api-python-client # google-auth-httplib2 -icalendar==5.0.13 +icalendar==6.0.0 # via -r requirements/edx/base.txt idna==3.10 # via @@ -781,7 +780,7 @@ interchange==2021.0.4 # py2neo ipaddress==1.0.23 # via -r requirements/edx/base.txt -isodate==0.6.1 +isodate==0.7.2 # via # -r requirements/edx/base.txt # python3-saml @@ -818,7 +817,7 @@ jsonschema==4.23.0 # drf-spectacular # optimizely-sdk # sphinxcontrib-openapi -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 # via # -r requirements/edx/base.txt # jsonschema @@ -850,19 +849,23 @@ loremipsum==1.0.5 # ora2 lti-consumer-xblock==9.11.3 # via -r requirements/edx/base.txt -lxml==4.9.4 +lxml[html-clean]==5.3.0 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # edx-i18n-tools # edxval # lti-consumer-xblock + # lxml-html-clean # olxcleaner # openedx-calc # ora2 # python3-saml # xblock # xmlsec +lxml-html-clean==0.3.1 + # via + # -r requirements/edx/base.txt + # lxml mailsnake==1.6.4 # via -r requirements/edx/base.txt mako==1.3.5 @@ -879,7 +882,7 @@ markdown==3.3.7 # openedx-django-wiki # staff-graded-xblock # xblock-poll -markupsafe==2.1.5 +markupsafe==3.0.1 # via # -r requirements/edx/base.txt # chem @@ -923,7 +926,7 @@ multidict==6.1.0 # yarl mysqlclient==2.2.4 # via -r requirements/edx/base.txt -newrelic==9.13.0 +newrelic==10.0.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -979,7 +982,7 @@ openedx-events==9.14.1 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.10.0 +openedx-filters==1.11.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock @@ -988,7 +991,7 @@ openedx-learning==0.13.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt -openedx-mongodbproxy==0.2.1 +openedx-mongodbproxy==0.2.2 # via -r requirements/edx/base.txt optimizely-sdk==4.1.1 # via @@ -1057,6 +1060,10 @@ prompt-toolkit==3.0.48 # via # -r requirements/edx/base.txt # click-repl +propcache==0.2.0 + # via + # -r requirements/edx/base.txt + # yarl proto-plus==1.24.0 # via # -r requirements/edx/base.txt @@ -1094,7 +1101,7 @@ pycparser==2.22 # via # -r requirements/edx/base.txt # cffi -pycryptodomex==3.20.0 +pycryptodomex==3.21.0 # via # -r requirements/edx/base.txt # edx-proctoring @@ -1222,7 +1229,6 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs - # icalendar # interchange # olxcleaner # ora2 @@ -1245,7 +1251,7 @@ random2==1.0.2 # via -r requirements/edx/base.txt recommender-xblock==2.2.1 # via -r requirements/edx/base.txt -redis==5.0.8 +redis==5.1.1 # via # -r requirements/edx/base.txt # walrus @@ -1305,7 +1311,7 @@ rules==3.5 # edx-enterprise # edx-proctoring # openedx-learning -s3transfer==0.10.2 +s3transfer==0.10.3 # via # -r requirements/edx/base.txt # boto3 @@ -1350,7 +1356,6 @@ six==1.16.0 # fs-s3fs # html5lib # interchange - # isodate # libsass # optimizely-sdk # pansi @@ -1394,7 +1399,7 @@ soupsieve==2.6 # via # -r requirements/edx/base.txt # beautifulsoup4 -sphinx==8.0.2 +sphinx==8.1.0 # via # -r requirements/edx/doc.in # pydata-sphinx-theme @@ -1489,6 +1494,7 @@ tzdata==2024.2 # via # -r requirements/edx/base.txt # celery + # icalendar # kombu unicodecsv==0.14.1 # via @@ -1524,7 +1530,7 @@ walrus==0.9.4 # via # -r requirements/edx/base.txt # edx-event-bus-redis -watchdog==5.0.2 +watchdog==5.0.3 # via -r requirements/edx/base.txt wcwidth==0.2.13 # via @@ -1576,14 +1582,13 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xmlsec==1.3.13 +xmlsec==1.3.14 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # python3-saml xss-utils==0.6.0 # via -r requirements/edx/base.txt -yarl==1.12.1 +yarl==1.14.0 # via # -r requirements/edx/base.txt # aiohttp diff --git a/requirements/edx/paver.txt b/requirements/edx/paver.txt index a0b1896919..2d8f510e03 100644 --- a/requirements/edx/paver.txt +++ b/requirements/edx/paver.txt @@ -10,7 +10,7 @@ charset-normalizer==2.0.12 # via # -c requirements/edx/../constraints.txt # requests -dnspython==2.6.1 +dnspython==2.7.0 # via pymongo edx-opaque-keys==2.11.0 # via -r requirements/edx/paver.in @@ -22,7 +22,7 @@ libsass==0.10.0 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/paver.in -markupsafe==2.1.5 +markupsafe==3.0.1 # via -r requirements/edx/paver.in mock==5.1.0 # via -r requirements/edx/paver.in @@ -61,7 +61,7 @@ urllib3==1.26.20 # via # -c requirements/edx/../constraints.txt # requests -watchdog==5.0.2 +watchdog==5.0.3 # via -r requirements/edx/paver.in wrapt==1.16.0 # via -r requirements/edx/paver.in diff --git a/requirements/edx/semgrep.txt b/requirements/edx/semgrep.txt index 102289def2..174fa87d08 100644 --- a/requirements/edx/semgrep.txt +++ b/requirements/edx/semgrep.txt @@ -15,7 +15,7 @@ boltons==21.0.0 # face # glom # semgrep -bracex==2.5 +bracex==2.5.post1 # via wcmatch certifi==2024.8.30 # via requests @@ -42,7 +42,7 @@ idna==3.10 # via requests jsonschema==4.23.0 # via semgrep -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 # via jsonschema markdown-it-py==3.0.0 # via rich @@ -60,7 +60,7 @@ referencing==0.35.1 # jsonschema-specifications requests==2.32.3 # via semgrep -rich==13.8.1 +rich==13.9.2 # via semgrep rpds-py==0.20.0 # via @@ -72,7 +72,7 @@ ruamel-yaml-clib==0.2.8 # via ruamel-yaml semgrep==1.52.0 # via -r requirements/edx/semgrep.in -tomli==2.0.1 +tomli==2.0.2 # via semgrep typing-extensions==4.12.2 # via semgrep diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index d3b14a6f43..473da12534 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -6,13 +6,13 @@ # -e git+https://github.com/anupdhabarde/edx-proctoring-proctortrack.git@31c6c9923a51c903ae83760ecbbac191363aa2a2#egg=edx_proctoring_proctortrack # via -r requirements/edx/base.txt -acid-xblock==0.3.1 +acid-xblock==0.4.1 # via -r requirements/edx/base.txt -aiohappyeyeballs==2.4.0 +aiohappyeyeballs==2.4.3 # via # -r requirements/edx/base.txt # aiohttp -aiohttp==3.10.6 +aiohttp==3.10.9 # via # -r requirements/edx/base.txt # geoip2 @@ -102,13 +102,13 @@ bleach[css]==6.1.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -boto3==1.35.27 +boto3==1.35.37 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.27 +botocore==1.35.37 # via # -r requirements/edx/base.txt # boto3 @@ -124,7 +124,7 @@ cachetools==5.5.0 # -r requirements/edx/base.txt # google-auth # tox -camel-converter[pydantic]==3.1.2 +camel-converter[pydantic]==4.0.1 # via # -r requirements/edx/base.txt # meilisearch @@ -209,7 +209,7 @@ codejail-includes==1.0.0 # via -r requirements/edx/base.txt colorama==0.4.6 # via tox -coverage[toml]==7.6.1 +coverage[toml]==7.6.2 # via # -r requirements/edx/coverage.txt # pytest-cov @@ -247,9 +247,9 @@ defusedxml==0.7.1 # social-auth-core diff-cover==9.2.0 # via -r requirements/edx/coverage.txt -dill==0.3.8 +dill==0.3.9 # via pylint -distlib==0.3.8 +distlib==0.3.9 # via virtualenv django==4.2.16 # via @@ -427,7 +427,7 @@ django-sekizai==4.1.0 # via # -r requirements/edx/base.txt # openedx-django-wiki -django-ses==4.1.1 +django-ses==4.2.0 # via -r requirements/edx/base.txt django-simple-history==3.4.0 # via @@ -488,7 +488,7 @@ djangorestframework-xml==2.0.0 # via # -r requirements/edx/base.txt # edx-enterprise -dnspython==2.6.1 +dnspython==2.7.0 # via # -r requirements/edx/base.txt # pymongo @@ -533,7 +533,7 @@ edx-celeryutils==1.3.0 # super-csv edx-codejail==3.4.1 # via -r requirements/edx/base.txt -edx-completion==4.7.1 +edx-completion==4.7.2 # via -r requirements/edx/base.txt edx-django-release-util==1.4.0 # via @@ -542,7 +542,7 @@ edx-django-release-util==1.4.0 # edxval edx-django-sites-extensions==4.2.0 # via -r requirements/edx/base.txt -edx-django-utils==5.16.0 +edx-django-utils==6.0.0 # via # -r requirements/edx/base.txt # django-config-models @@ -579,9 +579,8 @@ edx-event-bus-kafka==5.8.1 # via -r requirements/edx/base.txt edx-event-bus-redis==0.5.0 # via -r requirements/edx/base.txt -edx-i18n-tools==1.5.0 +edx-i18n-tools==1.6.3 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # ora2 edx-lint==5.4.0 @@ -624,7 +623,7 @@ edx-search==4.0.0 # via -r requirements/edx/base.txt edx-sga==0.25.0 # via -r requirements/edx/base.txt -edx-submissions==3.8.0 +edx-submissions==3.8.1 # via # -r requirements/edx/base.txt # ora2 @@ -674,7 +673,7 @@ execnet==2.1.1 # via pytest-xdist factory-boy==3.3.1 # via -r requirements/edx/testing.in -faker==30.0.0 +faker==30.3.0 # via factory-boy fastapi==0.115.0 # via pact-python @@ -717,7 +716,7 @@ geoip2==4.8.0 # via -r requirements/edx/base.txt glob2==0.7 # via -r requirements/edx/base.txt -google-api-core[grpc]==2.20.0 +google-api-core[grpc]==2.21.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -725,7 +724,7 @@ google-api-core[grpc]==2.20.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.147.0 +google-api-python-client==2.149.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -769,14 +768,14 @@ googleapis-common-protos==1.65.0 # -r requirements/edx/base.txt # google-api-core # grpcio-status -grimp==3.4.1 +grimp==3.5 # via import-linter -grpcio==1.66.1 +grpcio==1.66.2 # via # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio-status==1.66.1 +grpcio-status==1.66.2 # via # -r requirements/edx/base.txt # google-api-core @@ -797,7 +796,7 @@ httplib2==0.22.0 # google-auth-httplib2 httpretty==1.1.4 # via -r requirements/edx/testing.in -icalendar==5.0.13 +icalendar==6.0.0 # via -r requirements/edx/base.txt idna==3.10 # via @@ -807,7 +806,7 @@ idna==3.10 # requests # snowflake-connector-python # yarl -import-linter==2.0 +import-linter==2.1 # via -r requirements/edx/testing.in importlib-metadata==8.5.0 # via -r requirements/edx/base.txt @@ -824,7 +823,7 @@ interchange==2021.0.4 # py2neo ipaddress==1.0.23 # via -r requirements/edx/base.txt -isodate==0.6.1 +isodate==0.7.2 # via # -r requirements/edx/base.txt # python3-saml @@ -865,7 +864,7 @@ jsonschema==4.23.0 # -r requirements/edx/base.txt # drf-spectacular # optimizely-sdk -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 # via # -r requirements/edx/base.txt # jsonschema @@ -899,13 +898,13 @@ loremipsum==1.0.5 # ora2 lti-consumer-xblock==9.11.3 # via -r requirements/edx/base.txt -lxml==4.9.4 +lxml[html-clean]==5.3.0 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # edx-i18n-tools # edxval # lti-consumer-xblock + # lxml-html-clean # olxcleaner # openedx-calc # ora2 @@ -913,6 +912,10 @@ lxml==4.9.4 # python3-saml # xblock # xmlsec +lxml-html-clean==0.3.1 + # via + # -r requirements/edx/base.txt + # lxml mailsnake==1.6.4 # via -r requirements/edx/base.txt mako==1.3.5 @@ -929,7 +932,7 @@ markdown==3.3.7 # openedx-django-wiki # staff-graded-xblock # xblock-poll -markupsafe==2.1.5 +markupsafe==3.0.1 # via # -r requirements/edx/base.txt # -r requirements/edx/coverage.txt @@ -974,7 +977,7 @@ multidict==6.1.0 # yarl mysqlclient==2.2.4 # via -r requirements/edx/base.txt -newrelic==9.13.0 +newrelic==10.0.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -1030,7 +1033,7 @@ openedx-events==9.14.1 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.10.0 +openedx-filters==1.11.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock @@ -1039,7 +1042,7 @@ openedx-learning==0.13.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt -openedx-mongodbproxy==0.2.1 +openedx-mongodbproxy==0.2.2 # via -r requirements/edx/base.txt optimizely-sdk==4.1.1 # via @@ -1057,7 +1060,7 @@ packaging==24.1 # pytest # snowflake-connector-python # tox -pact-python==2.2.1 +pact-python==2.2.2 # via -r requirements/edx/testing.in pansi==2020.7.3 # via @@ -1119,6 +1122,10 @@ prompt-toolkit==3.0.48 # via # -r requirements/edx/base.txt # click-repl +propcache==0.2.0 + # via + # -r requirements/edx/base.txt + # yarl proto-plus==1.24.0 # via # -r requirements/edx/base.txt @@ -1164,7 +1171,7 @@ pycparser==2.22 # via # -r requirements/edx/base.txt # cffi -pycryptodomex==3.20.0 +pycryptodomex==3.21.0 # via # -r requirements/edx/base.txt # edx-proctoring @@ -1340,7 +1347,6 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs - # icalendar # interchange # olxcleaner # ora2 @@ -1362,7 +1368,7 @@ random2==1.0.2 # via -r requirements/edx/base.txt recommender-xblock==2.2.1 # via -r requirements/edx/base.txt -redis==5.0.8 +redis==5.1.1 # via # -r requirements/edx/base.txt # walrus @@ -1422,7 +1428,7 @@ rules==3.5 # edx-enterprise # edx-proctoring # openedx-learning -s3transfer==0.10.2 +s3transfer==0.10.3 # via # -r requirements/edx/base.txt # boto3 @@ -1470,7 +1476,6 @@ six==1.16.0 # fs-s3fs # html5lib # interchange - # isodate # libsass # optimizely-sdk # pact-python @@ -1554,7 +1559,7 @@ tomlkit==0.13.2 # -r requirements/edx/base.txt # pylint # snowflake-connector-python -tox==4.20.0 +tox==4.21.2 # via -r requirements/edx/testing.in tqdm==4.66.5 # via @@ -1566,6 +1571,7 @@ typing-extensions==4.12.2 # -r requirements/edx/base.txt # django-countries # edx-opaque-keys + # faker # fastapi # grimp # import-linter @@ -1578,6 +1584,7 @@ tzdata==2024.2 # via # -r requirements/edx/base.txt # celery + # icalendar # kombu unicodecsv==0.14.1 # via @@ -1601,7 +1608,7 @@ urllib3==1.26.20 # requests user-util==1.1.0 # via -r requirements/edx/base.txt -uvicorn==0.30.6 +uvicorn==0.31.1 # via pact-python vine==5.1.0 # via @@ -1609,7 +1616,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.26.5 +virtualenv==20.26.6 # via tox voluptuous==0.15.2 # via @@ -1619,7 +1626,7 @@ walrus==0.9.4 # via # -r requirements/edx/base.txt # edx-event-bus-redis -watchdog==5.0.2 +watchdog==5.0.3 # via -r requirements/edx/base.txt wcwidth==0.2.13 # via @@ -1673,14 +1680,13 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xmlsec==1.3.13 +xmlsec==1.3.14 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # python3-saml xss-utils==0.6.0 # via -r requirements/edx/base.txt -yarl==1.12.1 +yarl==1.14.0 # via # -r requirements/edx/base.txt # aiohttp diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 5bcb2aa550..110663ff6a 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -4,7 +4,7 @@ # # make upgrade # -build==1.2.2 +build==1.2.2.post1 # via pip-tools click==8.1.6 # via @@ -14,7 +14,7 @@ packaging==24.1 # via build pip-tools==7.4.1 # via -r requirements/pip-tools.in -pyproject-hooks==1.1.0 +pyproject-hooks==1.2.0 # via # build # pip-tools diff --git a/scripts/structures_pruning/requirements/base.txt b/scripts/structures_pruning/requirements/base.txt index b80c660b87..a3fcacad2f 100644 --- a/scripts/structures_pruning/requirements/base.txt +++ b/scripts/structures_pruning/requirements/base.txt @@ -11,7 +11,7 @@ click==8.1.6 # click-log click-log==0.4.0 # via -r scripts/structures_pruning/requirements/base.in -dnspython==2.6.1 +dnspython==2.7.0 # via pymongo edx-opaque-keys==2.11.0 # via -r scripts/structures_pruning/requirements/base.in diff --git a/scripts/structures_pruning/requirements/testing.txt b/scripts/structures_pruning/requirements/testing.txt index 8be2e15973..94c6ac6982 100644 --- a/scripts/structures_pruning/requirements/testing.txt +++ b/scripts/structures_pruning/requirements/testing.txt @@ -12,7 +12,7 @@ click-log==0.4.0 # via -r scripts/structures_pruning/requirements/base.txt ddt==1.7.2 # via -r scripts/structures_pruning/requirements/testing.in -dnspython==2.6.1 +dnspython==2.7.0 # via # -r scripts/structures_pruning/requirements/base.txt # pymongo diff --git a/scripts/user_retirement/requirements/base.txt b/scripts/user_retirement/requirements/base.txt index 9f57da73d0..576fa342c3 100644 --- a/scripts/user_retirement/requirements/base.txt +++ b/scripts/user_retirement/requirements/base.txt @@ -10,9 +10,9 @@ attrs==24.2.0 # via zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.in -boto3==1.35.27 +boto3==1.35.37 # via -r scripts/user_retirement/requirements/base.in -botocore==1.35.27 +botocore==1.35.37 # via # boto3 # s3transfer @@ -46,13 +46,13 @@ django-crum==0.7.9 # via edx-django-utils django-waffle==4.1.0 # via edx-django-utils -edx-django-utils==5.16.0 +edx-django-utils==6.0.0 # via edx-rest-api-client edx-rest-api-client==6.0.0 # via -r scripts/user_retirement/requirements/base.in -google-api-core==2.20.0 +google-api-core==2.21.0 # via google-api-python-client -google-api-python-client==2.147.0 +google-api-python-client==2.149.0 # via -r scripts/user_retirement/requirements/base.in google-auth==2.35.0 # via @@ -69,7 +69,7 @@ httplib2==0.22.0 # google-auth-httplib2 idna==3.10 # via requests -isodate==0.6.1 +isodate==0.7.2 # via zeep jenkinsapi==0.3.13 # via -r scripts/user_retirement/requirements/base.in @@ -77,13 +77,11 @@ jmespath==1.0.1 # via # boto3 # botocore -lxml==4.9.4 - # via - # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt - # zeep +lxml==5.3.0 + # via zeep more-itertools==10.5.0 # via simple-salesforce -newrelic==9.13.0 +newrelic==10.0.0 # via edx-django-utils pbr==6.1.0 # via stevedore @@ -138,7 +136,7 @@ requests-toolbelt==1.0.0 # via zeep rsa==4.9 # via google-auth -s3transfer==0.10.2 +s3transfer==0.10.3 # via boto3 simple-salesforce==1.12.6 # via -r scripts/user_retirement/requirements/base.in @@ -146,7 +144,6 @@ simplejson==3.19.3 # via -r scripts/user_retirement/requirements/base.in six==1.16.0 # via - # isodate # jenkinsapi # python-dateutil sqlparse==0.5.1 diff --git a/scripts/user_retirement/requirements/testing.txt b/scripts/user_retirement/requirements/testing.txt index d5aac1cd06..6a165d7356 100644 --- a/scripts/user_retirement/requirements/testing.txt +++ b/scripts/user_retirement/requirements/testing.txt @@ -14,11 +14,11 @@ attrs==24.2.0 # zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.txt -boto3==1.35.27 +boto3==1.35.37 # via # -r scripts/user_retirement/requirements/base.txt # moto -botocore==1.35.27 +botocore==1.35.37 # via # -r scripts/user_retirement/requirements/base.txt # boto3 @@ -66,17 +66,17 @@ django-waffle==4.1.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils -edx-django-utils==5.16.0 +edx-django-utils==6.0.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-rest-api-client edx-rest-api-client==6.0.0 # via -r scripts/user_retirement/requirements/base.txt -google-api-core==2.20.0 +google-api-core==2.21.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-python-client -google-api-python-client==2.147.0 +google-api-python-client==2.149.0 # via -r scripts/user_retirement/requirements/base.txt google-auth==2.35.0 # via @@ -103,7 +103,7 @@ idna==3.10 # requests iniconfig==2.0.0 # via pytest -isodate==0.6.1 +isodate==0.7.2 # via # -r scripts/user_retirement/requirements/base.txt # zeep @@ -116,11 +116,11 @@ jmespath==1.0.1 # -r scripts/user_retirement/requirements/base.txt # boto3 # botocore -lxml==4.9.4 +lxml==5.3.0 # via # -r scripts/user_retirement/requirements/base.txt # zeep -markupsafe==2.1.5 +markupsafe==3.0.1 # via # jinja2 # werkzeug @@ -132,7 +132,7 @@ more-itertools==10.5.0 # simple-salesforce moto==4.2.14 # via -r scripts/user_retirement/requirements/testing.in -newrelic==9.13.0 +newrelic==10.0.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils @@ -235,7 +235,7 @@ rsa==4.9 # via # -r scripts/user_retirement/requirements/base.txt # google-auth -s3transfer==0.10.2 +s3transfer==0.10.3 # via # -r scripts/user_retirement/requirements/base.txt # boto3 @@ -246,7 +246,6 @@ simplejson==3.19.3 six==1.16.0 # via # -r scripts/user_retirement/requirements/base.txt - # isodate # jenkinsapi # python-dateutil sqlparse==0.5.1 @@ -275,7 +274,7 @@ urllib3==1.26.20 # responses werkzeug==3.0.4 # via moto -xmltodict==0.13.0 +xmltodict==0.14.1 # via moto zeep==4.2.1 # via From a39367b11a4880e124c1cd384b5c486484519414 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:41:46 +0000 Subject: [PATCH 09/32] fix(deps): update dependency @edx/frontend-component-cookie-policy-banner to v2.6.0 --- package-lock.json | 1094 ++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 1024 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index 82a6611d3a..063a004ed8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@edx/brand-edx.org": "^2.0.7", "@edx/edx-bootstrap": "1.0.4", "@edx/edx-proctoring": "^4.18.1", - "@edx/frontend-component-cookie-policy-banner": "2.2.0", + "@edx/frontend-component-cookie-policy-banner": "2.6.0", "@edx/paragon": "2.6.4", "@edx/studio-frontend": "^2.1.0", "babel-loader": "^9.1.3", @@ -1883,6 +1883,25 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.7.tgz", + "integrity": "sha512-gMmIEhg35sXk9Te5qbGp3W9YKrvLt3HV658/d3odWrHSqT0JeG5OzsJWFHRLiOohRyjRsJc/x03DhJm3i8VJxg==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, "node_modules/@babel/runtime/node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -2106,14 +2125,16 @@ } }, "node_modules/@edx/frontend-component-cookie-policy-banner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@edx/frontend-component-cookie-policy-banner/-/frontend-component-cookie-policy-banner-2.2.0.tgz", - "integrity": "sha512-Ye5tL8dU1v77Vtva9QkrgNG0I50sR317OK51/aQwHn50Aoq45FML29dbP8E5dy36QSqvF99bNFA4rptLigiTGQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@edx/frontend-component-cookie-policy-banner/-/frontend-component-cookie-policy-banner-2.6.0.tgz", + "integrity": "sha512-Em/7v41BtVJsHWyaxGOgefif3YOe2Bw8rDZO6Rci40Mcx035Q7L0IlyG3Sxz+GKQIoSOJDYf+EfODS5i01AJOg==", + "license": "AGPL-3.0", "dependencies": { "@edx/brand-edx.org": "2.0.3", - "@edx/paragon": "^12.0.5", + "@openedx/paragon": "^21.13.1", "babel-preset-minify": "^0.5.0", "classnames": "^2.3.1", + "identity-obj-proxy": "^3.0.0", "prop-types": "^15.6.1", "type-fest": "^2.14.0", "universal-cookie": "^4.0.0" @@ -2126,36 +2147,83 @@ "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/@edx/brand-edx.org": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@edx/brand-edx.org/-/brand-edx.org-2.0.3.tgz", - "integrity": "sha512-QRmq2su1Xy+9GhY3NRZ+WdjtYWHmgfuKbVCW2skxgfgW9Q6kea8L6LrgigfrZtW+kQq/KdX2tVJcYBkB9xALtQ==" + "integrity": "sha512-QRmq2su1Xy+9GhY3NRZ+WdjtYWHmgfuKbVCW2skxgfgW9Q6kea8L6LrgigfrZtW+kQq/KdX2tVJcYBkB9xALtQ==", + "license": "UNLICENSED" }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/@edx/paragon": { - "version": "12.8.0", - "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-12.8.0.tgz", - "integrity": "sha512-gJVnozu4V1e2PCI0lFICvnrs2yi0ZzcaO5gJB9OjB1Pzf5GXpkKNWLtdTwjgp4fvzL9w4sqvyB30apbQzWW8yw==", + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/@openedx/paragon": { + "version": "21.13.1", + "resolved": "https://registry.npmjs.org/@openedx/paragon/-/paragon-21.13.1.tgz", + "integrity": "sha512-sLL+Z3ZWIRM6x+OrKZV0S7/SQpEcSeRcDm7E3FzhsnAWudsJCTELvSW+84uy/8dwV7mJhttsBPqQEtNafbCyYA==", + "license": "Apache-2.0", + "workspaces": [ + "example", + "component-generator", + "www", + "icons", + "dependent-usage-analyzer" + ], "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.30", - "@fortawesome/free-solid-svg-icons": "^5.14.0", - "@fortawesome/react-fontawesome": "^0.1.11", - "airbnb-prop-types": "^2.12.0", - "bootstrap": "^4.4.1", - "classnames": "^2.2.6", + "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.1.18", + "@popperjs/core": "^2.11.4", + "bootstrap": "^4.6.2", + "chalk": "^4.1.2", + "child_process": "^1.0.2", + "classnames": "^2.3.1", "email-prop-type": "^3.0.0", + "file-selector": "^0.6.0", "font-awesome": "^4.7.0", - "mailto-link": "^1.0.0", - "prop-types": "^15.7.2", - "react-bootstrap": "^1.2.2", - "react-focus-on": "^3.5.0", + "glob": "^8.0.3", + "inquirer": "^8.2.5", + "lodash.uniqby": "^4.7.0", + "mailto-link": "^2.0.0", + "prop-types": "^15.8.1", + "react-bootstrap": "^1.6.5", + "react-colorful": "^5.6.1", + "react-dropzone": "^14.2.1", + "react-focus-on": "^3.5.4", + "react-imask": "^7.1.3", + "react-loading-skeleton": "^3.1.0", + "react-popper": "^2.2.5", "react-proptype-conditional-require": "^1.0.4", - "react-responsive": "^6.1.1", - "react-table": "^7.6.1", - "react-transition-group": "^4.0.0", - "sanitize-html": "^1.20.0", - "tabbable": "^4.0.0" + "react-responsive": "^8.2.0", + "react-table": "^7.7.0", + "react-transition-group": "^4.4.2", + "tabbable": "^5.3.3", + "uncontrollable": "^7.2.1", + "uuid": "^9.0.0" + }, + "bin": { + "paragon": "bin/paragon-scripts.js" }, "peerDependencies": { - "prop-types": "^15.7.2", - "react": "^16.8.6", - "react-dom": "^16.8.6" + "react": "^16.8.6 || ^17.0.0", + "react-dom": "^16.8.6 || ^17.0.0", + "react-intl": "^5.25.1 || ^6.4.0" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/attr-accept": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.4.tgz", + "integrity": "sha512-2pA6xFIbdTUDCAwjN8nQwI+842VwzbDUXO2IYlpPXQIORgKnavorcr4Ce3rwh+zsNg9zK7QPsdvDj3Lum4WX4w==", + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/bootstrap": { @@ -2172,15 +2240,81 @@ "url": "https://opencollective.com/bootstrap" } ], + "license": "MIT", "peerDependencies": { "jquery": "1.9.1 - 3", "popper.js": "^1.16.1" } }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -2190,24 +2324,206 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/email-prop-type/-/email-prop-type-3.0.1.tgz", "integrity": "sha512-tONZGMEOOkadp5OBftuVXU8DsceWmINxYK+pqPFB4LT5ODjrPX/esel3WGqbV7d6in5/MnZE4n4QcqOr4gh7dg==", + "license": "MIT", "dependencies": { "email-validator": "^2.0.4" } }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/intl-messageformat": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.6.0.tgz", + "integrity": "sha512-AYKl/DY1nl75pJU8EK681JOVL40uQTNJe3yEMXKfydDFoz+5hNrM/PqjchueSMKGKCZKBVgeexqZwy3uC2B36Q==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.1.0", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.7.9", + "tslib": "^2.4.0" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/mailto-link": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mailto-link/-/mailto-link-2.0.0.tgz", + "integrity": "sha512-b5FErkZ4t6mpH1IFZSw7Mm2IQHXQ2R0/5Q4xd7Rv8dVkWvE54mFG/UW7HjfFazXFjXTNsM+dSX2tTeIDrV9K9A==", + "license": "MIT", + "dependencies": { + "assert-ok": "~1.0.0", + "cast-array": "~1.0.1", + "object-filter": "~1.0.2", + "query-string": "~7.0.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/query-string": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.1.tgz", + "integrity": "sha512-uIw3iRvHnk9to1blJCG3BTc+Ro56CBowJXKmNNAm3RulvPBzWLRqKSiiDk+IplJhsydwtuNMHi8UGQFcCLVfkA==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/react-dropzone": { + "version": "14.2.9", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.9.tgz", + "integrity": "sha512-jRZsMC7h48WONsOLHcmhyn3cRWJoIPQjPApvt/sJVfnYaB3Qltn025AoRTTJaj4WdmmgmLl6tUQg1s0wOhpodQ==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/react-intl": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.7.2.tgz", + "integrity": "sha512-v/lvAORTE70welhzqoIi1YI1yHvGE4/QX4W3JYNZoqRxH8ab8Q/Ed4Zem/ZVPZJN4byQ52U+2GESLy0zvY6IBw==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.1.0", + "@formatjs/icu-messageformat-parser": "2.7.9", + "@formatjs/intl": "2.10.7", + "@formatjs/intl-displaynames": "6.6.9", + "@formatjs/intl-listformat": "7.5.8", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/react": "16 || 17 || 18", + "hoist-non-react-statics": "^3.3.2", + "intl-messageformat": "10.6.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "react": "^16.6.0 || 17 || 18", + "typescript": "^4.7 || 5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -2219,6 +2535,62 @@ "react-dom": ">=16.6.0" } }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@edx/mockprock": { "version": "1.0.2", "resolved": "git+ssh://git@github.com/openedx/mockprock.git#3ad18c6888e6521e9bf7a4df0db6f8579b928235", @@ -3138,35 +3510,139 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", - "hasInstallScript": true, - "engines": { - "node": ">=6" + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.1.0.tgz", + "integrity": "sha512-SE2V2PE03K9U/YQZ3nxEOysRkQ/CfSwLHR789Uk9N0PTiWT6I+17UTDI97zYEwC1mbnjefqmtjbL8nunjPwGjw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", + "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.7.9", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.9.tgz", + "integrity": "sha512-9Z5buDRMsTbplXknvRlDmnpWhZrayNVcVvkH0+SSz8Ll4XD/7Tcn8m1IjxM3iBJSwQbxwxb7/g0Fkx3d4j2osw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.1.0", + "@formatjs/icu-skeleton-parser": "1.8.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.3.tgz", + "integrity": "sha512-TsKAP013ayZFbWWR2KWy+f9QVZh0yDFTPK3yE4OqU2gnzafvmKTodRtJLVpfZmpXWJ5y7BWD1AsyT14mcbLzig==", + "license": "MIT", + "peer": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl": { + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.10.7.tgz", + "integrity": "sha512-26rNxo2nwQbbsVkV54ngml9XIA7bBzfQmELG6FFFF8eKzqzFrLKZzF8JBoBpPHgML4HKEUbGCQaBaARpKCN/sw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.1.0", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.7.9", + "@formatjs/intl-displaynames": "6.6.9", + "@formatjs/intl-listformat": "7.5.8", + "intl-messageformat": "10.6.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "typescript": "^4.7 || 5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@formatjs/intl-displaynames": { + "version": "6.6.9", + "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.6.9.tgz", + "integrity": "sha512-2hmS+YJwiXB1deNYXO2/pY7Zv4QUrZHghZxkcnWxBLEODk990h9cNbkjNg/u/RaDeCRkKVrZ3ERTdBcgkTvn2Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.1.0", + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-listformat": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.5.8.tgz", + "integrity": "sha512-WzMiw6nA2uP0ZqbbuPs7tQ+gmYRTbE20lwur4QcKp5K5cgPhkCzRAhovkDFLhrc885c3p7Wjigx8kyg0hypmZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.1.0", + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl/node_modules/intl-messageformat": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.6.0.tgz", + "integrity": "sha512-AYKl/DY1nl75pJU8EK681JOVL40uQTNJe3yEMXKfydDFoz+5hNrM/PqjchueSMKGKCZKBVgeexqZwy3uC2B36Q==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.1.0", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.7.9", + "tslib": "^2.4.0" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", - "hasInstallScript": true, + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz", + "integrity": "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==", + "license": "MIT", "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.6.0" }, "engines": { "node": ">=6" } }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" - }, + "node_modules/@fortawesome/fontawesome-svg-core/node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", + "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4237,6 +4713,17 @@ "@types/node": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/invariant": { "version": "2.2.37", "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.37.tgz", @@ -4820,7 +5307,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -4835,7 +5321,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -6124,6 +6609,26 @@ "node": ">= 0.6.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/base64id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", @@ -6187,6 +6692,31 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/blob": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", @@ -6323,6 +6853,30 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", @@ -6663,6 +7217,12 @@ "node": ">=10" } }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "license": "MIT" + }, "node_modules/cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", @@ -6701,6 +7261,12 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==", + "license": "ISC" + }, "node_modules/chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -7042,6 +7608,18 @@ "node": ">=0.10.0" } }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", @@ -7423,6 +8001,17 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-js-pure": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", + "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -7860,7 +8449,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, "engines": { "node": ">=0.10" } @@ -7907,6 +8495,18 @@ "node": ">=0.10.0" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -9985,6 +10585,32 @@ "node": ">=0.10.0" } }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -10201,6 +10827,18 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/file-selector": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -10266,6 +10904,15 @@ "node": ">=0.10" } }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -11066,6 +11713,12 @@ "node": ">=6" } }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "license": "(Apache-2.0 OR MPL-1.1)" + }, "node_modules/has": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", @@ -11491,6 +12144,38 @@ "node": ">=4.0.0" } }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -11500,6 +12185,18 @@ "node": ">= 4" } }, + "node_modules/imask": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/imask/-/imask-7.6.1.tgz", + "integrity": "sha512-sJlIFM7eathUEMChTh9Mrfw/IgiWgJqBKq2VNbyXvBZ7ev/IlO6/KQTKlV/Fm+viQMLrFLG/zCuudrLIwgK2dg==", + "license": "MIT", + "dependencies": { + "@babel/runtime-corejs3": "^7.24.4" + }, + "engines": { + "npm": ">=4.0.0" + } + }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -12146,6 +12843,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -12398,6 +13104,18 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -16157,6 +16875,12 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", @@ -16600,7 +17324,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } @@ -17695,7 +18418,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -17758,6 +18480,140 @@ "node": ">=0.4.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -17771,7 +18627,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -19698,6 +20553,16 @@ "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/react-dom": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", @@ -19739,6 +20604,12 @@ "resolved": "https://registry.npmjs.org/react-element-proptypes/-/react-element-proptypes-1.0.0.tgz", "integrity": "sha512-unJTkc58D9n1xTXKA8swrwrbDQAsCF/13oT6fDYtBVHPvFxITFuI20HCMNbNzI7tTUzsYmJ3iqjskwfLJkOUFA==" }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, "node_modules/react-focus-lock": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-1.19.1.tgz", @@ -19832,6 +20703,33 @@ } } }, + "node_modules/react-imask": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/react-imask/-/react-imask-7.6.1.tgz", + "integrity": "sha512-vLNfzcCz62Yzx/GRGh5tiCph9Gbh2cZu+Tz8OiO5it2eNuuhpA0DWhhSlOtVtSJ80+Bx+vFK5De8eQ9AmbkXzA==", + "license": "MIT", + "dependencies": { + "imask": "^7.6.1", + "prop-types": "^15.8.1" + }, + "engines": { + "npm": ">=4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/react-imask/node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/react-intl": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-2.9.0.tgz", @@ -19869,6 +20767,15 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "node_modules/react-loading-skeleton": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz", + "integrity": "sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/react-overlays": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", @@ -19907,6 +20814,21 @@ "react-is": "^16.13.1" } }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "license": "MIT", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-proptype-conditional-require": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/react-proptype-conditional-require/-/react-proptype-conditional-require-1.0.4.tgz", @@ -19980,19 +20902,21 @@ } }, "node_modules/react-responsive": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-6.1.2.tgz", - "integrity": "sha512-AXentVC/kN3KED9zhzJv2pu4vZ0i6cSHdTtbCScVV1MT6F5KXaG2qs5D7WLmhdaOvmiMX8UfmS4ZSO+WPwDt4g==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", + "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", + "license": "MIT", "dependencies": { "hyphenate-style-name": "^1.0.0", "matchmediaquery": "^0.3.0", - "prop-types": "^15.6.1" + "prop-types": "^15.6.1", + "shallow-equal": "^1.1.0" }, "engines": { "node": ">= 0.10" }, "peerDependencies": { - "react": "^16.3.0" + "react": ">=16.8.0" } }, "node_modules/react-responsive/node_modules/prop-types": { @@ -21269,6 +22193,15 @@ "integrity": "sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==", "dev": true }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -22276,6 +23209,12 @@ "node": ">=8" } }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -22334,8 +23273,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-html-tokenizer": { "version": "0.1.1", @@ -22837,6 +23775,15 @@ "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -23718,9 +24665,10 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/tabbable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-4.0.0.tgz", - "integrity": "sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ==" + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", + "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==", + "license": "MIT" }, "node_modules/table": { "version": "6.8.2", @@ -23985,8 +24933,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/through2": { "version": "3.0.2", @@ -25101,6 +26048,15 @@ "node": ">=10.13.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -25527,7 +26483,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -25588,7 +26543,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -25603,7 +26557,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -25614,8 +26567,7 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrappy": { "version": "1.0.2", diff --git a/package.json b/package.json index 1f48500e6e..6173420ab0 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@edx/brand-edx.org": "^2.0.7", "@edx/edx-bootstrap": "1.0.4", "@edx/edx-proctoring": "^4.18.1", - "@edx/frontend-component-cookie-policy-banner": "2.2.0", + "@edx/frontend-component-cookie-policy-banner": "2.6.0", "@edx/paragon": "2.6.4", "@edx/studio-frontend": "^2.1.0", "babel-loader": "^9.1.3", From e99769b0dd160ccb4c8364887f7bd59ce119f9ac Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Thu, 10 Oct 2024 16:21:17 -0400 Subject: [PATCH 10/32] Revert "feat: Unpin xmlsec and lxml." This reverts commit 6c045c7b390aa051484cee459a767b246f04e7d8. --- requirements/constraints.txt | 19 +++ requirements/edx-sandbox/base.txt | 5 +- requirements/edx/base.txt | 74 ++++++------ requirements/edx/coverage.txt | 4 +- requirements/edx/development.txt | 110 ++++++++---------- requirements/edx/doc.txt | 77 ++++++------ requirements/edx/paver.txt | 6 +- requirements/edx/semgrep.txt | 8 +- requirements/edx/testing.txt | 96 +++++++-------- requirements/pip-tools.txt | 4 +- .../structures_pruning/requirements/base.txt | 2 +- .../requirements/testing.txt | 2 +- scripts/user_retirement/requirements/base.txt | 23 ++-- .../user_retirement/requirements/testing.txt | 23 ++-- 14 files changed, 229 insertions(+), 224 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 2fc1a1e745..dd727a4b18 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -84,6 +84,13 @@ django-storages<1.14.4 # for them. edx-enterprise==4.27.2 +# Date: 2024-05-09 +# This has to be constrained as well because newer versions of edx-i18n-tools need the +# newer version of lxml but that requirement was not made expilict in the 1.6.0 version +# of the package. This can be un-pinned when we're upgrading lxml. +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35274 +edx-i18n-tools<1.6.0 + # Date: 2024-07-26 # To override the constraint of edx-lint # This can be removed once https://github.com/openedx/edx-platform/issues/34586 is resolved @@ -98,6 +105,13 @@ event-tracking==3.0.0 # https://github.com/openedx/edx-platform/issues/31616 libsass==0.10.0 +# Date: 2024-04-30 +# lxml>=5.0 introduced breaking changes related to system dependencies +# lxml==5.2.1 introduced new extra so we'll nee to rename lxml --> lxml[html-clean] +# This constraint can be removed once we upgrade to Python 3.11 +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35272 +lxml<5.0 + # Date: 2018-12-14 # markdown>=3.4.0 has failures due to internal refactorings which causes the tests to fail # pinning the version untill the issue gets resolved in the package itself @@ -173,3 +187,8 @@ social-auth-app-django<=5.4.1 # which require urllib3<2 for now. # Issue for unpinning: https://github.com/openedx/edx-platform/issues/32222 urllib3<2.0.0 + +# Date: 2024-04-24 +# xmlsec==1.3.14 breaking tests or all builds, can be removed once a fix is available +# Issue for unpinning: https://github.com/openedx/edx-platform/issues/35264 +xmlsec<1.3.14 diff --git a/requirements/edx-sandbox/base.txt b/requirements/edx-sandbox/base.txt index 0a708b2bbf..bf0a4376da 100644 --- a/requirements/edx-sandbox/base.txt +++ b/requirements/edx-sandbox/base.txt @@ -26,11 +26,12 @@ joblib==1.4.2 # via nltk kiwisolver==1.4.7 # via matplotlib -lxml==5.3.0 +lxml==4.9.4 # via + # -c requirements/edx-sandbox/../constraints.txt # -r requirements/edx-sandbox/base.in # openedx-calc -markupsafe==3.0.1 +markupsafe==2.1.5 # via # chem # openedx-calc diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index c7f7828f41..55793bd0c5 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -6,11 +6,11 @@ # -e git+https://github.com/anupdhabarde/edx-proctoring-proctortrack.git@31c6c9923a51c903ae83760ecbbac191363aa2a2#egg=edx_proctoring_proctortrack # via -r requirements/edx/github.in -acid-xblock==0.4.1 +acid-xblock==0.3.1 # via -r requirements/edx/kernel.in -aiohappyeyeballs==2.4.3 +aiohappyeyeballs==2.4.0 # via aiohttp -aiohttp==3.10.9 +aiohttp==3.10.6 # via # geoip2 # openai @@ -70,13 +70,13 @@ bleach[css]==6.1.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/kernel.in -boto3==1.35.37 +boto3==1.35.27 # via # -r requirements/edx/kernel.in # django-ses # fs-s3fs # ora2 -botocore==1.35.37 +botocore==1.35.27 # via # -r requirements/edx/kernel.in # boto3 @@ -87,7 +87,7 @@ cachecontrol==0.14.0 # via firebase-admin cachetools==5.5.0 # via google-auth -camel-converter[pydantic]==4.0.1 +camel-converter[pydantic]==3.1.2 # via meilisearch celery==5.4.0 # via @@ -328,7 +328,7 @@ django-sekizai==4.1.0 # via # -r requirements/edx/kernel.in # openedx-django-wiki -django-ses==4.2.0 +django-ses==4.1.1 # via -r requirements/edx/bundled.in django-simple-history==3.4.0 # via @@ -387,7 +387,7 @@ djangorestframework==3.14.0 # super-csv djangorestframework-xml==2.0.0 # via edx-enterprise -dnspython==2.7.0 +dnspython==2.6.1 # via # -r requirements/edx/paver.txt # pymongo @@ -429,7 +429,7 @@ edx-celeryutils==1.3.0 # super-csv edx-codejail==3.4.1 # via -r requirements/edx/kernel.in -edx-completion==4.7.2 +edx-completion==4.7.1 # via -r requirements/edx/kernel.in edx-django-release-util==1.4.0 # via @@ -438,7 +438,7 @@ edx-django-release-util==1.4.0 # edxval edx-django-sites-extensions==4.2.0 # via -r requirements/edx/kernel.in -edx-django-utils==6.0.0 +edx-django-utils==5.16.0 # via # -r requirements/edx/kernel.in # django-config-models @@ -475,8 +475,9 @@ edx-event-bus-kafka==5.8.1 # via -r requirements/edx/kernel.in edx-event-bus-redis==0.5.0 # via -r requirements/edx/kernel.in -edx-i18n-tools==1.6.3 +edx-i18n-tools==1.5.0 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/bundled.in # ora2 edx-milestones==0.6.0 @@ -516,7 +517,7 @@ edx-search==4.0.0 # via -r requirements/edx/kernel.in edx-sga==0.25.0 # via -r requirements/edx/bundled.in -edx-submissions==3.8.1 +edx-submissions==3.8.0 # via # -r requirements/edx/kernel.in # ora2 @@ -583,14 +584,14 @@ geoip2==4.8.0 # via -r requirements/edx/kernel.in glob2==0.7 # via -r requirements/edx/kernel.in -google-api-core[grpc]==2.21.0 +google-api-core[grpc]==2.20.0 # via # firebase-admin # google-api-python-client # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.149.0 +google-api-python-client==2.147.0 # via firebase-admin google-auth==2.35.0 # via @@ -620,11 +621,11 @@ googleapis-common-protos==1.65.0 # via # google-api-core # grpcio-status -grpcio==1.66.2 +grpcio==1.66.1 # via # google-api-core # grpcio-status -grpcio-status==1.66.2 +grpcio-status==1.66.1 # via google-api-core gunicorn==23.0.0 # via -r requirements/edx/kernel.in @@ -638,7 +639,7 @@ httplib2==0.22.0 # via # google-api-python-client # google-auth-httplib2 -icalendar==6.0.0 +icalendar==5.0.13 # via -r requirements/edx/kernel.in idna==3.10 # via @@ -657,7 +658,7 @@ interchange==2021.0.4 # via py2neo ipaddress==1.0.23 # via -r requirements/edx/kernel.in -isodate==0.7.2 +isodate==0.6.1 # via python3-saml jinja2==3.1.4 # via code-annotations @@ -682,7 +683,7 @@ jsonschema==4.23.0 # via # drf-spectacular # optimizely-sdk -jsonschema-specifications==2024.10.1 +jsonschema-specifications==2023.12.1 # via jsonschema jwcrypto==1.5.6 # via @@ -707,21 +708,19 @@ loremipsum==1.0.5 # via ora2 lti-consumer-xblock==9.11.3 # via -r requirements/edx/kernel.in -lxml[html-clean]==5.3.0 +lxml==4.9.4 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in # edx-i18n-tools # edxval # lti-consumer-xblock - # lxml-html-clean # olxcleaner # openedx-calc # ora2 # python3-saml # xblock # xmlsec -lxml-html-clean==0.3.1 - # via lxml mailsnake==1.6.4 # via -r requirements/edx/bundled.in mako==1.3.5 @@ -738,7 +737,7 @@ markdown==3.3.7 # openedx-django-wiki # staff-graded-xblock # xblock-poll -markupsafe==3.0.1 +markupsafe==2.1.5 # via # -r requirements/edx/paver.txt # chem @@ -770,7 +769,7 @@ multidict==6.1.0 # yarl mysqlclient==2.2.4 # via -r requirements/edx/kernel.in -newrelic==10.0.0 +newrelic==9.13.0 # via # -r requirements/edx/bundled.in # edx-django-utils @@ -821,7 +820,7 @@ openedx-events==9.14.1 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.11.0 +openedx-filters==1.10.0 # via # -r requirements/edx/kernel.in # lti-consumer-xblock @@ -830,7 +829,7 @@ openedx-learning==0.13.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in -openedx-mongodbproxy==0.2.2 +openedx-mongodbproxy==0.2.1 # via -r requirements/edx/kernel.in optimizely-sdk==4.1.1 # via @@ -882,8 +881,6 @@ polib==1.2.0 # via edx-i18n-tools prompt-toolkit==3.0.48 # via click-repl -propcache==0.2.0 - # via yarl proto-plus==1.24.0 # via # google-api-core @@ -914,7 +911,7 @@ pycountry==24.6.1 # via -r requirements/edx/kernel.in pycparser==2.22 # via cffi -pycryptodomex==3.21.0 +pycryptodomex==3.20.0 # via # -r requirements/edx/kernel.in # edx-proctoring @@ -1020,6 +1017,7 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs + # icalendar # interchange # olxcleaner # ora2 @@ -1041,7 +1039,7 @@ random2==1.0.2 # via -r requirements/edx/kernel.in recommender-xblock==2.2.1 # via -r requirements/edx/bundled.in -redis==5.1.1 +redis==5.0.8 # via # -r requirements/edx/kernel.in # walrus @@ -1094,7 +1092,7 @@ rules==3.5 # edx-enterprise # edx-proctoring # openedx-learning -s3transfer==0.10.3 +s3transfer==0.10.2 # via boto3 sailthru-client==2.2.3 # via edx-ace @@ -1133,6 +1131,7 @@ six==1.16.0 # fs-s3fs # html5lib # interchange + # isodate # libsass # optimizely-sdk # pansi @@ -1209,7 +1208,6 @@ typing-extensions==4.12.2 tzdata==2024.2 # via # celery - # icalendar # kombu unicodecsv==0.14.1 # via @@ -1239,7 +1237,7 @@ voluptuous==0.15.2 # via ora2 walrus==0.9.4 # via edx-event-bus-redis -watchdog==5.0.3 +watchdog==5.0.2 # via -r requirements/edx/paver.txt wcwidth==0.2.13 # via prompt-toolkit @@ -1287,11 +1285,13 @@ xblock-utils==4.0.0 # via # edx-sga # xblock-poll -xmlsec==1.3.14 - # via python3-saml +xmlsec==1.3.13 + # via + # -c requirements/edx/../constraints.txt + # python3-saml xss-utils==0.6.0 # via -r requirements/edx/kernel.in -yarl==1.14.0 +yarl==1.12.1 # via aiohttp zipp==3.20.2 # via importlib-metadata diff --git a/requirements/edx/coverage.txt b/requirements/edx/coverage.txt index 45f2429cb2..a1faf5e740 100644 --- a/requirements/edx/coverage.txt +++ b/requirements/edx/coverage.txt @@ -6,13 +6,13 @@ # chardet==5.2.0 # via diff-cover -coverage==7.6.2 +coverage==7.6.1 # via -r requirements/edx/coverage.in diff-cover==9.2.0 # via -r requirements/edx/coverage.in jinja2==3.1.4 # via diff-cover -markupsafe==3.0.1 +markupsafe==2.1.5 # via jinja2 pluggy==1.5.0 # via diff-cover diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 13f3f6d5e6..1bdd373651 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -12,16 +12,16 @@ accessible-pygments==0.0.5 # via # -r requirements/edx/doc.txt # pydata-sphinx-theme -acid-xblock==0.4.1 +acid-xblock==0.3.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -aiohappyeyeballs==2.4.3 +aiohappyeyeballs==2.4.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp -aiohttp==3.10.9 +aiohttp==3.10.6 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -140,14 +140,14 @@ boto==2.49.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -boto3==1.35.37 +boto3==1.35.27 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.37 +botocore==1.35.27 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -157,7 +157,7 @@ bridgekeeper==0.9 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -build==1.2.2.post1 +build==1.2.2 # via # -r requirements/edx/../pip-tools.txt # pip-tools @@ -172,7 +172,7 @@ cachetools==5.5.0 # -r requirements/edx/testing.txt # google-auth # tox -camel-converter[pydantic]==4.0.1 +camel-converter[pydantic]==3.1.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -278,7 +278,7 @@ colorama==0.4.6 # via # -r requirements/edx/testing.txt # tox -coverage[toml]==7.6.2 +coverage[toml]==7.6.1 # via # -r requirements/edx/testing.txt # pytest-cov @@ -325,11 +325,11 @@ defusedxml==0.7.1 # social-auth-core diff-cover==9.2.0 # via -r requirements/edx/testing.txt -dill==0.3.9 +dill==0.3.8 # via # -r requirements/edx/testing.txt # pylint -distlib==0.3.9 +distlib==0.3.8 # via # -r requirements/edx/testing.txt # virtualenv @@ -544,7 +544,7 @@ django-sekizai==4.1.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki -django-ses==4.2.0 +django-ses==4.1.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -627,7 +627,7 @@ djangorestframework-xml==2.0.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise -dnspython==2.7.0 +dnspython==2.6.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -696,7 +696,7 @@ edx-codejail==3.4.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-completion==4.7.2 +edx-completion==4.7.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -710,7 +710,7 @@ edx-django-sites-extensions==4.2.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-django-utils==6.0.0 +edx-django-utils==5.16.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -754,8 +754,9 @@ edx-event-bus-redis==0.5.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-i18n-tools==1.6.3 +edx-i18n-tools==1.5.0 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 @@ -813,7 +814,7 @@ edx-sga==0.25.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-submissions==3.8.1 +edx-submissions==3.8.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -878,7 +879,7 @@ execnet==2.1.1 # pytest-xdist factory-boy==3.3.1 # via -r requirements/edx/testing.txt -faker==30.3.0 +faker==30.0.0 # via # -r requirements/edx/testing.txt # factory-boy @@ -942,7 +943,7 @@ glob2==0.7 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -google-api-core[grpc]==2.21.0 +google-api-core[grpc]==2.20.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -951,7 +952,7 @@ google-api-core[grpc]==2.21.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.149.0 +google-api-python-client==2.147.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1004,17 +1005,17 @@ googleapis-common-protos==1.65.0 # -r requirements/edx/testing.txt # google-api-core # grpcio-status -grimp==3.5 +grimp==3.4.1 # via # -r requirements/edx/testing.txt # import-linter -grpcio==1.66.2 +grpcio==1.66.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # google-api-core # grpcio-status -grpcio-status==1.66.2 +grpcio-status==1.66.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1044,7 +1045,7 @@ httplib2==0.22.0 # google-auth-httplib2 httpretty==1.1.4 # via -r requirements/edx/testing.txt -icalendar==6.0.0 +icalendar==5.0.13 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1061,7 +1062,7 @@ imagesize==1.4.1 # via # -r requirements/edx/doc.txt # sphinx -import-linter==2.1 +import-linter==2.0 # via -r requirements/edx/testing.txt importlib-metadata==8.5.0 # via @@ -1086,7 +1087,7 @@ ipaddress==1.0.23 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -isodate==0.7.2 +isodate==0.6.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1135,7 +1136,7 @@ jsonschema==4.23.0 # drf-spectacular # optimizely-sdk # sphinxcontrib-openapi -jsonschema-specifications==2024.10.1 +jsonschema-specifications==2023.12.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1182,14 +1183,14 @@ lti-consumer-xblock==9.11.3 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -lxml[html-clean]==5.3.0 +lxml==4.9.4 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-i18n-tools # edxval # lti-consumer-xblock - # lxml-html-clean # olxcleaner # openedx-calc # ora2 @@ -1197,11 +1198,6 @@ lxml[html-clean]==5.3.0 # python3-saml # xblock # xmlsec -lxml-html-clean==0.3.1 - # via - # -r requirements/edx/doc.txt - # -r requirements/edx/testing.txt - # lxml mailsnake==1.6.4 # via # -r requirements/edx/doc.txt @@ -1222,7 +1218,7 @@ markdown==3.3.7 # openedx-django-wiki # staff-graded-xblock # xblock-poll -markupsafe==3.0.1 +markupsafe==2.1.5 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1294,7 +1290,7 @@ mysqlclient==2.2.4 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -newrelic==10.0.0 +newrelic==9.13.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1372,7 +1368,7 @@ openedx-events==9.14.1 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.11.0 +openedx-filters==1.10.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1383,7 +1379,7 @@ openedx-learning==0.13.1 # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -openedx-mongodbproxy==0.2.2 +openedx-mongodbproxy==0.2.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1411,7 +1407,7 @@ packaging==24.1 # snowflake-connector-python # sphinx # tox -pact-python==2.2.2 +pact-python==2.2.1 # via -r requirements/edx/testing.txt pansi==2020.7.3 # via @@ -1492,11 +1488,6 @@ prompt-toolkit==3.0.48 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # click-repl -propcache==0.2.0 - # via - # -r requirements/edx/doc.txt - # -r requirements/edx/testing.txt - # yarl proto-plus==1.24.0 # via # -r requirements/edx/doc.txt @@ -1551,7 +1542,7 @@ pycparser==2.22 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # cffi -pycryptodomex==3.21.0 +pycryptodomex==3.20.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1675,7 +1666,7 @@ pyproject-api==1.8.0 # via # -r requirements/edx/testing.txt # tox -pyproject-hooks==1.2.0 +pyproject-hooks==1.1.0 # via # -r requirements/edx/../pip-tools.txt # build @@ -1776,6 +1767,7 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs + # icalendar # interchange # olxcleaner # ora2 @@ -1807,7 +1799,7 @@ recommender-xblock==2.2.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -redis==5.1.1 +redis==5.0.8 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1877,7 +1869,7 @@ rules==3.5 # edx-enterprise # edx-proctoring # openedx-learning -s3transfer==0.10.3 +s3transfer==0.10.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1934,6 +1926,7 @@ six==1.16.0 # fs-s3fs # html5lib # interchange + # isodate # libsass # optimizely-sdk # pact-python @@ -1993,7 +1986,7 @@ soupsieve==2.6 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # beautifulsoup4 -sphinx==8.1.0 +sphinx==8.0.2 # via # -r requirements/edx/doc.txt # pydata-sphinx-theme @@ -2094,7 +2087,7 @@ tinycss2==1.2.1 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # bleach -tomli==2.0.2 +tomli==2.0.1 # via django-stubs tomlkit==0.13.2 # via @@ -2102,7 +2095,7 @@ tomlkit==0.13.2 # -r requirements/edx/testing.txt # pylint # snowflake-connector-python -tox==4.21.2 +tox==4.20.0 # via -r requirements/edx/testing.txt tqdm==4.66.5 # via @@ -2110,7 +2103,7 @@ tqdm==4.66.5 # -r requirements/edx/testing.txt # nltk # openai -types-pytz==2024.2.0.20241003 +types-pytz==2024.2.0.20240913 # via django-stubs types-pyyaml==6.0.12.20240917 # via @@ -2129,7 +2122,6 @@ typing-extensions==4.12.2 # django-stubs-ext # djangorestframework-stubs # edx-opaque-keys - # faker # fastapi # grimp # import-linter @@ -2145,7 +2137,6 @@ tzdata==2024.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery - # icalendar # kombu unicodecsv==0.14.1 # via @@ -2174,7 +2165,7 @@ user-util==1.1.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -uvicorn==0.31.1 +uvicorn==0.30.6 # via # -r requirements/edx/testing.txt # pact-python @@ -2185,7 +2176,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.26.6 +virtualenv==20.26.5 # via # -r requirements/edx/testing.txt # tox @@ -2194,14 +2185,14 @@ voluptuous==0.15.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 -vulture==2.13 +vulture==2.12 # via -r requirements/edx/development.in walrus==0.9.4 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-event-bus-redis -watchdog==5.0.3 +watchdog==5.0.2 # via # -r requirements/edx/development.in # -r requirements/edx/doc.txt @@ -2275,8 +2266,9 @@ xblock-utils==4.0.0 # -r requirements/edx/testing.txt # edx-sga # xblock-poll -xmlsec==1.3.14 +xmlsec==1.3.13 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # python3-saml @@ -2284,7 +2276,7 @@ xss-utils==0.6.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -yarl==1.14.0 +yarl==1.12.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 30736a21a3..6f12d80467 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -8,13 +8,13 @@ # via -r requirements/edx/base.txt accessible-pygments==0.0.5 # via pydata-sphinx-theme -acid-xblock==0.4.1 +acid-xblock==0.3.1 # via -r requirements/edx/base.txt -aiohappyeyeballs==2.4.3 +aiohappyeyeballs==2.4.0 # via # -r requirements/edx/base.txt # aiohttp -aiohttp==3.10.9 +aiohttp==3.10.6 # via # -r requirements/edx/base.txt # geoip2 @@ -102,13 +102,13 @@ bleach[css]==6.1.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -boto3==1.35.37 +boto3==1.35.27 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.37 +botocore==1.35.27 # via # -r requirements/edx/base.txt # boto3 @@ -123,7 +123,7 @@ cachetools==5.5.0 # via # -r requirements/edx/base.txt # google-auth -camel-converter[pydantic]==4.0.1 +camel-converter[pydantic]==3.1.2 # via # -r requirements/edx/base.txt # meilisearch @@ -398,7 +398,7 @@ django-sekizai==4.1.0 # via # -r requirements/edx/base.txt # openedx-django-wiki -django-ses==4.2.0 +django-ses==4.1.1 # via -r requirements/edx/base.txt django-simple-history==3.4.0 # via @@ -459,7 +459,7 @@ djangorestframework-xml==2.0.0 # via # -r requirements/edx/base.txt # edx-enterprise -dnspython==2.7.0 +dnspython==2.6.1 # via # -r requirements/edx/base.txt # pymongo @@ -509,7 +509,7 @@ edx-celeryutils==1.3.0 # super-csv edx-codejail==3.4.1 # via -r requirements/edx/base.txt -edx-completion==4.7.2 +edx-completion==4.7.1 # via -r requirements/edx/base.txt edx-django-release-util==1.4.0 # via @@ -518,7 +518,7 @@ edx-django-release-util==1.4.0 # edxval edx-django-sites-extensions==4.2.0 # via -r requirements/edx/base.txt -edx-django-utils==6.0.0 +edx-django-utils==5.16.0 # via # -r requirements/edx/base.txt # django-config-models @@ -555,8 +555,9 @@ edx-event-bus-kafka==5.8.1 # via -r requirements/edx/base.txt edx-event-bus-redis==0.5.0 # via -r requirements/edx/base.txt -edx-i18n-tools==1.6.3 +edx-i18n-tools==1.5.0 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # ora2 edx-milestones==0.6.0 @@ -597,7 +598,7 @@ edx-search==4.0.0 # via -r requirements/edx/base.txt edx-sga==0.25.0 # via -r requirements/edx/base.txt -edx-submissions==3.8.1 +edx-submissions==3.8.0 # via # -r requirements/edx/base.txt # ora2 @@ -682,7 +683,7 @@ gitpython==3.1.43 # via -r requirements/edx/doc.in glob2==0.7 # via -r requirements/edx/base.txt -google-api-core[grpc]==2.21.0 +google-api-core[grpc]==2.20.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -690,7 +691,7 @@ google-api-core[grpc]==2.21.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.149.0 +google-api-python-client==2.147.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -734,12 +735,12 @@ googleapis-common-protos==1.65.0 # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio==1.66.2 +grpcio==1.66.1 # via # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio-status==1.66.2 +grpcio-status==1.66.1 # via # -r requirements/edx/base.txt # google-api-core @@ -756,7 +757,7 @@ httplib2==0.22.0 # -r requirements/edx/base.txt # google-api-python-client # google-auth-httplib2 -icalendar==6.0.0 +icalendar==5.0.13 # via -r requirements/edx/base.txt idna==3.10 # via @@ -780,7 +781,7 @@ interchange==2021.0.4 # py2neo ipaddress==1.0.23 # via -r requirements/edx/base.txt -isodate==0.7.2 +isodate==0.6.1 # via # -r requirements/edx/base.txt # python3-saml @@ -817,7 +818,7 @@ jsonschema==4.23.0 # drf-spectacular # optimizely-sdk # sphinxcontrib-openapi -jsonschema-specifications==2024.10.1 +jsonschema-specifications==2023.12.1 # via # -r requirements/edx/base.txt # jsonschema @@ -849,23 +850,19 @@ loremipsum==1.0.5 # ora2 lti-consumer-xblock==9.11.3 # via -r requirements/edx/base.txt -lxml[html-clean]==5.3.0 +lxml==4.9.4 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # edx-i18n-tools # edxval # lti-consumer-xblock - # lxml-html-clean # olxcleaner # openedx-calc # ora2 # python3-saml # xblock # xmlsec -lxml-html-clean==0.3.1 - # via - # -r requirements/edx/base.txt - # lxml mailsnake==1.6.4 # via -r requirements/edx/base.txt mako==1.3.5 @@ -882,7 +879,7 @@ markdown==3.3.7 # openedx-django-wiki # staff-graded-xblock # xblock-poll -markupsafe==3.0.1 +markupsafe==2.1.5 # via # -r requirements/edx/base.txt # chem @@ -926,7 +923,7 @@ multidict==6.1.0 # yarl mysqlclient==2.2.4 # via -r requirements/edx/base.txt -newrelic==10.0.0 +newrelic==9.13.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -982,7 +979,7 @@ openedx-events==9.14.1 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.11.0 +openedx-filters==1.10.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock @@ -991,7 +988,7 @@ openedx-learning==0.13.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt -openedx-mongodbproxy==0.2.2 +openedx-mongodbproxy==0.2.1 # via -r requirements/edx/base.txt optimizely-sdk==4.1.1 # via @@ -1060,10 +1057,6 @@ prompt-toolkit==3.0.48 # via # -r requirements/edx/base.txt # click-repl -propcache==0.2.0 - # via - # -r requirements/edx/base.txt - # yarl proto-plus==1.24.0 # via # -r requirements/edx/base.txt @@ -1101,7 +1094,7 @@ pycparser==2.22 # via # -r requirements/edx/base.txt # cffi -pycryptodomex==3.21.0 +pycryptodomex==3.20.0 # via # -r requirements/edx/base.txt # edx-proctoring @@ -1229,6 +1222,7 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs + # icalendar # interchange # olxcleaner # ora2 @@ -1251,7 +1245,7 @@ random2==1.0.2 # via -r requirements/edx/base.txt recommender-xblock==2.2.1 # via -r requirements/edx/base.txt -redis==5.1.1 +redis==5.0.8 # via # -r requirements/edx/base.txt # walrus @@ -1311,7 +1305,7 @@ rules==3.5 # edx-enterprise # edx-proctoring # openedx-learning -s3transfer==0.10.3 +s3transfer==0.10.2 # via # -r requirements/edx/base.txt # boto3 @@ -1356,6 +1350,7 @@ six==1.16.0 # fs-s3fs # html5lib # interchange + # isodate # libsass # optimizely-sdk # pansi @@ -1399,7 +1394,7 @@ soupsieve==2.6 # via # -r requirements/edx/base.txt # beautifulsoup4 -sphinx==8.1.0 +sphinx==8.0.2 # via # -r requirements/edx/doc.in # pydata-sphinx-theme @@ -1494,7 +1489,6 @@ tzdata==2024.2 # via # -r requirements/edx/base.txt # celery - # icalendar # kombu unicodecsv==0.14.1 # via @@ -1530,7 +1524,7 @@ walrus==0.9.4 # via # -r requirements/edx/base.txt # edx-event-bus-redis -watchdog==5.0.3 +watchdog==5.0.2 # via -r requirements/edx/base.txt wcwidth==0.2.13 # via @@ -1582,13 +1576,14 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xmlsec==1.3.14 +xmlsec==1.3.13 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # python3-saml xss-utils==0.6.0 # via -r requirements/edx/base.txt -yarl==1.14.0 +yarl==1.12.1 # via # -r requirements/edx/base.txt # aiohttp diff --git a/requirements/edx/paver.txt b/requirements/edx/paver.txt index 2d8f510e03..a0b1896919 100644 --- a/requirements/edx/paver.txt +++ b/requirements/edx/paver.txt @@ -10,7 +10,7 @@ charset-normalizer==2.0.12 # via # -c requirements/edx/../constraints.txt # requests -dnspython==2.7.0 +dnspython==2.6.1 # via pymongo edx-opaque-keys==2.11.0 # via -r requirements/edx/paver.in @@ -22,7 +22,7 @@ libsass==0.10.0 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/paver.in -markupsafe==3.0.1 +markupsafe==2.1.5 # via -r requirements/edx/paver.in mock==5.1.0 # via -r requirements/edx/paver.in @@ -61,7 +61,7 @@ urllib3==1.26.20 # via # -c requirements/edx/../constraints.txt # requests -watchdog==5.0.3 +watchdog==5.0.2 # via -r requirements/edx/paver.in wrapt==1.16.0 # via -r requirements/edx/paver.in diff --git a/requirements/edx/semgrep.txt b/requirements/edx/semgrep.txt index 174fa87d08..102289def2 100644 --- a/requirements/edx/semgrep.txt +++ b/requirements/edx/semgrep.txt @@ -15,7 +15,7 @@ boltons==21.0.0 # face # glom # semgrep -bracex==2.5.post1 +bracex==2.5 # via wcmatch certifi==2024.8.30 # via requests @@ -42,7 +42,7 @@ idna==3.10 # via requests jsonschema==4.23.0 # via semgrep -jsonschema-specifications==2024.10.1 +jsonschema-specifications==2023.12.1 # via jsonschema markdown-it-py==3.0.0 # via rich @@ -60,7 +60,7 @@ referencing==0.35.1 # jsonschema-specifications requests==2.32.3 # via semgrep -rich==13.9.2 +rich==13.8.1 # via semgrep rpds-py==0.20.0 # via @@ -72,7 +72,7 @@ ruamel-yaml-clib==0.2.8 # via ruamel-yaml semgrep==1.52.0 # via -r requirements/edx/semgrep.in -tomli==2.0.2 +tomli==2.0.1 # via semgrep typing-extensions==4.12.2 # via semgrep diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 473da12534..d3b14a6f43 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -6,13 +6,13 @@ # -e git+https://github.com/anupdhabarde/edx-proctoring-proctortrack.git@31c6c9923a51c903ae83760ecbbac191363aa2a2#egg=edx_proctoring_proctortrack # via -r requirements/edx/base.txt -acid-xblock==0.4.1 +acid-xblock==0.3.1 # via -r requirements/edx/base.txt -aiohappyeyeballs==2.4.3 +aiohappyeyeballs==2.4.0 # via # -r requirements/edx/base.txt # aiohttp -aiohttp==3.10.9 +aiohttp==3.10.6 # via # -r requirements/edx/base.txt # geoip2 @@ -102,13 +102,13 @@ bleach[css]==6.1.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -boto3==1.35.37 +boto3==1.35.27 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.37 +botocore==1.35.27 # via # -r requirements/edx/base.txt # boto3 @@ -124,7 +124,7 @@ cachetools==5.5.0 # -r requirements/edx/base.txt # google-auth # tox -camel-converter[pydantic]==4.0.1 +camel-converter[pydantic]==3.1.2 # via # -r requirements/edx/base.txt # meilisearch @@ -209,7 +209,7 @@ codejail-includes==1.0.0 # via -r requirements/edx/base.txt colorama==0.4.6 # via tox -coverage[toml]==7.6.2 +coverage[toml]==7.6.1 # via # -r requirements/edx/coverage.txt # pytest-cov @@ -247,9 +247,9 @@ defusedxml==0.7.1 # social-auth-core diff-cover==9.2.0 # via -r requirements/edx/coverage.txt -dill==0.3.9 +dill==0.3.8 # via pylint -distlib==0.3.9 +distlib==0.3.8 # via virtualenv django==4.2.16 # via @@ -427,7 +427,7 @@ django-sekizai==4.1.0 # via # -r requirements/edx/base.txt # openedx-django-wiki -django-ses==4.2.0 +django-ses==4.1.1 # via -r requirements/edx/base.txt django-simple-history==3.4.0 # via @@ -488,7 +488,7 @@ djangorestframework-xml==2.0.0 # via # -r requirements/edx/base.txt # edx-enterprise -dnspython==2.7.0 +dnspython==2.6.1 # via # -r requirements/edx/base.txt # pymongo @@ -533,7 +533,7 @@ edx-celeryutils==1.3.0 # super-csv edx-codejail==3.4.1 # via -r requirements/edx/base.txt -edx-completion==4.7.2 +edx-completion==4.7.1 # via -r requirements/edx/base.txt edx-django-release-util==1.4.0 # via @@ -542,7 +542,7 @@ edx-django-release-util==1.4.0 # edxval edx-django-sites-extensions==4.2.0 # via -r requirements/edx/base.txt -edx-django-utils==6.0.0 +edx-django-utils==5.16.0 # via # -r requirements/edx/base.txt # django-config-models @@ -579,8 +579,9 @@ edx-event-bus-kafka==5.8.1 # via -r requirements/edx/base.txt edx-event-bus-redis==0.5.0 # via -r requirements/edx/base.txt -edx-i18n-tools==1.6.3 +edx-i18n-tools==1.5.0 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # ora2 edx-lint==5.4.0 @@ -623,7 +624,7 @@ edx-search==4.0.0 # via -r requirements/edx/base.txt edx-sga==0.25.0 # via -r requirements/edx/base.txt -edx-submissions==3.8.1 +edx-submissions==3.8.0 # via # -r requirements/edx/base.txt # ora2 @@ -673,7 +674,7 @@ execnet==2.1.1 # via pytest-xdist factory-boy==3.3.1 # via -r requirements/edx/testing.in -faker==30.3.0 +faker==30.0.0 # via factory-boy fastapi==0.115.0 # via pact-python @@ -716,7 +717,7 @@ geoip2==4.8.0 # via -r requirements/edx/base.txt glob2==0.7 # via -r requirements/edx/base.txt -google-api-core[grpc]==2.21.0 +google-api-core[grpc]==2.20.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -724,7 +725,7 @@ google-api-core[grpc]==2.21.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.149.0 +google-api-python-client==2.147.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -768,14 +769,14 @@ googleapis-common-protos==1.65.0 # -r requirements/edx/base.txt # google-api-core # grpcio-status -grimp==3.5 +grimp==3.4.1 # via import-linter -grpcio==1.66.2 +grpcio==1.66.1 # via # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio-status==1.66.2 +grpcio-status==1.66.1 # via # -r requirements/edx/base.txt # google-api-core @@ -796,7 +797,7 @@ httplib2==0.22.0 # google-auth-httplib2 httpretty==1.1.4 # via -r requirements/edx/testing.in -icalendar==6.0.0 +icalendar==5.0.13 # via -r requirements/edx/base.txt idna==3.10 # via @@ -806,7 +807,7 @@ idna==3.10 # requests # snowflake-connector-python # yarl -import-linter==2.1 +import-linter==2.0 # via -r requirements/edx/testing.in importlib-metadata==8.5.0 # via -r requirements/edx/base.txt @@ -823,7 +824,7 @@ interchange==2021.0.4 # py2neo ipaddress==1.0.23 # via -r requirements/edx/base.txt -isodate==0.7.2 +isodate==0.6.1 # via # -r requirements/edx/base.txt # python3-saml @@ -864,7 +865,7 @@ jsonschema==4.23.0 # -r requirements/edx/base.txt # drf-spectacular # optimizely-sdk -jsonschema-specifications==2024.10.1 +jsonschema-specifications==2023.12.1 # via # -r requirements/edx/base.txt # jsonschema @@ -898,13 +899,13 @@ loremipsum==1.0.5 # ora2 lti-consumer-xblock==9.11.3 # via -r requirements/edx/base.txt -lxml[html-clean]==5.3.0 +lxml==4.9.4 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # edx-i18n-tools # edxval # lti-consumer-xblock - # lxml-html-clean # olxcleaner # openedx-calc # ora2 @@ -912,10 +913,6 @@ lxml[html-clean]==5.3.0 # python3-saml # xblock # xmlsec -lxml-html-clean==0.3.1 - # via - # -r requirements/edx/base.txt - # lxml mailsnake==1.6.4 # via -r requirements/edx/base.txt mako==1.3.5 @@ -932,7 +929,7 @@ markdown==3.3.7 # openedx-django-wiki # staff-graded-xblock # xblock-poll -markupsafe==3.0.1 +markupsafe==2.1.5 # via # -r requirements/edx/base.txt # -r requirements/edx/coverage.txt @@ -977,7 +974,7 @@ multidict==6.1.0 # yarl mysqlclient==2.2.4 # via -r requirements/edx/base.txt -newrelic==10.0.0 +newrelic==9.13.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -1033,7 +1030,7 @@ openedx-events==9.14.1 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.11.0 +openedx-filters==1.10.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock @@ -1042,7 +1039,7 @@ openedx-learning==0.13.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt -openedx-mongodbproxy==0.2.2 +openedx-mongodbproxy==0.2.1 # via -r requirements/edx/base.txt optimizely-sdk==4.1.1 # via @@ -1060,7 +1057,7 @@ packaging==24.1 # pytest # snowflake-connector-python # tox -pact-python==2.2.2 +pact-python==2.2.1 # via -r requirements/edx/testing.in pansi==2020.7.3 # via @@ -1122,10 +1119,6 @@ prompt-toolkit==3.0.48 # via # -r requirements/edx/base.txt # click-repl -propcache==0.2.0 - # via - # -r requirements/edx/base.txt - # yarl proto-plus==1.24.0 # via # -r requirements/edx/base.txt @@ -1171,7 +1164,7 @@ pycparser==2.22 # via # -r requirements/edx/base.txt # cffi -pycryptodomex==3.21.0 +pycryptodomex==3.20.0 # via # -r requirements/edx/base.txt # edx-proctoring @@ -1347,6 +1340,7 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs + # icalendar # interchange # olxcleaner # ora2 @@ -1368,7 +1362,7 @@ random2==1.0.2 # via -r requirements/edx/base.txt recommender-xblock==2.2.1 # via -r requirements/edx/base.txt -redis==5.1.1 +redis==5.0.8 # via # -r requirements/edx/base.txt # walrus @@ -1428,7 +1422,7 @@ rules==3.5 # edx-enterprise # edx-proctoring # openedx-learning -s3transfer==0.10.3 +s3transfer==0.10.2 # via # -r requirements/edx/base.txt # boto3 @@ -1476,6 +1470,7 @@ six==1.16.0 # fs-s3fs # html5lib # interchange + # isodate # libsass # optimizely-sdk # pact-python @@ -1559,7 +1554,7 @@ tomlkit==0.13.2 # -r requirements/edx/base.txt # pylint # snowflake-connector-python -tox==4.21.2 +tox==4.20.0 # via -r requirements/edx/testing.in tqdm==4.66.5 # via @@ -1571,7 +1566,6 @@ typing-extensions==4.12.2 # -r requirements/edx/base.txt # django-countries # edx-opaque-keys - # faker # fastapi # grimp # import-linter @@ -1584,7 +1578,6 @@ tzdata==2024.2 # via # -r requirements/edx/base.txt # celery - # icalendar # kombu unicodecsv==0.14.1 # via @@ -1608,7 +1601,7 @@ urllib3==1.26.20 # requests user-util==1.1.0 # via -r requirements/edx/base.txt -uvicorn==0.31.1 +uvicorn==0.30.6 # via pact-python vine==5.1.0 # via @@ -1616,7 +1609,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.26.6 +virtualenv==20.26.5 # via tox voluptuous==0.15.2 # via @@ -1626,7 +1619,7 @@ walrus==0.9.4 # via # -r requirements/edx/base.txt # edx-event-bus-redis -watchdog==5.0.3 +watchdog==5.0.2 # via -r requirements/edx/base.txt wcwidth==0.2.13 # via @@ -1680,13 +1673,14 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xmlsec==1.3.14 +xmlsec==1.3.13 # via + # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # python3-saml xss-utils==0.6.0 # via -r requirements/edx/base.txt -yarl==1.14.0 +yarl==1.12.1 # via # -r requirements/edx/base.txt # aiohttp diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 110663ff6a..5bcb2aa550 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -4,7 +4,7 @@ # # make upgrade # -build==1.2.2.post1 +build==1.2.2 # via pip-tools click==8.1.6 # via @@ -14,7 +14,7 @@ packaging==24.1 # via build pip-tools==7.4.1 # via -r requirements/pip-tools.in -pyproject-hooks==1.2.0 +pyproject-hooks==1.1.0 # via # build # pip-tools diff --git a/scripts/structures_pruning/requirements/base.txt b/scripts/structures_pruning/requirements/base.txt index a3fcacad2f..b80c660b87 100644 --- a/scripts/structures_pruning/requirements/base.txt +++ b/scripts/structures_pruning/requirements/base.txt @@ -11,7 +11,7 @@ click==8.1.6 # click-log click-log==0.4.0 # via -r scripts/structures_pruning/requirements/base.in -dnspython==2.7.0 +dnspython==2.6.1 # via pymongo edx-opaque-keys==2.11.0 # via -r scripts/structures_pruning/requirements/base.in diff --git a/scripts/structures_pruning/requirements/testing.txt b/scripts/structures_pruning/requirements/testing.txt index 94c6ac6982..8be2e15973 100644 --- a/scripts/structures_pruning/requirements/testing.txt +++ b/scripts/structures_pruning/requirements/testing.txt @@ -12,7 +12,7 @@ click-log==0.4.0 # via -r scripts/structures_pruning/requirements/base.txt ddt==1.7.2 # via -r scripts/structures_pruning/requirements/testing.in -dnspython==2.7.0 +dnspython==2.6.1 # via # -r scripts/structures_pruning/requirements/base.txt # pymongo diff --git a/scripts/user_retirement/requirements/base.txt b/scripts/user_retirement/requirements/base.txt index 576fa342c3..9f57da73d0 100644 --- a/scripts/user_retirement/requirements/base.txt +++ b/scripts/user_retirement/requirements/base.txt @@ -10,9 +10,9 @@ attrs==24.2.0 # via zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.in -boto3==1.35.37 +boto3==1.35.27 # via -r scripts/user_retirement/requirements/base.in -botocore==1.35.37 +botocore==1.35.27 # via # boto3 # s3transfer @@ -46,13 +46,13 @@ django-crum==0.7.9 # via edx-django-utils django-waffle==4.1.0 # via edx-django-utils -edx-django-utils==6.0.0 +edx-django-utils==5.16.0 # via edx-rest-api-client edx-rest-api-client==6.0.0 # via -r scripts/user_retirement/requirements/base.in -google-api-core==2.21.0 +google-api-core==2.20.0 # via google-api-python-client -google-api-python-client==2.149.0 +google-api-python-client==2.147.0 # via -r scripts/user_retirement/requirements/base.in google-auth==2.35.0 # via @@ -69,7 +69,7 @@ httplib2==0.22.0 # google-auth-httplib2 idna==3.10 # via requests -isodate==0.7.2 +isodate==0.6.1 # via zeep jenkinsapi==0.3.13 # via -r scripts/user_retirement/requirements/base.in @@ -77,11 +77,13 @@ jmespath==1.0.1 # via # boto3 # botocore -lxml==5.3.0 - # via zeep +lxml==4.9.4 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # zeep more-itertools==10.5.0 # via simple-salesforce -newrelic==10.0.0 +newrelic==9.13.0 # via edx-django-utils pbr==6.1.0 # via stevedore @@ -136,7 +138,7 @@ requests-toolbelt==1.0.0 # via zeep rsa==4.9 # via google-auth -s3transfer==0.10.3 +s3transfer==0.10.2 # via boto3 simple-salesforce==1.12.6 # via -r scripts/user_retirement/requirements/base.in @@ -144,6 +146,7 @@ simplejson==3.19.3 # via -r scripts/user_retirement/requirements/base.in six==1.16.0 # via + # isodate # jenkinsapi # python-dateutil sqlparse==0.5.1 diff --git a/scripts/user_retirement/requirements/testing.txt b/scripts/user_retirement/requirements/testing.txt index 6a165d7356..d5aac1cd06 100644 --- a/scripts/user_retirement/requirements/testing.txt +++ b/scripts/user_retirement/requirements/testing.txt @@ -14,11 +14,11 @@ attrs==24.2.0 # zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.txt -boto3==1.35.37 +boto3==1.35.27 # via # -r scripts/user_retirement/requirements/base.txt # moto -botocore==1.35.37 +botocore==1.35.27 # via # -r scripts/user_retirement/requirements/base.txt # boto3 @@ -66,17 +66,17 @@ django-waffle==4.1.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils -edx-django-utils==6.0.0 +edx-django-utils==5.16.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-rest-api-client edx-rest-api-client==6.0.0 # via -r scripts/user_retirement/requirements/base.txt -google-api-core==2.21.0 +google-api-core==2.20.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-python-client -google-api-python-client==2.149.0 +google-api-python-client==2.147.0 # via -r scripts/user_retirement/requirements/base.txt google-auth==2.35.0 # via @@ -103,7 +103,7 @@ idna==3.10 # requests iniconfig==2.0.0 # via pytest -isodate==0.7.2 +isodate==0.6.1 # via # -r scripts/user_retirement/requirements/base.txt # zeep @@ -116,11 +116,11 @@ jmespath==1.0.1 # -r scripts/user_retirement/requirements/base.txt # boto3 # botocore -lxml==5.3.0 +lxml==4.9.4 # via # -r scripts/user_retirement/requirements/base.txt # zeep -markupsafe==3.0.1 +markupsafe==2.1.5 # via # jinja2 # werkzeug @@ -132,7 +132,7 @@ more-itertools==10.5.0 # simple-salesforce moto==4.2.14 # via -r scripts/user_retirement/requirements/testing.in -newrelic==10.0.0 +newrelic==9.13.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils @@ -235,7 +235,7 @@ rsa==4.9 # via # -r scripts/user_retirement/requirements/base.txt # google-auth -s3transfer==0.10.3 +s3transfer==0.10.2 # via # -r scripts/user_retirement/requirements/base.txt # boto3 @@ -246,6 +246,7 @@ simplejson==3.19.3 six==1.16.0 # via # -r scripts/user_retirement/requirements/base.txt + # isodate # jenkinsapi # python-dateutil sqlparse==0.5.1 @@ -274,7 +275,7 @@ urllib3==1.26.20 # responses werkzeug==3.0.4 # via moto -xmltodict==0.14.1 +xmltodict==0.13.0 # via moto zeep==4.2.1 # via From 96c682a25b1a191874ee77a3ab91bdb554508769 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Thu, 10 Oct 2024 16:21:17 -0400 Subject: [PATCH 11/32] Revert "feat: Use jammy repositories for mongo installation." This reverts commit a245dec4f4ff431b336832174f53421a5a1b987c. --- .github/workflows/unit-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 900489256a..5fef1c8352 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -94,7 +94,7 @@ jobs: run: | if [[ "${{ matrix.mongo-version }}" != "4.4" ]]; then wget -qO - https://www.mongodb.org/static/pgp/server-${{ matrix.mongo-version }}.asc | sudo apt-key add - - echo "deb https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/${{ matrix.mongo-version }} multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-${{ matrix.mongo-version }}.list + echo "deb https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/${{ matrix.mongo-version }} multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-${{ matrix.mongo-version }}.list sudo apt-get update && sudo apt-get install -y mongodb-org="${{ matrix.mongo-version }}.*" fi From 8ee942e411ae84ca010bb7226e85dd2eadfef9d6 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Thu, 10 Oct 2024 16:36:02 -0400 Subject: [PATCH 12/32] fix: Pin select jobs to ubuntu 22.04. Using Ubuntu 24.04 breaks Mongo installation and some thing involving lxml/xmlsec. We are going to pin this until we're ready to upgrade both. --- .github/workflows/ci-static-analysis.yml | 2 +- .github/workflows/migrations-check.yml | 4 ++-- .github/workflows/pylint-checks.yml | 4 ++-- .github/workflows/quality-checks.yml | 2 +- .github/workflows/static-assets-check.yml | 2 +- .github/workflows/unit-tests.yml | 12 ++++++------ 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci-static-analysis.yml b/.github/workflows/ci-static-analysis.yml index a3b0527aad..458e00fc6b 100644 --- a/.github/workflows/ci-static-analysis.yml +++ b/.github/workflows/ci-static-analysis.yml @@ -10,7 +10,7 @@ jobs: matrix: python-version: - "3.11" - os: ["ubuntu-latest"] + os: ["ubuntu-22.04"] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/migrations-check.yml b/.github/workflows/migrations-check.yml index f253d48e4f..624caddd53 100644 --- a/.github/workflows/migrations-check.yml +++ b/.github/workflows/migrations-check.yml @@ -13,7 +13,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest] + os: [ubuntu-22.04] python-version: - "3.11" # 'pinned' is used to install the latest patch version of Django @@ -126,7 +126,7 @@ jobs: if: always() needs: - check_migrations - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Decide whether the needed jobs succeeded or failed # uses: re-actors/alls-green@v1.2.1 diff --git a/.github/workflows/pylint-checks.yml b/.github/workflows/pylint-checks.yml index 144cc77a3d..ad3aad3887 100644 --- a/.github/workflows/pylint-checks.yml +++ b/.github/workflows/pylint-checks.yml @@ -8,7 +8,7 @@ on: jobs: run-pylint: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: @@ -75,7 +75,7 @@ jobs: if: always() needs: - run-pylint - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Decide whether the needed jobs succeeded or failed # uses: re-actors/alls-green@v1.2.1 diff --git a/.github/workflows/quality-checks.yml b/.github/workflows/quality-checks.yml index 5445d70e3b..8461012349 100644 --- a/.github/workflows/quality-checks.yml +++ b/.github/workflows/quality-checks.yml @@ -13,7 +13,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest] + os: [ubuntu-22.04] python-version: - "3.11" node-version: [20] diff --git a/.github/workflows/static-assets-check.yml b/.github/workflows/static-assets-check.yml index 0a417f9b1c..4fe66e2a77 100644 --- a/.github/workflows/static-assets-check.yml +++ b/.github/workflows/static-assets-check.yml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest] + os: [ubuntu-22.04] python-version: - "3.11" node-version: [18, 20] diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 5fef1c8352..854677b93c 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -15,7 +15,7 @@ concurrency: jobs: run-tests: name: ${{ matrix.shard_name }}(py=${{ matrix.python-version }},dj=${{ matrix.django-version }},mongo=${{ matrix.mongo-version }}) - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 strategy: matrix: python-version: @@ -164,7 +164,7 @@ jobs: overwrite: true collect-and-verify: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Setup Python @@ -229,7 +229,7 @@ jobs: # https://github.com/orgs/community/discussions/33579 success: name: Unit tests successful - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: always() needs: [run-tests] steps: @@ -240,7 +240,7 @@ jobs: jobs: ${{ toJSON(needs) }} compile-warnings-report: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: [run-tests] steps: - uses: actions/checkout@v4 @@ -268,7 +268,7 @@ jobs: overwrite: true merge-artifacts: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: [compile-warnings-report] steps: - name: Merge Pytest Warnings JSON Artifacts @@ -288,7 +288,7 @@ jobs: # Combine and upload coverage reports. coverage: if: (github.repository == 'edx/edx-platform-private') || (github.repository == 'openedx/edx-platform' && (startsWith(github.base_ref, 'open-release') == false)) - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: [run-tests] strategy: matrix: From 0cc9dee4e3c94768f753bf859070675480ed1887 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Fri, 11 Oct 2024 10:09:09 -0400 Subject: [PATCH 13/32] Revert "fix(deps): update dependency @edx/frontend-component-cookie-policy-banner to v2.6.0" This reverts commit a39367b11a4880e124c1cd384b5c486484519414. --- package-lock.json | 1094 +++------------------------------------------ package.json | 2 +- 2 files changed, 72 insertions(+), 1024 deletions(-) diff --git a/package-lock.json b/package-lock.json index 063a004ed8..82a6611d3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@edx/brand-edx.org": "^2.0.7", "@edx/edx-bootstrap": "1.0.4", "@edx/edx-proctoring": "^4.18.1", - "@edx/frontend-component-cookie-policy-banner": "2.6.0", + "@edx/frontend-component-cookie-policy-banner": "2.2.0", "@edx/paragon": "2.6.4", "@edx/studio-frontend": "^2.1.0", "babel-loader": "^9.1.3", @@ -1883,25 +1883,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.7.tgz", - "integrity": "sha512-gMmIEhg35sXk9Te5qbGp3W9YKrvLt3HV658/d3odWrHSqT0JeG5OzsJWFHRLiOohRyjRsJc/x03DhJm3i8VJxg==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, "node_modules/@babel/runtime/node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -2125,16 +2106,14 @@ } }, "node_modules/@edx/frontend-component-cookie-policy-banner": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@edx/frontend-component-cookie-policy-banner/-/frontend-component-cookie-policy-banner-2.6.0.tgz", - "integrity": "sha512-Em/7v41BtVJsHWyaxGOgefif3YOe2Bw8rDZO6Rci40Mcx035Q7L0IlyG3Sxz+GKQIoSOJDYf+EfODS5i01AJOg==", - "license": "AGPL-3.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@edx/frontend-component-cookie-policy-banner/-/frontend-component-cookie-policy-banner-2.2.0.tgz", + "integrity": "sha512-Ye5tL8dU1v77Vtva9QkrgNG0I50sR317OK51/aQwHn50Aoq45FML29dbP8E5dy36QSqvF99bNFA4rptLigiTGQ==", "dependencies": { "@edx/brand-edx.org": "2.0.3", - "@openedx/paragon": "^21.13.1", + "@edx/paragon": "^12.0.5", "babel-preset-minify": "^0.5.0", "classnames": "^2.3.1", - "identity-obj-proxy": "^3.0.0", "prop-types": "^15.6.1", "type-fest": "^2.14.0", "universal-cookie": "^4.0.0" @@ -2147,83 +2126,36 @@ "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/@edx/brand-edx.org": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@edx/brand-edx.org/-/brand-edx.org-2.0.3.tgz", - "integrity": "sha512-QRmq2su1Xy+9GhY3NRZ+WdjtYWHmgfuKbVCW2skxgfgW9Q6kea8L6LrgigfrZtW+kQq/KdX2tVJcYBkB9xALtQ==", - "license": "UNLICENSED" + "integrity": "sha512-QRmq2su1Xy+9GhY3NRZ+WdjtYWHmgfuKbVCW2skxgfgW9Q6kea8L6LrgigfrZtW+kQq/KdX2tVJcYBkB9xALtQ==" }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/@openedx/paragon": { - "version": "21.13.1", - "resolved": "https://registry.npmjs.org/@openedx/paragon/-/paragon-21.13.1.tgz", - "integrity": "sha512-sLL+Z3ZWIRM6x+OrKZV0S7/SQpEcSeRcDm7E3FzhsnAWudsJCTELvSW+84uy/8dwV7mJhttsBPqQEtNafbCyYA==", - "license": "Apache-2.0", - "workspaces": [ - "example", - "component-generator", - "www", - "icons", - "dependent-usage-analyzer" - ], + "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/@edx/paragon": { + "version": "12.8.0", + "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-12.8.0.tgz", + "integrity": "sha512-gJVnozu4V1e2PCI0lFICvnrs2yi0ZzcaO5gJB9OjB1Pzf5GXpkKNWLtdTwjgp4fvzL9w4sqvyB30apbQzWW8yw==", "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.1.1", - "@fortawesome/react-fontawesome": "^0.1.18", - "@popperjs/core": "^2.11.4", - "bootstrap": "^4.6.2", - "chalk": "^4.1.2", - "child_process": "^1.0.2", - "classnames": "^2.3.1", + "@fortawesome/fontawesome-svg-core": "^1.2.30", + "@fortawesome/free-solid-svg-icons": "^5.14.0", + "@fortawesome/react-fontawesome": "^0.1.11", + "airbnb-prop-types": "^2.12.0", + "bootstrap": "^4.4.1", + "classnames": "^2.2.6", "email-prop-type": "^3.0.0", - "file-selector": "^0.6.0", "font-awesome": "^4.7.0", - "glob": "^8.0.3", - "inquirer": "^8.2.5", - "lodash.uniqby": "^4.7.0", - "mailto-link": "^2.0.0", - "prop-types": "^15.8.1", - "react-bootstrap": "^1.6.5", - "react-colorful": "^5.6.1", - "react-dropzone": "^14.2.1", - "react-focus-on": "^3.5.4", - "react-imask": "^7.1.3", - "react-loading-skeleton": "^3.1.0", - "react-popper": "^2.2.5", + "mailto-link": "^1.0.0", + "prop-types": "^15.7.2", + "react-bootstrap": "^1.2.2", + "react-focus-on": "^3.5.0", "react-proptype-conditional-require": "^1.0.4", - "react-responsive": "^8.2.0", - "react-table": "^7.7.0", - "react-transition-group": "^4.4.2", - "tabbable": "^5.3.3", - "uncontrollable": "^7.2.1", - "uuid": "^9.0.0" - }, - "bin": { - "paragon": "bin/paragon-scripts.js" + "react-responsive": "^6.1.1", + "react-table": "^7.6.1", + "react-transition-group": "^4.0.0", + "sanitize-html": "^1.20.0", + "tabbable": "^4.0.0" }, "peerDependencies": { - "react": "^16.8.6 || ^17.0.0", - "react-dom": "^16.8.6 || ^17.0.0", - "react-intl": "^5.25.1 || ^6.4.0" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/attr-accept": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.4.tgz", - "integrity": "sha512-2pA6xFIbdTUDCAwjN8nQwI+842VwzbDUXO2IYlpPXQIORgKnavorcr4Ce3rwh+zsNg9zK7QPsdvDj3Lum4WX4w==", - "license": "MIT", - "engines": { - "node": ">=4" + "prop-types": "^15.7.2", + "react": "^16.8.6", + "react-dom": "^16.8.6" } }, "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/bootstrap": { @@ -2240,81 +2172,15 @@ "url": "https://opencollective.com/bootstrap" } ], - "license": "MIT", "peerDependencies": { "jquery": "1.9.1 - 3", "popper.js": "^1.16.1" } }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -2324,206 +2190,24 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/email-prop-type/-/email-prop-type-3.0.1.tgz", "integrity": "sha512-tONZGMEOOkadp5OBftuVXU8DsceWmINxYK+pqPFB4LT5ODjrPX/esel3WGqbV7d6in5/MnZE4n4QcqOr4gh7dg==", - "license": "MIT", "dependencies": { "email-validator": "^2.0.4" } }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/intl-messageformat": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.6.0.tgz", - "integrity": "sha512-AYKl/DY1nl75pJU8EK681JOVL40uQTNJe3yEMXKfydDFoz+5hNrM/PqjchueSMKGKCZKBVgeexqZwy3uC2B36Q==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "2.1.0", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.9", - "tslib": "^2.4.0" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/mailto-link": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mailto-link/-/mailto-link-2.0.0.tgz", - "integrity": "sha512-b5FErkZ4t6mpH1IFZSw7Mm2IQHXQ2R0/5Q4xd7Rv8dVkWvE54mFG/UW7HjfFazXFjXTNsM+dSX2tTeIDrV9K9A==", - "license": "MIT", - "dependencies": { - "assert-ok": "~1.0.0", - "cast-array": "~1.0.1", - "object-filter": "~1.0.2", - "query-string": "~7.0.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "license": "ISC" - }, "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/query-string": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.1.tgz", - "integrity": "sha512-uIw3iRvHnk9to1blJCG3BTc+Ro56CBowJXKmNNAm3RulvPBzWLRqKSiiDk+IplJhsydwtuNMHi8UGQFcCLVfkA==", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/react-dropzone": { - "version": "14.2.9", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.9.tgz", - "integrity": "sha512-jRZsMC7h48WONsOLHcmhyn3cRWJoIPQjPApvt/sJVfnYaB3Qltn025AoRTTJaj4WdmmgmLl6tUQg1s0wOhpodQ==", - "license": "MIT", - "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "react": ">= 16.8 || 18.0.0" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/react-intl": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.7.2.tgz", - "integrity": "sha512-v/lvAORTE70welhzqoIi1YI1yHvGE4/QX4W3JYNZoqRxH8ab8Q/Ed4Zem/ZVPZJN4byQ52U+2GESLy0zvY6IBw==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "2.1.0", - "@formatjs/icu-messageformat-parser": "2.7.9", - "@formatjs/intl": "2.10.7", - "@formatjs/intl-displaynames": "6.6.9", - "@formatjs/intl-listformat": "7.5.8", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/react": "16 || 17 || 18", - "hoist-non-react-statics": "^3.3.2", - "intl-messageformat": "10.6.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "react": "^16.6.0 || 17 || 18", - "typescript": "^4.7 || 5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -2535,62 +2219,6 @@ "react-dom": ">=16.6.0" } }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@edx/frontend-component-cookie-policy-banner/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@edx/mockprock": { "version": "1.0.2", "resolved": "git+ssh://git@github.com/openedx/mockprock.git#3ad18c6888e6521e9bf7a4df0db6f8579b928235", @@ -3510,139 +3138,35 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.1.0.tgz", - "integrity": "sha512-SE2V2PE03K9U/YQZ3nxEOysRkQ/CfSwLHR789Uk9N0PTiWT6I+17UTDI97zYEwC1mbnjefqmtjbL8nunjPwGjw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/fast-memoize": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", - "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.9", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.9.tgz", - "integrity": "sha512-9Z5buDRMsTbplXknvRlDmnpWhZrayNVcVvkH0+SSz8Ll4XD/7Tcn8m1IjxM3iBJSwQbxwxb7/g0Fkx3d4j2osw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "2.1.0", - "@formatjs/icu-skeleton-parser": "1.8.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.3.tgz", - "integrity": "sha512-TsKAP013ayZFbWWR2KWy+f9QVZh0yDFTPK3yE4OqU2gnzafvmKTodRtJLVpfZmpXWJ5y7BWD1AsyT14mcbLzig==", - "license": "MIT", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "2.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl": { - "version": "2.10.7", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.10.7.tgz", - "integrity": "sha512-26rNxo2nwQbbsVkV54ngml9XIA7bBzfQmELG6FFFF8eKzqzFrLKZzF8JBoBpPHgML4HKEUbGCQaBaARpKCN/sw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "2.1.0", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.9", - "@formatjs/intl-displaynames": "6.6.9", - "@formatjs/intl-listformat": "7.5.8", - "intl-messageformat": "10.6.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "typescript": "^4.7 || 5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@formatjs/intl-displaynames": { - "version": "6.6.9", - "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.6.9.tgz", - "integrity": "sha512-2hmS+YJwiXB1deNYXO2/pY7Zv4QUrZHghZxkcnWxBLEODk990h9cNbkjNg/u/RaDeCRkKVrZ3ERTdBcgkTvn2Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "2.1.0", - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl-listformat": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.5.8.tgz", - "integrity": "sha512-WzMiw6nA2uP0ZqbbuPs7tQ+gmYRTbE20lwur4QcKp5K5cgPhkCzRAhovkDFLhrc885c3p7Wjigx8kyg0hypmZw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "2.1.0", - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", - "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl/node_modules/intl-messageformat": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.6.0.tgz", - "integrity": "sha512-AYKl/DY1nl75pJU8EK681JOVL40uQTNJe3yEMXKfydDFoz+5hNrM/PqjchueSMKGKCZKBVgeexqZwy3uC2B36Q==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "2.1.0", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.9", - "tslib": "^2.4.0" + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz", - "integrity": "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==", - "license": "MIT", + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.6.0" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, - "node_modules/@fortawesome/fontawesome-svg-core/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", - "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", - "license": "MIT", + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, "engines": { "node": ">=6" } @@ -4713,17 +4237,6 @@ "@types/node": "*" } }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, "node_modules/@types/invariant": { "version": "2.2.37", "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.37.tgz", @@ -5307,6 +4820,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -5321,6 +4835,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "engines": { "node": ">=10" }, @@ -6609,26 +6124,6 @@ "node": ">= 0.6.0" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/base64id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", @@ -6692,31 +6187,6 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/blob": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", @@ -6853,30 +6323,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", @@ -7217,12 +6663,6 @@ "node": ">=10" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "license": "MIT" - }, "node_modules/cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", @@ -7261,12 +6701,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==", - "license": "ISC" - }, "node_modules/chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -7608,18 +7042,6 @@ "node": ">=0.10.0" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", @@ -8001,17 +7423,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-pure": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", - "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -8449,6 +7860,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, "engines": { "node": ">=0.10" } @@ -8495,18 +7907,6 @@ "node": ">=0.10.0" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -10585,32 +9985,6 @@ "node": ">=0.10.0" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -10827,18 +10201,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/file-selector": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", - "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -10904,15 +10266,6 @@ "node": ">=0.10" } }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -11713,12 +11066,6 @@ "node": ">=6" } }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", - "license": "(Apache-2.0 OR MPL-1.1)" - }, "node_modules/has": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", @@ -12144,38 +11491,6 @@ "node": ">=4.0.0" } }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "license": "MIT", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -12185,18 +11500,6 @@ "node": ">= 4" } }, - "node_modules/imask": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/imask/-/imask-7.6.1.tgz", - "integrity": "sha512-sJlIFM7eathUEMChTh9Mrfw/IgiWgJqBKq2VNbyXvBZ7ev/IlO6/KQTKlV/Fm+viQMLrFLG/zCuudrLIwgK2dg==", - "license": "MIT", - "dependencies": { - "@babel/runtime-corejs3": "^7.24.4" - }, - "engines": { - "npm": ">=4.0.0" - } - }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -12843,15 +12146,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -13104,18 +12398,6 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -16875,12 +16157,6 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "license": "MIT" - }, "node_modules/log-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", @@ -17324,6 +16600,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } @@ -18418,6 +17695,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -18480,140 +17758,6 @@ "node": ">=0.4.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -18627,6 +17771,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -20553,16 +19698,6 @@ "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-colorful": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, "node_modules/react-dom": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", @@ -20604,12 +19739,6 @@ "resolved": "https://registry.npmjs.org/react-element-proptypes/-/react-element-proptypes-1.0.0.tgz", "integrity": "sha512-unJTkc58D9n1xTXKA8swrwrbDQAsCF/13oT6fDYtBVHPvFxITFuI20HCMNbNzI7tTUzsYmJ3iqjskwfLJkOUFA==" }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, "node_modules/react-focus-lock": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-1.19.1.tgz", @@ -20703,33 +19832,6 @@ } } }, - "node_modules/react-imask": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/react-imask/-/react-imask-7.6.1.tgz", - "integrity": "sha512-vLNfzcCz62Yzx/GRGh5tiCph9Gbh2cZu+Tz8OiO5it2eNuuhpA0DWhhSlOtVtSJ80+Bx+vFK5De8eQ9AmbkXzA==", - "license": "MIT", - "dependencies": { - "imask": "^7.6.1", - "prop-types": "^15.8.1" - }, - "engines": { - "npm": ">=4.0.0" - }, - "peerDependencies": { - "react": ">=0.14.0" - } - }, - "node_modules/react-imask/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, "node_modules/react-intl": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-2.9.0.tgz", @@ -20767,15 +19869,6 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "node_modules/react-loading-skeleton": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz", - "integrity": "sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, "node_modules/react-overlays": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", @@ -20814,21 +19907,6 @@ "react-is": "^16.13.1" } }, - "node_modules/react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "license": "MIT", - "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, "node_modules/react-proptype-conditional-require": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/react-proptype-conditional-require/-/react-proptype-conditional-require-1.0.4.tgz", @@ -20902,21 +19980,19 @@ } }, "node_modules/react-responsive": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", - "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", - "license": "MIT", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-6.1.2.tgz", + "integrity": "sha512-AXentVC/kN3KED9zhzJv2pu4vZ0i6cSHdTtbCScVV1MT6F5KXaG2qs5D7WLmhdaOvmiMX8UfmS4ZSO+WPwDt4g==", "dependencies": { "hyphenate-style-name": "^1.0.0", "matchmediaquery": "^0.3.0", - "prop-types": "^15.6.1", - "shallow-equal": "^1.1.0" + "prop-types": "^15.6.1" }, "engines": { "node": ">= 0.10" }, "peerDependencies": { - "react": ">=16.8.0" + "react": "^16.3.0" } }, "node_modules/react-responsive/node_modules/prop-types": { @@ -22193,15 +21269,6 @@ "integrity": "sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==", "dev": true }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -23209,12 +22276,6 @@ "node": ">=8" } }, - "node_modules/shallow-equal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -23273,7 +22334,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-html-tokenizer": { "version": "0.1.1", @@ -23775,15 +22837,6 @@ "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -24665,10 +23718,9 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/tabbable": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", - "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==", - "license": "MIT" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-4.0.0.tgz", + "integrity": "sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ==" }, "node_modules/table": { "version": "6.8.2", @@ -24933,7 +23985,8 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "node_modules/through2": { "version": "3.0.2", @@ -26048,15 +25101,6 @@ "node": ">=10.13.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -26483,6 +25527,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -26543,6 +25588,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -26557,6 +25603,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -26567,7 +25614,8 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/wrappy": { "version": "1.0.2", diff --git a/package.json b/package.json index 6173420ab0..1f48500e6e 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@edx/brand-edx.org": "^2.0.7", "@edx/edx-bootstrap": "1.0.4", "@edx/edx-proctoring": "^4.18.1", - "@edx/frontend-component-cookie-policy-banner": "2.6.0", + "@edx/frontend-component-cookie-policy-banner": "2.2.0", "@edx/paragon": "2.6.4", "@edx/studio-frontend": "^2.1.0", "babel-loader": "^9.1.3", From b8c79abd2c8a7951cd374a14dded60187258d297 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:05:01 -0600 Subject: [PATCH 14/32] feat: Upgrade Python dependency edx-enterprise (#35625) Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master` Co-authored-by: kiram15 <31229189+kiram15@users.noreply.github.com> --- requirements/constraints.txt | 2 +- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index dd727a4b18..6fb109d62f 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -82,7 +82,7 @@ django-storages<1.14.4 # The team that owns this package will manually bump this package rather than having it pulled in automatically. # This is to allow them to better control its deployment and to do it in a process that works better # for them. -edx-enterprise==4.27.2 +edx-enterprise==4.27.3 # Date: 2024-05-09 # This has to be constrained as well because newer versions of edx-i18n-tools need the diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 55793bd0c5..b92ad29f8a 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -467,7 +467,7 @@ edx-drf-extensions==10.4.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.27.2 +edx-enterprise==4.27.3 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 1bdd373651..a5713bc3dd 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -741,7 +741,7 @@ edx-drf-extensions==10.4.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.27.2 +edx-enterprise==4.27.3 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 6f12d80467..57f36577a5 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -547,7 +547,7 @@ edx-drf-extensions==10.4.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.27.2 +edx-enterprise==4.27.3 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index d3b14a6f43..4f26caa958 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -571,7 +571,7 @@ edx-drf-extensions==10.4.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.27.2 +edx-enterprise==4.27.3 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt From 5b809673b6162a1962ab7f9ca11ec9219e422d92 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Fri, 11 Oct 2024 10:23:32 -0700 Subject: [PATCH 15/32] refactor: get rid of XBlockRuntimeSystem for v2 libraries (#35624) --- openedx/core/djangoapps/xblock/api.py | 32 ++---- openedx/core/djangoapps/xblock/apps.py | 12 +-- .../xblock/runtime/learning_core_runtime.py | 6 +- .../core/djangoapps/xblock/runtime/runtime.py | 101 +++++------------- 4 files changed, 45 insertions(+), 106 deletions(-) diff --git a/openedx/core/djangoapps/xblock/api.py b/openedx/core/djangoapps/xblock/api.py index 43ec3909bc..dbb7c82467 100644 --- a/openedx/core/djangoapps/xblock/api.py +++ b/openedx/core/djangoapps/xblock/api.py @@ -25,13 +25,13 @@ from xblock.core import XBlock from xblock.exceptions import NoSuchUsage, NoSuchViewError from xblock.plugin import PluginMissingError +from openedx.core.types import User as UserType from openedx.core.djangoapps.xblock.apps import get_xblock_app_config from openedx.core.djangoapps.xblock.learning_context.manager import get_learning_context_impl from openedx.core.djangoapps.xblock.runtime.learning_core_runtime import ( LearningCoreFieldData, LearningCoreXBlockRuntime, ) -from openedx.core.djangoapps.xblock.runtime.runtime import XBlockRuntimeSystem as _XBlockRuntimeSystem from .utils import get_secure_token_for_xblock_handler, get_xblock_id_for_anonymous_user from .runtime.learning_core_runtime import LearningCoreXBlockRuntime @@ -54,33 +54,21 @@ class CheckPerm(Enum): CAN_EDIT = 3 -def get_runtime_system(): +def get_runtime(user: UserType): """ - Return a new XBlockRuntimeSystem. + Return a new XBlockRuntime. - TODO: Refactor to get rid of the XBlockRuntimeSystem entirely and just - create the LearningCoreXBlockRuntime and return it. We used to want to keep - around a long lived runtime system (a factory that returns runtimes) for - caching purposes, and have it dynamically construct a runtime on request. - Now we're just re-constructing both the system and the runtime in this call - and returning it every time, because: - - 1. We no longer have slow, Blockstore-style definitions to cache, so the - performance of this is perfectly acceptable. - 2. Having a singleton increases complexity and the chance of bugs. - 3. Creating the XBlockRuntimeSystem every time only takes about 10-30 µs. - - Given that, the extra XBlockRuntimeSystem class just adds confusion. But - despite that, it's tested, working code, and so I'm putting off refactoring - for now. + Each XBlockRuntime is bound to one user (and usually one request or one + celery task). It is typically used just to load and render a single block, + but the API _does_ allow a single runtime instance to load multiple blocks + (as long as they're for the same user). """ - params = get_xblock_app_config().get_runtime_system_params() + params = get_xblock_app_config().get_runtime_params() params.update( - runtime_class=LearningCoreXBlockRuntime, handler_url=get_handler_url, authored_data_store=LearningCoreFieldData(), ) - runtime = _XBlockRuntimeSystem(**params) + runtime = LearningCoreXBlockRuntime(user, **params) return runtime @@ -121,7 +109,7 @@ def load_block(usage_key, user, *, check_permission: CheckPerm | None = CheckPer # e.g. a course might specify that all 'problem' XBlocks have 'max_attempts' # set to 3. # field_overrides = context_impl.get_field_overrides(usage_key) - runtime = get_runtime_system().get_runtime(user=user) + runtime = get_runtime(user=user) try: return runtime.get_block(usage_key) diff --git a/openedx/core/djangoapps/xblock/apps.py b/openedx/core/djangoapps/xblock/apps.py index 5ba2361322..848470a3a9 100644 --- a/openedx/core/djangoapps/xblock/apps.py +++ b/openedx/core/djangoapps/xblock/apps.py @@ -16,9 +16,9 @@ class XBlockAppConfig(AppConfig): verbose_name = 'New XBlock Runtime' label = 'xblock_new' # The name 'xblock' is already taken by ORA2's 'openassessment.xblock' app :/ - def get_runtime_system_params(self): + def get_runtime_params(self): """ - Get the XBlockRuntimeSystem parameters appropriate for viewing and/or + Get the LearningCoreXBlockRuntime parameters appropriate for viewing and/or editing XBlock content. """ raise NotImplementedError @@ -43,9 +43,9 @@ class LmsXBlockAppConfig(XBlockAppConfig): LMS-specific configuration of the XBlock Runtime django app. """ - def get_runtime_system_params(self): + def get_runtime_params(self): """ - Get the XBlockRuntimeSystem parameters appropriate for viewing and/or + Get the LearningCoreXBlockRuntime parameters appropriate for viewing and/or editing XBlock content in the LMS """ return dict( @@ -65,9 +65,9 @@ class StudioXBlockAppConfig(XBlockAppConfig): Studio-specific configuration of the XBlock Runtime django app. """ - def get_runtime_system_params(self): + def get_runtime_params(self): """ - Get the XBlockRuntimeSystem parameters appropriate for viewing and/or + Get the LearningCoreXBlockRuntime parameters appropriate for viewing and/or editing XBlock content in Studio """ return dict( diff --git a/openedx/core/djangoapps/xblock/runtime/learning_core_runtime.py b/openedx/core/djangoapps/xblock/runtime/learning_core_runtime.py index 26aa7af60f..41fd79f5a0 100644 --- a/openedx/core/djangoapps/xblock/runtime/learning_core_runtime.py +++ b/openedx/core/djangoapps/xblock/runtime/learning_core_runtime.py @@ -211,7 +211,7 @@ class LearningCoreXBlockRuntime(XBlockRuntime): # We've pre-loaded the fields for this block, so the FieldData shouldn't # consider these values "changed" in its sense of "you have to persist # these because we've altered the field values from what was stored". - self.system.authored_data_store.mark_unchanged(block) + self.authored_data_store.mark_unchanged(block) return block @@ -221,7 +221,7 @@ class LearningCoreXBlockRuntime(XBlockRuntime): This gets called by block.save() - do not call this directly. """ - if not self.system.authored_data_store.has_changes(block): + if not self.authored_data_store.has_changes(block): return # No changes, so no action needed. # Verify that the user has permission to write to authored data in this @@ -254,7 +254,7 @@ class LearningCoreXBlockRuntime(XBlockRuntime): }, created=now, ) - self.system.authored_data_store.mark_unchanged(block) + self.authored_data_store.mark_unchanged(block) def _get_component_from_usage_key(self, usage_key): """ diff --git a/openedx/core/djangoapps/xblock/runtime/runtime.py b/openedx/core/djangoapps/xblock/runtime/runtime.py index 5746af491d..fe633f686f 100644 --- a/openedx/core/djangoapps/xblock/runtime/runtime.py +++ b/openedx/core/djangoapps/xblock/runtime/runtime.py @@ -95,18 +95,30 @@ class XBlockRuntime(RuntimeShim, Runtime): # currently only used to track if we're in the studio_view (see below under service()) view_name: str | None - def __init__(self, system: XBlockRuntimeSystem, user: UserType | None): + def __init__( + self, + user: UserType | None, + *, + handler_url: Callable[[UsageKey, str, UserType | None], str], + student_data_mode: StudentDataMode, + id_reader: Optional[IdReader] = None, + authored_data_store: Optional[FieldData] = None, + ): super().__init__( - id_reader=system.id_reader, + id_reader=id_reader or OpaqueKeyReader(), mixins=( LmsBlockMixin, # Adds Non-deprecated LMS/Studio functionality XBlockShim, # Adds deprecated LMS/Studio functionality / backwards compatibility ), default_class=None, select=None, - id_generator=system.id_generator, + id_generator=MemoryIdManager(), # We don't really use id_generator until we need to support asides ) - self.system = system + assert student_data_mode in (StudentDataMode.Ephemeral, StudentDataMode.Persisted) + self.authored_data_store = authored_data_store + self.children_data_store = None + self.student_data_mode = student_data_mode + self.handler_url_fn = handler_url self.user = user # self.user_id must be set as a separate attribute since base class sets it: if self.user is None: @@ -126,7 +138,7 @@ class XBlockRuntime(RuntimeShim, Runtime): if thirdparty: log.warning("thirdparty handlers are not supported by this runtime for XBlock %s.", type(block)) - url = self.system.handler_url(block.scope_ids.usage_id, handler_name, self.user) + url = self.handler_url_fn(block.scope_ids.usage_id, handler_name, self.user) if suffix: if not url.endswith('/'): url += '/' @@ -275,7 +287,7 @@ class XBlockRuntime(RuntimeShim, Runtime): # the preview engine, and 'main' otherwise. # For backwards compatibility, we check the student_data_mode (Ephemeral indicates CMS) and the # view_name for 'studio_view.' self.view_name is set by render() below. - if self.system.student_data_mode == StudentDataMode.Ephemeral and self.view_name != 'studio_view': + if self.student_data_mode == StudentDataMode.Ephemeral and self.view_name != 'studio_view': return MakoService(namespace_prefix='lms.') return MakoService() elif service_name == "i18n": @@ -301,14 +313,12 @@ class XBlockRuntime(RuntimeShim, Runtime): return EventPublishingService(self.user, context_key, make_track_function()) elif service_name == 'enrollments': return EnrollmentsService() + elif service_name == 'error_tracker': + return make_error_tracker() - # Check if the XBlockRuntimeSystem wants to handle this: - service = self.system.get_service(block, service_name) # Otherwise, fall back to the base implementation which loads services # defined in the constructor: - if service is None: - service = super().service(block, service_name) - return service + return super().service(block, service_name) def _init_field_data_for_block(self, block: XBlock) -> FieldData: """ @@ -322,7 +332,7 @@ class XBlockRuntime(RuntimeShim, Runtime): assert isinstance(self.user_id, str) and self.user_id.startswith("anon") kvs = EphemeralKeyValueStore() student_data_store = KvsFieldData(kvs) - elif self.system.student_data_mode == StudentDataMode.Ephemeral: + elif self.student_data_mode == StudentDataMode.Ephemeral: # We're in an environment like Studio where we want to let the # author test blocks out but not permanently save their state. kvs = EphemeralKeyValueStore() @@ -341,10 +351,10 @@ class XBlockRuntime(RuntimeShim, Runtime): student_data_store = KvsFieldData(kvs=DjangoKeyValueStore(field_data_cache)) return SplitFieldData({ - Scope.content: self.system.authored_data_store, - Scope.settings: self.system.authored_data_store, - Scope.parent: self.system.authored_data_store, - Scope.children: self.system.children_data_store, + Scope.content: self.authored_data_store, + Scope.settings: self.authored_data_store, + Scope.parent: self.authored_data_store, + Scope.children: self.children_data_store, Scope.user_state_summary: student_data_store, Scope.user_state: student_data_store, Scope.user_info: student_data_store, @@ -407,62 +417,3 @@ class XBlockRuntime(RuntimeShim, Runtime): """ # Subclasses should override this return None - - -class XBlockRuntimeSystem: - """ - This class is essentially a factory for XBlockRuntimes. This is a - long-lived object which provides the behavior specific to the application - that wants to use XBlocks. Unlike XBlockRuntime, a single instance of this - class can be used with many different XBlocks, whereas each XBlock gets its - own instance of XBlockRuntime. - """ - def __init__( - self, - handler_url: Callable[[UsageKey, str, UserType | None], str], - student_data_mode: StudentDataMode, - runtime_class: type[XBlockRuntime], - id_reader: Optional[IdReader] = None, - authored_data_store: Optional[FieldData] = None, - ): - """ - args: - handler_url: A method to get URLs to call XBlock handlers. It must - implement this signature: - handler_url( - usage_key: UsageKey, - handler_name: str, - user: User | AnonymousUser | None - ) -> str - student_data_mode: Specifies whether student data should be kept - in a temporary in-memory store (e.g. Studio) or persisted - forever in the database. - runtime_class: What runtime to use, e.g. LearningCoreXBlockRuntime - """ - self.handler_url = handler_url - self.id_reader = id_reader or OpaqueKeyReader() - self.id_generator = MemoryIdManager() # We don't really use id_generator until we need to support asides - self.runtime_class = runtime_class - self.authored_data_store = authored_data_store - self.children_data_store = None - assert student_data_mode in (StudentDataMode.Ephemeral, StudentDataMode.Persisted) - self.student_data_mode = student_data_mode - - def get_runtime(self, user: UserType | None) -> XBlockRuntime: - """ - Get the XBlock runtime for the specified Django user. The user can be - a regular user, an AnonymousUser, or None. - """ - return self.runtime_class(self, user) - - def get_service(self, block, service_name: str): - """ - Get a runtime service - - Runtime services may come from this XBlockRuntimeSystem, - or if this method returns None, they may come from the - XBlockRuntime. - """ - if service_name == 'error_tracker': - return make_error_tracker() - return None # None means see if XBlockRuntime offers this service From e4c69565f451a63d6796773099ccd42c57ab187f Mon Sep 17 00:00:00 2001 From: Dima Alipov Date: Wed, 27 Mar 2024 17:02:51 +0200 Subject: [PATCH 16/32] feat: adaptive display of links Do not display the 'Learn more' and 'Share feedback' links for banner that is enabled by the context_course.discussions_settings flag if the URLs for these links are not set in the settings. --- cms/templates/course_outline.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cms/templates/course_outline.html b/cms/templates/course_outline.html index f44fdcfc80..61f524123b 100644 --- a/cms/templates/course_outline.html +++ b/cms/templates/course_outline.html @@ -76,14 +76,18 @@ from django.urls import reverse ${_("This course run is using an upgraded version of edx discussion forum. In order to display the discussions sidebar, discussions xBlocks will no longer be visible to learners.")}
+ %if settings.DISCUSSIONS_INCONTEXT_LEARNMORE_URL: ${_(" Learn more")} + %endif + %if settings.DISCUSSIONS_INCONTEXT_FEEDBACK_URL: ${_("Share feedback")} + %endif
From 319dd7f38c4b36bc0339d15dc188ffc1dcc8c8e7 Mon Sep 17 00:00:00 2001 From: Attiya Ishaque Date: Mon, 14 Oct 2024 13:12:38 +0500 Subject: [PATCH 17/32] feat: remove all the commerce coordinator (#35527) --- .../course_modes/tests/test_views.py | 44 ---------- common/djangoapps/course_modes/views.py | 3 +- lms/djangoapps/commerce/tests/test_utils.py | 23 ----- lms/djangoapps/commerce/utils.py | 87 ------------------- lms/djangoapps/commerce/waffle.py | 49 ----------- lms/envs/common.py | 7 -- .../course_modes/track_selection.html | 10 +-- 7 files changed, 6 insertions(+), 217 deletions(-) delete mode 100644 lms/djangoapps/commerce/waffle.py diff --git a/common/djangoapps/course_modes/tests/test_views.py b/common/djangoapps/course_modes/tests/test_views.py index f49d1bc23b..d7b0698653 100644 --- a/common/djangoapps/course_modes/tests/test_views.py +++ b/common/djangoapps/course_modes/tests/test_views.py @@ -149,50 +149,6 @@ class CourseModeViewTest(CatalogIntegrationMixin, UrlResetMixin, ModuleStoreTest self.assertRedirects(response, '/test_basket/add/?sku=TEST', fetch_redirect_response=False) ecomm_test_utils.update_commerce_config(enabled=False) - def test_verified_mode_response_contains_course_run_key(self): - # Create only the verified mode and enroll the user - CourseModeFactory.create( - mode_slug='verified', - course_id=self.course_that_started.id, - min_price=149, - sku="dummy" - ) - CourseEnrollmentFactory( - is_active=True, - course_id=self.course_that_started.id, - user=self.user - ) - - # Value Prop TODO (REV-2378): remove waffle flag from tests once the new Track Selection template is rolled out. - with override_waffle_flag(VALUE_PROP_TRACK_SELECTION_FLAG, active=True): - with patch(GATING_METHOD_NAME, return_value=True): - with patch(CDL_METHOD_NAME, return_value=True): - with patch("common.djangoapps.course_modes.views.EcommerceService.is_enabled", return_value=True): - url = reverse('course_modes_choose', args=[str(self.course_that_started.id)]) - response = self.client.get(url) - self.assertContains(response, "&course_run_key=") - self.assertContains(response, self.course_that_started.id) - - def test_response_without_verified_sku_does_not_contain_course_run_key(self): - CourseModeFactory.create( - mode_slug='verified', - course_id=self.course_that_started.id, - ) - CourseEnrollmentFactory( - is_active=True, - course_id=self.course_that_started.id, - user=self.user - ) - - # Value Prop TODO (REV-2378): remove waffle flag from tests once the new Track Selection template is rolled out. - with override_waffle_flag(VALUE_PROP_TRACK_SELECTION_FLAG, active=True): - with patch(GATING_METHOD_NAME, return_value=True): - with patch(CDL_METHOD_NAME, return_value=True): - with patch("common.djangoapps.course_modes.views.EcommerceService.is_enabled", return_value=True): - url = reverse('course_modes_choose', args=[str(self.course_that_started.id)]) - response = self.client.get(url) - self.assertNotContains(response, "&course_run_key=") - @httpretty.activate @ddt.data( '', diff --git a/common/djangoapps/course_modes/views.py b/common/djangoapps/course_modes/views.py index 821c59dc05..046767a26b 100644 --- a/common/djangoapps/course_modes/views.py +++ b/common/djangoapps/course_modes/views.py @@ -195,7 +195,6 @@ class ChooseModeView(View): "content_gating_enabled": gated_content, "course_duration_limit_enabled": CourseDurationLimitConfig.enabled_for_enrollment(request.user, course), "search_courses_url": urljoin(settings.MKTG_URLS.get('ROOT'), '/search?tab=course'), - "course_run_key": course_id, } context.update( get_experiment_user_metadata_context( @@ -241,7 +240,7 @@ class ChooseModeView(View): if verified_mode.sku: context["use_ecommerce_payment_flow"] = ecommerce_service.is_enabled(request.user) - context["ecommerce_payment_page"] = ecommerce_service.get_add_to_basket_url() + context["ecommerce_payment_page"] = ecommerce_service.payment_page_url() context["sku"] = verified_mode.sku context["bulk_sku"] = verified_mode.bulk_sku diff --git a/lms/djangoapps/commerce/tests/test_utils.py b/lms/djangoapps/commerce/tests/test_utils.py index 6c793433df..d5d0cf1f1c 100644 --- a/lms/djangoapps/commerce/tests/test_utils.py +++ b/lms/djangoapps/commerce/tests/test_utils.py @@ -11,7 +11,6 @@ from django.conf import settings from django.test import TestCase from django.test.client import RequestFactory from django.test.utils import override_settings -from edx_toggles.toggles.testutils import override_waffle_flag from opaque_keys.edx.locator import CourseLocator from waffle.testutils import override_switch @@ -21,7 +20,6 @@ from common.djangoapps.student.models import CourseEnrollment from common.djangoapps.student.tests.factories import TEST_PASSWORD, UserFactory from lms.djangoapps.commerce.models import CommerceConfiguration from lms.djangoapps.commerce.utils import EcommerceService, refund_entitlement, refund_seat -from lms.djangoapps.commerce.waffle import ENABLE_TRANSITION_TO_COORDINATOR_CHECKOUT from openedx.core.djangolib.testing.utils import skip_unless_lms from openedx.core.lib.log_utils import audit_log from xmodule.modulestore.tests.django_utils import \ @@ -186,27 +184,6 @@ class EcommerceServiceTests(TestCase): assert url == expected_url - @override_settings(COMMERCE_COORDINATOR_URL_ROOT='http://coordinator_url') - @override_settings(ECOMMERCE_PUBLIC_URL_ROOT='http://ecommerce_url') - @ddt.data( - {'coordinator_flag_active': True}, - {'coordinator_flag_active': False} - ) - @ddt.unpack - def test_get_add_to_basket_url(self, coordinator_flag_active): - with override_waffle_flag(ENABLE_TRANSITION_TO_COORDINATOR_CHECKOUT, active=coordinator_flag_active): - - ecommerce_service = EcommerceService() - result = ecommerce_service.get_add_to_basket_url() - - if coordinator_flag_active: - expected_url = 'http://coordinator_url/lms/payment_page_redirect/' - else: - expected_url = 'http://ecommerce_url/test_basket/add/' - - self.assertIsNotNone(result) - self.assertEqual(expected_url, result) - @ddt.ddt @skip_unless_lms diff --git a/lms/djangoapps/commerce/utils.py b/lms/djangoapps/commerce/utils.py index 617852b4f6..9abcabd4a9 100644 --- a/lms/djangoapps/commerce/utils.py +++ b/lms/djangoapps/commerce/utils.py @@ -13,7 +13,6 @@ from django.urls import reverse from django.utils.translation import gettext as _ from common.djangoapps.course_modes.models import CourseMode -from common.djangoapps.student.models import CourseEnrollmentAttribute from openedx.core.djangoapps.commerce.utils import ( get_ecommerce_api_base_url, get_ecommerce_api_client, @@ -23,10 +22,6 @@ from openedx.core.djangoapps.site_configuration import helpers as configuration_ from openedx.core.djangoapps.theming import helpers as theming_helpers from .models import CommerceConfiguration -from .waffle import ( # lint-amnesty, pylint: disable=invalid-django-waffle-import - should_redirect_to_commerce_coordinator_checkout, - should_redirect_to_commerce_coordinator_refunds, -) from edx_django_utils.plugins import pluggable_override log = logging.getLogger(__name__) @@ -110,15 +105,6 @@ class EcommerceService: """ return self.get_absolute_ecommerce_url(self.config.basket_checkout_page) - def get_add_to_basket_url(self): - """ Return the URL for the payment page based on the waffle switch. - Example: - http://localhost/enabled_service_api_path - """ - if should_redirect_to_commerce_coordinator_checkout(): - return urljoin(settings.COMMERCE_COORDINATOR_URL_ROOT, settings.COORDINATOR_CHECKOUT_REDIRECT_PATH) - return self.payment_page_url() - @pluggable_override('OVERRIDE_GET_CHECKOUT_PAGE_URL') def get_checkout_page_url(self, *skus, **kwargs): """ Construct the URL to the ecommerce checkout page and include products. @@ -261,10 +247,6 @@ def refund_seat(course_enrollment, change_mode=False): course_key_str = str(course_enrollment.course_id) enrollee = course_enrollment.user - if should_redirect_to_commerce_coordinator_refunds(): - if _refund_in_commerce_coordinator(course_enrollment, change_mode): - return - service_user = User.objects.get(username=settings.ECOMMERCE_SERVICE_WORKER_USERNAME) api_client = get_ecommerce_api_client(service_user) @@ -295,75 +277,6 @@ def refund_seat(course_enrollment, change_mode=False): return refund_ids -def _refund_in_commerce_coordinator(course_enrollment, change_mode): - """ - Helper function to perform refund in Commerce Coordinator. - - Parameters: - course_enrollment (CourseEnrollment): the enrollment to refund. - change_mode (bool): whether the enrollment should be auto-enrolled into - the default course mode after refund. - - Returns: - bool: True if refund was performed. False if refund is not applicable - to Commerce Coordinator. - """ - enrollment_source_system = course_enrollment.get_order_attribute_value("source_system") - course_key_str = str(course_enrollment.course_id) - - # Commerce Coordinator enrollments will have an orders.source_system enrollment attribute. - # Redirect to Coordinator only if the source_system is safelisted as Coordinator's in settings. - - if enrollment_source_system and enrollment_source_system in settings.COMMERCE_COORDINATOR_REFUND_SOURCE_SYSTEMS: - log.info('Redirecting refund to Commerce Coordinator for user [%s], course [%s]...', - course_enrollment.user_id, course_key_str) - - # Re-use Ecommerce API client factory to build an API client for Commerce Coordinator... - service_user = get_user_model().objects.get( - username=settings.COMMERCE_COORDINATOR_SERVICE_WORKER_USERNAME - ) - api_client = get_ecommerce_api_client(service_user) - refunds_url = urljoin( - settings.COMMERCE_COORDINATOR_URL_ROOT, - settings.COMMERCE_COORDINATOR_REFUND_PATH - ) - - # Build request, raising exception if Coordinator returns non-200. - enrollment_attributes = CourseEnrollmentAttribute.get_enrollment_attributes(course_enrollment) - - try: - api_client.post( - refunds_url, - json={ - 'course_id': course_key_str, - 'username': course_enrollment.username, - 'enrollment_attributes': enrollment_attributes - } - ).raise_for_status() - - except Exception as exc: # pylint: disable=broad-except - # Catch any possible exceptions from the Commerce Coordinator service to ensure we fail gracefully - log.exception( - "Unexpected exception while attempting to refund user in Coordinator [%s], " - "course key [%s] message: [%s]", - course_enrollment.username, - course_key_str, - str(exc) - ) - - # Refund was successfully sent to Commerce Coordinator - log.info('Refund successfully sent to Commerce Coordinator for user [%s], course [%s].', - course_enrollment.user_id, course_key_str) - if change_mode: - auto_enroll(course_enrollment) - return True - else: - # Refund was not meant to be sent to Commerce Coordinator - log.info('Continuing refund without Commerce Coordinator redirect for user [%s], course [%s]...', - course_enrollment.user_id, course_key_str) - return False - - def auto_enroll(course_enrollment): """ Helper method to update an enrollment to a default course mode. diff --git a/lms/djangoapps/commerce/waffle.py b/lms/djangoapps/commerce/waffle.py deleted file mode 100644 index a36586a52d..0000000000 --- a/lms/djangoapps/commerce/waffle.py +++ /dev/null @@ -1,49 +0,0 @@ -""" -Configuration for features of Commerce App -""" -from edx_toggles.toggles import WaffleFlag - -# Namespace for Commerce waffle flags. -WAFFLE_FLAG_NAMESPACE = "commerce" - -# .. toggle_name: commerce.transition_to_coordinator.checkout -# .. toggle_implementation: WaffleFlag -# .. toggle_default: False -# .. toggle_description: Allows to redirect checkout to Commerce Coordinator API -# .. toggle_use_cases: temporary -# .. toggle_creation_date: 2023-11-22 -# .. toggle_target_removal_date: TBA -# .. toggle_tickets: SONIC-99 -# .. toggle_status: supported -ENABLE_TRANSITION_TO_COORDINATOR_CHECKOUT = WaffleFlag( - f"{WAFFLE_FLAG_NAMESPACE}.transition_to_coordinator.checkout", - __name__, -) - -# .. toggle_name: commerce.transition_to_coordinator.refund -# .. toggle_implementation: WaffleFlag -# .. toggle_default: False -# .. toggle_description: Allows to redirect refunds to Commerce Coordinator API -# .. toggle_use_cases: temporary -# .. toggle_creation_date: 2024-03-26 -# .. toggle_target_removal_date: TBA -# .. toggle_tickets: SONIC-382 -# .. toggle_status: supported -ENABLE_TRANSITION_TO_COORDINATOR_REFUNDS = WaffleFlag( - f"{WAFFLE_FLAG_NAMESPACE}.transition_to_coordinator.refunds", - __name__, -) - - -def should_redirect_to_commerce_coordinator_checkout(): - """ - Redirect learners to Commerce Coordinator checkout. - """ - return ENABLE_TRANSITION_TO_COORDINATOR_CHECKOUT.is_enabled() - - -def should_redirect_to_commerce_coordinator_refunds(): - """ - Redirect learners to Commerce Coordinator refunds. - """ - return ENABLE_TRANSITION_TO_COORDINATOR_REFUNDS.is_enabled() diff --git a/lms/envs/common.py b/lms/envs/common.py index df8878f269..770c642d5f 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -4304,13 +4304,6 @@ ECOMMERCE_ORDERS_API_CACHE_TIMEOUT = 3600 ECOMMERCE_SERVICE_WORKER_USERNAME = 'ecommerce_worker' ECOMMERCE_API_SIGNING_KEY = 'SET-ME-PLEASE' -# E-Commerce Commerce Coordinator Configuration -COMMERCE_COORDINATOR_URL_ROOT = 'http://localhost:8140' -COMMERCE_COORDINATOR_REFUND_PATH = '/lms/refund/' -COMMERCE_COORDINATOR_REFUND_SOURCE_SYSTEMS = ('SET-ME-PLEASE',) -COMMERCE_COORDINATOR_SERVICE_WORKER_USERNAME = 'commerce_coordinator_worker' -COORDINATOR_CHECKOUT_REDIRECT_PATH = '/lms/payment_page_redirect/' - # Exam Service EXAMS_SERVICE_URL = 'http://localhost:18740/api/v1' diff --git a/lms/templates/course_modes/track_selection.html b/lms/templates/course_modes/track_selection.html index 557bd18844..39a5f54403 100644 --- a/lms/templates/course_modes/track_selection.html +++ b/lms/templates/course_modes/track_selection.html @@ -35,9 +35,9 @@ from openedx.core.djangolib.js_utils import js_escaped_string $('.popover-icon').click(function(e){ e.stopPropagation(); if ($('.popover').css("visibility") == "hidden" || $('.popover').css("visibility") == "" ) { - $('.popover').css({"visibility":"visible", "opacity": 1}); + $('.popover').css({"visibility":"visible", "opacity": 1}); } else { - $('.popover').css({"visibility":"hidden", "opacity": 0}); + $('.popover').css({"visibility":"hidden", "opacity": 0}); } }); }); @@ -52,7 +52,7 @@ from openedx.core.djangolib.js_utils import js_escaped_string } window.addEventListener("resize", onresize); - // responsive: show more + // responsive: show more $(function(){ if($(window).width() <= 768) { $('.collapsible-item').css({"display":"none"}); @@ -64,7 +64,7 @@ from openedx.core.djangolib.js_utils import js_escaped_string e.preventDefault(); $('.collapsible').css({"display":"none"}); $('.collapsible-item').css({"display":"list-item"}); - }); + }); }); @@ -112,7 +112,7 @@ from openedx.core.djangolib.js_utils import js_escaped_string

${currency_symbol}${min_price} ${currency}

${_("Earn a certificate")}

- <%block name="track_selection_certificate_bullets"/> + <%block name="track_selection_certificate_bullets"/>