diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a05b78e8837a..fc452f7acde7 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 diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 5fef1c8352ce..900489256ab5 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 diff --git a/lms/djangoapps/discussion/rest_api/tests/test_serializers.py b/lms/djangoapps/discussion/rest_api/tests/test_serializers.py index 9144152fe548..bc13013c78c2 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_serializers.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_serializers.py @@ -819,7 +819,7 @@ def setUp(self): patcher = mock.patch( "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" ) - self.mock_get_course_id_by_comment = patcher.start() + self.mock_get_course_id_by_thread = patcher.start() self.addCleanup(patcher.stop) self.user = UserFactory.create() self.register_get_user_response(self.user) diff --git a/lms/djangoapps/discussion/tests/test_tasks.py b/lms/djangoapps/discussion/tests/test_tasks.py index 92dadac9d9ee..22855076e457 100644 --- a/lms/djangoapps/discussion/tests/test_tasks.py +++ b/lms/djangoapps/discussion/tests/test_tasks.py @@ -232,6 +232,19 @@ def setUp(self): thread_permalink = '/courses/discussion/dummy_discussion_id' self.permalink_patcher = mock.patch('lms.djangoapps.discussion.tasks.permalink', return_value=thread_permalink) self.mock_permalink = self.permalink_patcher.start() + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.models.forum_api.get_course_id_by_comment" + ) + self.mock_get_course_id_by_comment = patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_comment = patcher.start() + self.addCleanup(patcher.stop) def tearDown(self): super().tearDown() diff --git a/lms/djangoapps/discussion/tests/test_views.py b/lms/djangoapps/discussion/tests/test_views.py index 605cf05c65b7..f9ac0852a7d5 100644 --- a/lms/djangoapps/discussion/tests/test_views.py +++ b/lms/djangoapps/discussion/tests/test_views.py @@ -4,6 +4,7 @@ import json import logging from datetime import datetime +from unittest import mock from unittest.mock import ANY, Mock, call, patch import ddt @@ -109,9 +110,17 @@ def setUp(self): config = ForumsConfig.current() config.enabled = True config.save() + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) @patch('common.djangoapps.student.models.user.cc.User.from_django_user') - @patch('common.djangoapps.student.models.user.cc.User.active_threads') + @patch('openedx.core.djangoapps.django_comment_common.comment_client.user.User.active_threads') def test_user_profile_exception(self, mock_threads, mock_from_django_user): # Mock the code that makes the HTTP requests to the cs_comment_service app @@ -323,6 +332,14 @@ class SingleThreadTestCase(ForumsEnableMixin, ModuleStoreTestCase): # lint-amne def setUp(self): super().setUp() + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) self.course = CourseFactory.create(discussion_topics={'dummy discussion': {'id': 'dummy_discussion_id'}}) self.student = UserFactory.create() @@ -513,6 +530,17 @@ class SingleThreadQueryCountTestCase(ForumsEnableMixin, ModuleStoreTestCase): Ensures the number of modulestore queries and number of sql queries are independent of the number of responses retrieved for a given discussion thread. """ + def setUp(self): + super().setUp() + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) + @ddt.data( # split mongo: 3 queries, regardless of thread response size. (False, 1, 2, 2, 21, 8), @@ -582,6 +610,17 @@ def call_single_thread(): @patch('requests.request', autospec=True) class SingleCohortedThreadTestCase(CohortedTestCase): # lint-amnesty, pylint: disable=missing-class-docstring + def setUp(self): + super().setUp() + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) + def _create_mock_cohorted_thread(self, mock_request): # lint-amnesty, pylint: disable=missing-function-docstring mock_text = "dummy content" mock_thread_id = "test_thread_id" @@ -644,6 +683,17 @@ def test_html(self, mock_request): @patch('openedx.core.djangoapps.django_comment_common.comment_client.utils.requests.request', autospec=True) class SingleThreadAccessTestCase(CohortedTestCase): # lint-amnesty, pylint: disable=missing-class-docstring + def setUp(self): + super().setUp() + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) + def call_view(self, mock_request, commentable_id, user, group_id, thread_group_id=None, pass_group_id=True): # lint-amnesty, pylint: disable=missing-function-docstring thread_id = "test_thread_id" mock_request.side_effect = make_mock_request_impl( @@ -746,6 +796,17 @@ def test_private_team_thread(self, mock_request): class SingleThreadGroupIdTestCase(CohortedTestCase, GroupIdAssertionMixin): # lint-amnesty, pylint: disable=missing-class-docstring cs_endpoint = "/threads/dummy_thread_id" + def setUp(self): + super().setUp() + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) + def call_view(self, mock_request, commentable_id, user, group_id, pass_group_id=True, is_ajax=False): # lint-amnesty, pylint: disable=missing-function-docstring mock_request.side_effect = make_mock_request_impl( course=self.course, text="dummy context", group_id=self.student_cohort.id @@ -881,6 +942,14 @@ class SingleThreadContentGroupTestCase(ForumsEnableMixin, UrlResetMixin, Content @patch.dict("django.conf.settings.FEATURES", {"ENABLE_DISCUSSION_SERVICE": True}) def setUp(self): super().setUp() + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) def assert_can_access(self, user, discussion_id, thread_id, should_have_access): """ @@ -1057,6 +1126,11 @@ class InlineDiscussionGroupIdTestCase( # lint-amnesty, pylint: disable=missing- def setUp(self): super().setUp() self.cohorted_commentable_id = 'cohorted_topic' + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) def call_view( self, @@ -1112,6 +1186,14 @@ def test_group_info_in_ajax_response(self, mock_is_forum_v2_enabled, mock_reques class ForumFormDiscussionGroupIdTestCase(CohortedTestCase, CohortedTopicGroupIdTestMixin): # lint-amnesty, pylint: disable=missing-class-docstring cs_endpoint = "/threads" + def setUp(self): + super().setUp() + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) + def call_view( self, mock_is_forum_v2_enabled, @@ -1171,6 +1253,14 @@ def test_group_info_in_ajax_response(self, mock_is_forum_v2_enabled, mock_reques class UserProfileDiscussionGroupIdTestCase(CohortedTestCase, CohortedTopicGroupIdTestMixin): # lint-amnesty, pylint: disable=missing-class-docstring cs_endpoint = "/active_threads" + def setUp(self): + super().setUp() + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) + def call_view_for_profiled_user( self, mock_is_forum_v2_enabled, @@ -1375,6 +1465,14 @@ def verify_group_id_not_present(profiled_user, pass_group_id, requested_cohort=s class FollowedThreadsDiscussionGroupIdTestCase(CohortedTestCase, CohortedTopicGroupIdTestMixin): # lint-amnesty, pylint: disable=missing-class-docstring cs_endpoint = "/subscribed_threads" + def setUp(self): + super().setUp() + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) + def call_view( self, mock_is_forum_v2_enabled, @@ -1823,6 +1921,17 @@ def setUpClass(cls): with super().setUpClassAndTestData(): cls.course = CourseFactory.create(discussion_topics={'dummy_discussion_id': {'id': 'dummy_discussion_id'}}) + def setUp(self): + super().setUp() + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) + @classmethod def setUpTestData(cls): super().setUpTestData() @@ -1939,7 +2048,14 @@ class EnterpriseConsentTestCase(EnterpriseTestConsentRequired, ForumsEnableMixin def setUp(self): # Invoke UrlResetMixin setUp super().setUp() - + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) username = "foo" password = "bar" @@ -2276,6 +2392,14 @@ class ThreadViewedEventTestCase(EventTestMixin, ForumsEnableMixin, UrlResetMixin def setUp(self): # pylint: disable=arguments-differ super().setUp('lms.djangoapps.discussion.django_comment_client.base.views.tracker') + patcher = mock.patch('lms.djangoapps.discussion.toggles.ENABLE_FORUM_V2.is_enabled', return_value=False) + patcher.start() + self.addCleanup(patcher.stop) + patcher = mock.patch( + "openedx.core.djangoapps.django_comment_common.comment_client.thread.forum_api.get_course_id_by_thread" + ) + self.mock_get_course_id_by_thread = patcher.start() + self.addCleanup(patcher.stop) self.course = CourseFactory.create( teams_configuration=TeamsConfig({ 'topics': [{ 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 3a08ede0aaf6..4c45f415cf63 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 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 @@ def _approve_id_verifications(self, user_ids): 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 e6e580c1d1a6..6eccee194795 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 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 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 @@ def test_invalid_file_path(self): """ 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', + ) diff --git a/openedx/core/djangoapps/django_comment_common/comment_client/comment.py b/openedx/core/djangoapps/django_comment_common/comment_client/comment.py index e9ee12eb786b..1d276cd4a624 100644 --- a/openedx/core/djangoapps/django_comment_common/comment_client/comment.py +++ b/openedx/core/djangoapps/django_comment_common/comment_client/comment.py @@ -70,11 +70,12 @@ def flagAbuse(self, user, voteable): url = _url_for_flag_abuse_comment(voteable.id) else: raise CommentClientRequestError("Can only flag/unflag threads or comments") - if is_forum_v2_enabled(get_course_key(self.attributes.get("course_id"))): + course_key = get_course_key(self.attributes.get("course_id")) + if is_forum_v2_enabled(course_key): if voteable.type == 'thread': - response = forum_api.update_thread_flag(voteable.id, "flag", user.id) + response = forum_api.update_thread_flag(voteable.id, "flag", user.id, str(course_key)) else: - response = forum_api.update_comment_flag(voteable.id, "flag", user.id) + response = forum_api.update_comment_flag(voteable.id, "flag", user.id, str(course_key)) else: params = {'user_id': user.id} response = perform_request( @@ -93,11 +94,16 @@ def unFlagAbuse(self, user, voteable, removeAll): url = _url_for_unflag_abuse_comment(voteable.id) else: raise CommentClientRequestError("Can flag/unflag for threads or comments") - if is_forum_v2_enabled(get_course_key(self.attributes.get("course_id"))): - if voteable.type == 'thread': - response = forum_api.update_thread_flag(voteable.id, "unflag", user.id, bool(removeAll)) + course_key = get_course_key(self.attributes.get("course_id")) + if is_forum_v2_enabled(course_key): + if voteable.type == "thread": + response = forum_api.update_thread_flag( + voteable.id, "unflag", user.id, bool(removeAll), str(course_key) + ) else: - response = forum_api.update_comment_flag(voteable.id, "unflag", user.id, bool(removeAll)) + response = forum_api.update_comment_flag( + voteable.id, "unflag", user.id, bool(removeAll), str(course_key) + ) else: params = {'user_id': user.id} diff --git a/openedx/core/djangoapps/django_comment_common/comment_client/models.py b/openedx/core/djangoapps/django_comment_common/comment_client/models.py index 5af9e46daf84..1471e3320fb2 100644 --- a/openedx/core/djangoapps/django_comment_common/comment_client/models.py +++ b/openedx/core/djangoapps/django_comment_common/comment_client/models.py @@ -78,7 +78,7 @@ def _retrieve(self, *args, **kwargs): response = None if is_forum_v2_enabled(course_key): if self.type == "comment": - response = forum_api.get_parent_comment(self.attributes["id"]) + response = forum_api.get_parent_comment(self.attributes["id"], str(course_key)) if response is None: raise CommentClientRequestError("Forum v2 API call is missing") else: @@ -173,12 +173,13 @@ def save(self, params=None): self.after_save(self) def delete(self): - if is_forum_v2_enabled(get_course_key(self.attributes.get("course_id"))): + course_key = get_course_key(self.attributes.get("course_id")) + if is_forum_v2_enabled(course_key): response = None if self.type == "comment": - response = forum_api.delete_comment(self.attributes["id"]) + response = forum_api.delete_comment(self.attributes["id"], str(course_key)) elif self.type == "thread": - response = forum_api.delete_thread(self.attributes["id"]) + response = forum_api.delete_thread(self.attributes["id"], str(course_key)) if response is None: raise CommentClientRequestError("Forum v2 API call is missing") else: @@ -220,21 +221,22 @@ def handle_update(self, params=None): if params: request_params.update(params) course_id = self.attributes.get("course_id") or request_params.get("course_id") - if is_forum_v2_enabled(get_course_key(course_id)): + course_key = get_course_key(course_id) + if is_forum_v2_enabled(course_key): response = None if self.type == "comment": - response = self.handle_update_comment(request_params) + response = self.handle_update_comment(request_params, str(course_key)) elif self.type == "thread": - response = self.handle_update_thread(request_params) + response = self.handle_update_thread(request_params, str(course_key)) elif self.type == "user": - response = self.handle_update_user(request_params) + response = self.handle_update_user(request_params, str(course_key)) if response is None: raise CommentClientRequestError("Forum v2 API call is missing") else: response = self.perform_http_put_request(request_params) return response - def handle_update_user(self, request_params): + def handle_update_user(self, request_params, course_id): try: username = request_params["username"] external_id = str(request_params["external_id"]) @@ -243,10 +245,11 @@ def handle_update_user(self, request_params): response = forum_api.update_user( external_id, username, + course_id, ) return response - def handle_update_comment(self, request_params): + def handle_update_comment(self, request_params, course_id): request_data = { "comment_id": self.attributes["id"], "body": request_params.get("body"), @@ -259,12 +262,13 @@ def handle_update_comment(self, request_params): "editing_user_id": request_params.get("editing_user_id"), "edit_reason_code": request_params.get("edit_reason_code"), "endorsement_user_id": request_params.get("endorsement_user_id"), + "course_key": course_id } request_data = {k: v for k, v in request_data.items() if v is not None} response = forum_api.update_comment(**request_data) return response - def handle_update_thread(self, request_params): + def handle_update_thread(self, request_params, course_id): request_data = { "thread_id": self.attributes["id"], "title": request_params.get("title"), @@ -282,6 +286,7 @@ def handle_update_thread(self, request_params): "close_reason_code": request_params.get("close_reason_code"), "closing_user_id": request_params.get("closing_user_id"), "endorsed": request_params.get("endorsed"), + "course_key": course_id } request_data = {k: v for k, v in request_data.items() if v is not None} response = forum_api.update_thread(**request_data) @@ -311,24 +316,25 @@ def perform_http_post_request(self): def handle_create(self, params=None): course_id = self.attributes.get("course_id") or params.get("course_id") - if is_forum_v2_enabled(get_course_key(course_id)): + course_key = get_course_key(course_id) + if is_forum_v2_enabled(course_key): response = None if self.type == "comment": - response = self.handle_create_comment() + response = self.handle_create_comment(str(course_key)) elif self.type == "thread": - response = self.handle_create_thread() + response = self.handle_create_thread(str(course_key)) if response is None: raise CommentClientRequestError("Forum v2 API call is missing") else: response = self.perform_http_post_request() return response - def handle_create_comment(self): + def handle_create_comment(self, course_id): request_data = self.initializable_attributes() try: body = request_data["body"] user_id = request_data["user_id"] - course_id = str(request_data["course_id"]) + course_id = course_id or str(request_data["course_id"]) except KeyError as e: raise e if parent_id := self.attributes.get("parent_id"): @@ -351,20 +357,19 @@ def handle_create_comment(self): ) return response - def handle_create_thread(self): + def handle_create_thread(self, course_id): request_data = self.initializable_attributes() try: title = request_data["title"] body = request_data["body"] user_id = str(request_data["user_id"]) - course_id = str(request_data["course_id"]) except KeyError as e: raise e request_data = { "title": title, "body": body, - "course_id": course_id, + "course_id": course_id or str(request_data["course_id"]), "user_id": user_id, "anonymous": request_data.get("anonymous", None), "anonymous_to_peers": request_data.get("anonymous_to_peers", None), diff --git a/openedx/core/djangoapps/django_comment_common/comment_client/subscriptions.py b/openedx/core/djangoapps/django_comment_common/comment_client/subscriptions.py index 84c830ba613d..8f9bc06340c4 100644 --- a/openedx/core/djangoapps/django_comment_common/comment_client/subscriptions.py +++ b/openedx/core/djangoapps/django_comment_common/comment_client/subscriptions.py @@ -35,9 +35,11 @@ def fetch(cls, thread_id, course_id, query_params): params.update( utils.strip_blank(utils.strip_none(query_params)) ) - - if is_forum_v2_enabled(utils.get_course_key(course_id)): - response = forum_api.get_thread_subscriptions(thread_id, params['page'], params['per_page']) + course_key = utils.get_course_key(course_id) + if is_forum_v2_enabled(course_key): + response = forum_api.get_thread_subscriptions( + thread_id, params["page"], params["per_page"], str(course_key) + ) else: response = utils.perform_request( 'get', diff --git a/openedx/core/djangoapps/django_comment_common/comment_client/thread.py b/openedx/core/djangoapps/django_comment_common/comment_client/thread.py index f5525fcc8c99..69d70e1f9328 100644 --- a/openedx/core/djangoapps/django_comment_common/comment_client/thread.py +++ b/openedx/core/djangoapps/django_comment_common/comment_client/thread.py @@ -79,6 +79,8 @@ def search(cls, query_params): search_params.pop('commentable_id', None) response = forum_api.search_threads(**search_params) else: + if not params.get("course_id"): + params = query_params['course_id'] response = forum_api.get_user_threads(**params) else: response = utils.perform_request( @@ -178,7 +180,7 @@ def _retrieve(self, *args, **kwargs): if is_forum_v2_enabled(course_key): if user_id := request_params.get('user_id'): request_params['user_id'] = str(user_id) - response = forum_api.get_thread(self.id, request_params) + response = forum_api.get_thread(self.id, request_params, str(course_key)) else: response = utils.perform_request( 'get', @@ -194,8 +196,9 @@ def flagAbuse(self, user, voteable): url = _url_for_flag_abuse_thread(voteable.id) else: raise utils.CommentClientRequestError("Can only flag/unflag threads or comments") - if is_forum_v2_enabled(utils.get_course_key(self.attributes.get("course_id"))): - response = forum_api.update_thread_flag(voteable.id, "flag", user.id) + course_key = utils.get_course_key(self.attributes.get("course_id")) + if is_forum_v2_enabled(course_key): + response = forum_api.update_thread_flag(voteable.id, "flag", user.id, str(course_key)) else: params = {'user_id': user.id} response = utils.perform_request( @@ -212,8 +215,9 @@ def unFlagAbuse(self, user, voteable, removeAll): url = _url_for_unflag_abuse_thread(voteable.id) else: raise utils.CommentClientRequestError("Can only flag/unflag for threads or comments") - if is_forum_v2_enabled(utils.get_course_key(self.attributes.get("course_id"))): - response = forum_api.update_thread_flag(voteable.id, "unflag", user.id, bool(removeAll)) + course_key = utils.get_course_key(self.attributes.get("course_id")) + if is_forum_v2_enabled(course_key): + response = forum_api.update_thread_flag(voteable.id, "unflag", user.id, bool(removeAll), str(course_key)) else: params = {'user_id': user.id} #if you're an admin, when you unflag, remove ALL flags @@ -230,8 +234,9 @@ def unFlagAbuse(self, user, voteable, removeAll): voteable._update_from_response(response) def pin(self, user, thread_id): - if is_forum_v2_enabled(utils.get_course_key(self.attributes.get("course_id"))): - response = forum_api.pin_thread(user.id, thread_id) + course_key = utils.get_course_key(self.attributes.get("course_id")) + if is_forum_v2_enabled(course_key): + response = forum_api.pin_thread(user.id, thread_id, str(course_key)) else: url = _url_for_pin_thread(thread_id) params = {'user_id': user.id} @@ -245,8 +250,9 @@ def pin(self, user, thread_id): self._update_from_response(response) def un_pin(self, user, thread_id): - if is_forum_v2_enabled(utils.get_course_key(self.attributes.get("course_id"))): - response = forum_api.unpin_thread(user.id, thread_id) + course_key = utils.get_course_key(self.attributes.get("course_id")) + if is_forum_v2_enabled(course_key): + response = forum_api.unpin_thread(user.id, thread_id, str(course_key)) else: url = _url_for_un_pin_thread(thread_id) params = {'user_id': user.id} diff --git a/openedx/core/djangoapps/django_comment_common/comment_client/user.py b/openedx/core/djangoapps/django_comment_common/comment_client/user.py index 206a08a91f98..ee9274c62061 100644 --- a/openedx/core/djangoapps/django_comment_common/comment_client/user.py +++ b/openedx/core/djangoapps/django_comment_common/comment_client/user.py @@ -55,7 +55,7 @@ def read(self, source): def follow(self, source): course_key = utils.get_course_key(self.attributes.get("course_id")) if is_forum_v2_enabled(course_key): - forum_api.create_subscription(self.id, source.id) + forum_api.create_subscription(self.id, source.id, str(course_key)) else: params = {'source_type': source.type, 'source_id': source.id} utils.perform_request( @@ -69,7 +69,7 @@ def follow(self, source): def unfollow(self, source): course_key = utils.get_course_key(self.attributes.get("course_id")) if is_forum_v2_enabled(course_key): - forum_api.delete_subscription(self.id, source.id) + forum_api.delete_subscription(self.id, source.id, str(course_key)) else: params = {'source_type': source.type, 'source_id': source.id} utils.perform_request( @@ -90,9 +90,9 @@ def vote(self, voteable, value): course_key = utils.get_course_key(self.attributes.get("course_id")) if is_forum_v2_enabled(course_key): if voteable.type == 'thread': - response = forum_api.update_thread_votes(voteable.id, self.id, value) + response = forum_api.update_thread_votes(voteable.id, self.id, value, str(course_key)) else: - response = forum_api.update_comment_votes(voteable.id, self.id, value) + response = forum_api.update_comment_votes(voteable.id, self.id, value, str(course_key)) else: params = {'user_id': self.id, 'value': value} response = utils.perform_request( @@ -114,9 +114,9 @@ def unvote(self, voteable): course_key = utils.get_course_key(self.attributes.get("course_id")) if is_forum_v2_enabled(course_key): if voteable.type == 'thread': - response = forum_api.delete_thread_vote(voteable.id, self.id) + response = forum_api.delete_thread_vote(voteable.id, self.id, str(course_key)) else: - response = forum_api.delete_comment_vote(voteable.id, self.id) + response = forum_api.delete_comment_vote(voteable.id, self.id, str(course_key)) else: params = {'user_id': self.id} response = utils.perform_request( @@ -146,6 +146,8 @@ def active_threads(self, query_params=None): params["per_page"] = int(per_page) if count_flagged := params.get("count_flagged", False): params["count_flagged"] = str_to_bool(count_flagged) + if not params.get("course_id"): + params["course_id"] = str(course_key) response = forum_api.get_user_active_threads(**params) else: response = utils.perform_request( @@ -178,6 +180,8 @@ def subscribed_threads(self, query_params=None): params["per_page"] = int(per_page) if count_flagged := params.get("count_flagged", False): params["count_flagged"] = str_to_bool(count_flagged) + if not params.get("course_id"): + params["course_id"] = str(course_key) response = forum_api.get_user_threads(**params) else: response = utils.perform_request( @@ -206,6 +210,8 @@ def _retrieve(self, *args, **kwargs): retrieve_params['group_id'] = self.attributes["group_id"] course_key = utils.get_course_key(course_id) if is_forum_v2_enabled(course_key): + if not retrieve_params.get("course_id"): + retrieve_params["course_id"] = str(course_key) try: response = forum_api.get_user(self.attributes["id"], retrieve_params) except ForumV2RequestError as e: @@ -239,7 +245,7 @@ def _retrieve(self, *args, **kwargs): def retire(self, retired_username): course_key = utils.get_course_key(self.attributes.get("course_id")) if is_forum_v2_enabled(course_key): - forum_api.retire_user(self.id, retired_username) + forum_api.retire_user(self.id, retired_username, str(course_key)) else: url = _url_for_retire(self.id) params = {'retired_username': retired_username} @@ -255,7 +261,7 @@ def retire(self, retired_username): def replace_username(self, new_username): course_key = utils.get_course_key(self.attributes.get("course_id")) if is_forum_v2_enabled(course_key): - forum_api.update_username(self.id, new_username) + forum_api.update_username(self.id, new_username, str(course_key)) else: url = _url_for_username_replacement(self.id) params = {"new_username": new_username} diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 996391b2bebb..2fc1a1e745f3 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -82,14 +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.0 - -# 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 +edx-enterprise==4.27.2 # Date: 2024-07-26 # To override the constraint of edx-lint @@ -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 bf0a4376da70..0a708b2bbf52 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 6393509c8f87..f6ab7446c45d 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 @@ -329,7 +329,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 @@ -389,7 +389,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 @@ -431,7 +431,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 @@ -440,7 +440,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 @@ -469,7 +469,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 @@ -477,9 +477,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 @@ -519,7 +518,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 @@ -589,14 +588,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 @@ -626,11 +625,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 @@ -644,7 +643,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 @@ -663,7 +662,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 @@ -688,7 +687,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 @@ -713,19 +712,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 @@ -742,7 +743,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 @@ -776,7 +777,7 @@ mysqlclient==2.2.4 # via # -r requirements/edx/kernel.in # forum -newrelic==9.13.0 +newrelic==10.0.0 # via # -r requirements/edx/bundled.in # edx-django-utils @@ -829,7 +830,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 @@ -838,7 +839,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 @@ -890,6 +891,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 @@ -920,7 +923,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 @@ -1027,7 +1030,6 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs - # icalendar # interchange # olxcleaner # ora2 @@ -1049,7 +1051,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 @@ -1103,7 +1105,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 @@ -1142,7 +1144,6 @@ six==1.16.0 # fs-s3fs # html5lib # interchange - # isodate # libsass # optimizely-sdk # pansi @@ -1219,6 +1220,7 @@ typing-extensions==4.12.2 tzdata==2024.2 # via # celery + # icalendar # kombu unicodecsv==0.14.1 # via @@ -1248,7 +1250,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 @@ -1296,13 +1298,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 a1faf5e74025..45f2429cb2d1 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 8b5fe8b7ef6a..e61568f2a397 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 @@ -545,7 +545,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 @@ -629,7 +629,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 @@ -698,7 +698,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 @@ -712,7 +712,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 @@ -743,7 +743,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 @@ -756,9 +756,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 @@ -816,7 +815,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 @@ -882,7 +881,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 @@ -950,7 +949,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 @@ -959,7 +958,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 @@ -1012,17 +1011,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 @@ -1052,7 +1051,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 @@ -1069,7 +1068,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 @@ -1094,7 +1093,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 @@ -1143,7 +1142,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 @@ -1190,14 +1189,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 @@ -1205,6 +1204,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 @@ -1225,7 +1229,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 @@ -1298,7 +1302,7 @@ mysqlclient==2.2.4 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # forum -newrelic==9.13.0 +newrelic==10.0.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1377,7 +1381,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 @@ -1388,7 +1392,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 @@ -1416,7 +1420,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 @@ -1497,6 +1501,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 @@ -1551,7 +1560,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 @@ -1676,7 +1685,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 @@ -1777,7 +1786,6 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs - # icalendar # interchange # olxcleaner # ora2 @@ -1809,7 +1817,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 @@ -1880,7 +1888,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 @@ -1937,7 +1945,6 @@ six==1.16.0 # fs-s3fs # html5lib # interchange - # isodate # libsass # optimizely-sdk # pact-python @@ -1997,7 +2004,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 @@ -2098,7 +2105,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 @@ -2106,7 +2113,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 @@ -2114,7 +2121,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 @@ -2133,6 +2140,7 @@ typing-extensions==4.12.2 # django-stubs-ext # djangorestframework-stubs # edx-opaque-keys + # faker # fastapi # grimp # import-linter @@ -2148,6 +2156,7 @@ tzdata==2024.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery + # icalendar # kombu unicodecsv==0.14.1 # via @@ -2176,7 +2185,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 @@ -2187,7 +2196,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.26.5 +virtualenv==20.26.6 # via # -r requirements/edx/testing.txt # tox @@ -2196,14 +2205,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 @@ -2277,9 +2286,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 @@ -2287,7 +2295,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 03def852117b..a61432cd9eb4 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 @@ -399,7 +399,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 @@ -461,7 +461,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 @@ -511,7 +511,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 @@ -520,7 +520,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 @@ -549,7 +549,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 @@ -557,9 +557,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 @@ -600,7 +599,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 @@ -688,7 +687,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 @@ -696,7 +695,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 @@ -740,12 +739,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 @@ -762,7 +761,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 @@ -786,7 +785,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 @@ -823,7 +822,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 @@ -855,19 +854,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 @@ -884,7 +887,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 @@ -930,7 +933,7 @@ mysqlclient==2.2.4 # via # -r requirements/edx/base.txt # forum -newrelic==9.13.0 +newrelic==10.0.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -988,7 +991,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 @@ -997,7 +1000,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 @@ -1066,6 +1069,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 @@ -1103,7 +1110,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 @@ -1232,7 +1239,6 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs - # icalendar # interchange # olxcleaner # ora2 @@ -1255,7 +1261,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 @@ -1316,7 +1322,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 @@ -1361,7 +1367,6 @@ six==1.16.0 # fs-s3fs # html5lib # interchange - # isodate # libsass # optimizely-sdk # pansi @@ -1405,7 +1410,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 @@ -1500,6 +1505,7 @@ tzdata==2024.2 # via # -r requirements/edx/base.txt # celery + # icalendar # kombu unicodecsv==0.14.1 # via @@ -1535,7 +1541,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 @@ -1587,14 +1593,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 a0b1896919d4..2d8f510e0307 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 102289def277..174fa87d081d 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 0d6bcaf77dea..1be58d326ace 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 @@ -428,7 +428,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 @@ -490,7 +490,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 @@ -535,7 +535,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 @@ -544,7 +544,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 @@ -573,7 +573,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 @@ -581,9 +581,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 @@ -626,7 +625,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 @@ -677,7 +676,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 @@ -722,7 +721,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 @@ -730,7 +729,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 @@ -774,14 +773,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 @@ -802,7 +801,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 @@ -812,7 +811,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 @@ -829,7 +828,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 @@ -870,7 +869,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 @@ -904,13 +903,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 @@ -918,6 +917,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 @@ -934,7 +937,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 @@ -981,7 +984,7 @@ mysqlclient==2.2.4 # via # -r requirements/edx/base.txt # forum -newrelic==9.13.0 +newrelic==10.0.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -1039,7 +1042,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 @@ -1048,7 +1051,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 @@ -1066,7 +1069,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 @@ -1128,6 +1131,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 @@ -1173,7 +1180,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 @@ -1350,7 +1357,6 @@ pytz==2024.2 # edx-tincan-py35 # event-tracking # fs - # icalendar # interchange # olxcleaner # ora2 @@ -1372,7 +1378,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 @@ -1433,7 +1439,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 @@ -1481,7 +1487,6 @@ six==1.16.0 # fs-s3fs # html5lib # interchange - # isodate # libsass # optimizely-sdk # pact-python @@ -1565,7 +1570,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 @@ -1577,6 +1582,7 @@ typing-extensions==4.12.2 # -r requirements/edx/base.txt # django-countries # edx-opaque-keys + # faker # fastapi # grimp # import-linter @@ -1589,6 +1595,7 @@ tzdata==2024.2 # via # -r requirements/edx/base.txt # celery + # icalendar # kombu unicodecsv==0.14.1 # via @@ -1612,7 +1619,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 @@ -1620,7 +1627,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.26.5 +virtualenv==20.26.6 # via tox voluptuous==0.15.2 # via @@ -1630,7 +1637,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 @@ -1684,14 +1691,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 5bcb2aa55084..110663ff6ab3 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 b80c660b8749..a3fcacad2f7e 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 8be2e15973d0..94c6ac6982f3 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 9f57da73d0c2..576fa342c385 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 d5aac1cd062f..6a165d7356ca 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