From 3b1ff5cda883400072aeaa2e5736b0df216bc46a Mon Sep 17 00:00:00 2001 From: Muhammad Umar Khan <42294172+mumarkhan999@users.noreply.github.com> Date: Mon, 17 Jul 2023 17:20:34 +0500 Subject: [PATCH 01/21] build: add pymemcache dependency (#32748) * build: add pymemcache dependency * feat: Upgrade Python dependency pymemcache (#32749) build: add pymemcache dependency Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master` Co-authored-by: mumarkhan999 --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: mumarkhan999 --- requirements/edx/base.txt | 2 ++ requirements/edx/development.txt | 2 ++ requirements/edx/paver.in | 1 + requirements/edx/paver.txt | 2 ++ requirements/edx/testing.txt | 2 ++ 5 files changed, 9 insertions(+) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 87140765c6..ad06c70931 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -882,6 +882,8 @@ pylatexenc==2.10 # via olxcleaner pylti1p3==2.0.0 # via -r requirements/edx/kernel.in +pymemcache==4.0.0 + # via -r requirements/edx/paver.txt pymongo==3.13.0 # via # -c requirements/edx/../constraints.txt diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 93cae87cf4..49b95e50a5 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1281,6 +1281,8 @@ pylint-pytest==0.3.0 # via -r requirements/edx/testing.txt pylti1p3==2.0.0 # via -r requirements/edx/testing.txt +pymemcache==4.0.0 + # via -r requirements/edx/testing.txt pymongo==3.13.0 # via # -c requirements/edx/../constraints.txt diff --git a/requirements/edx/paver.in b/requirements/edx/paver.in index c5e80916e9..caaf349592 100644 --- a/requirements/edx/paver.in +++ b/requirements/edx/paver.in @@ -20,6 +20,7 @@ paver # Build, distribution and deployment scripti psutil # Library for retrieving information on running processes and system utilization pymongo # via edx-opaque-keys python-memcached # Python interface to the memcached memory cache daemon +pymemcache # Python interface to the memcached memory cache daemon requests # Simple interface for making HTTP requests stevedore # Support for runtime plugins, used for XBlocks and edx-platform Django app plugins watchdog # Used in paver watch_assets diff --git a/requirements/edx/paver.txt b/requirements/edx/paver.txt index 18eb26f2ef..34b6b91243 100644 --- a/requirements/edx/paver.txt +++ b/requirements/edx/paver.txt @@ -30,6 +30,8 @@ pbr==5.11.1 # via stevedore psutil==5.9.5 # via -r requirements/edx/paver.in +pymemcache==4.0.0 + # via -r requirements/edx/paver.in pymongo==3.13.0 # via # -c requirements/edx/../constraints.txt diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index bec66eeb67..d11a06211b 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -1160,6 +1160,8 @@ pylint-pytest==0.3.0 # via -r requirements/edx/testing.in pylti1p3==2.0.0 # via -r requirements/edx/base.txt +pymemcache==4.0.0 + # via -r requirements/edx/base.txt pymongo==3.13.0 # via # -c requirements/edx/../constraints.txt From 376211950fd40cefcf048f740032c99e93cfdec6 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Thu, 13 Jul 2023 15:32:20 -0400 Subject: [PATCH 02/21] build: Add base requirements to docs. If we want to build autodocs from the code, we need the dependencies of the code installed as a part of the docs build. --- requirements/edx/doc.in | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/edx/doc.in b/requirements/edx/doc.in index 0dd7ad9aa6..4772c4dc13 100644 --- a/requirements/edx/doc.in +++ b/requirements/edx/doc.in @@ -1,6 +1,7 @@ # Requirements for documentation validation -c ../constraints.txt +-r base.txt code-annotations # provides annotations for certain documentation sphinx-book-theme # Common theme for all Open edX projects gitpython # fetch git repo information From a44336057da18eaa70aafe18a89c56b116b37643 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Thu, 13 Jul 2023 16:31:03 -0400 Subject: [PATCH 03/21] build: Install edx-platform as a part of the docs setup. --- .readthedocs.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 94ace67974..1ba26f8d58 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -8,3 +8,5 @@ build: python: install: - requirements: "requirements/edx/doc.txt" + - method: pip + path: . From 06923c794832aa3164b4177473d2130e0c72adca Mon Sep 17 00:00:00 2001 From: Mohammad Ahtasham ul Hassan <60315450+aht007@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:17:12 +0500 Subject: [PATCH 04/21] feat: use username for course completion API instead of lms_user_id (#32761) --- .../rest_api/v1/tests/test_views.py | 2 +- .../entitlements/rest_api/v1/views.py | 24 +++++++++++-------- common/djangoapps/entitlements/tasks.py | 18 +++++++------- common/djangoapps/entitlements/utils.py | 14 +++++------ openedx/core/djangoapps/credentials/utils.py | 20 ++++++++-------- 5 files changed, 41 insertions(+), 37 deletions(-) diff --git a/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py b/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py index f36d29249a..34abc39c00 100644 --- a/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py +++ b/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py @@ -1392,4 +1392,4 @@ class RevokeSubscriptionsVerifiedAccessViewTest(ModuleStoreTestCase): assert response.status_code == 204 mock_task.assert_called_once_with(args=([str(course_entitlement.uuid)], [str(enrollment.course_id)], - self.user.id)) + self.user.username)) diff --git a/common/djangoapps/entitlements/rest_api/v1/views.py b/common/djangoapps/entitlements/rest_api/v1/views.py index 3ca538eb0e..6eaf24c3da 100644 --- a/common/djangoapps/entitlements/rest_api/v1/views.py +++ b/common/djangoapps/entitlements/rest_api/v1/views.py @@ -4,6 +4,7 @@ Views for the Entitlements v1 API. import logging +from django.contrib.auth import get_user_model from django.db import IntegrityError, transaction from django.db.models import Q from django.http import HttpResponseBadRequest @@ -42,6 +43,7 @@ from openedx.core.djangoapps.cors_csrf.authentication import SessionAuthenticati from openedx.core.djangoapps.credentials.utils import get_courses_completion_status from openedx.core.djangoapps.user_api.preferences.api import update_email_opt_in +User = get_user_model() log = logging.getLogger(__name__) @@ -552,36 +554,38 @@ class SubscriptionsRevokeVerifiedAccessView(APIView): course completion status. """ entitled_course_ids = [] + user = User.objects.get(id=user_id) + username = user.username for course_entitlement in course_entitlements: if course_entitlement.enrollment_course_run is not None: entitled_course_ids.append(str(course_entitlement.enrollment_course_run.course_id)) - log.info('B2C_SUBSCRIPTIONS: Getting course completion status for user %s and entitled_course_ids %s', - user_id, + log.info('B2C_SUBSCRIPTIONS: Getting course completion status for user [%s] and entitled_course_ids %s', + username, entitled_course_ids) - awarded_cert_course_ids, is_exception = get_courses_completion_status(user_id, entitled_course_ids) + awarded_cert_course_ids, is_exception = get_courses_completion_status(username, entitled_course_ids) - log.info('B2C_SUBSCRIPTIONS: Got course completion response %s for user %s and entitled_course_ids %s', + log.info('B2C_SUBSCRIPTIONS: Got course completion response %s for user [%s] and entitled_course_ids %s', awarded_cert_course_ids, - user_id, + username, entitled_course_ids) if is_exception: # Trigger the retry task asynchronously log.exception('B2C_SUBSCRIPTIONS: Exception occurred while getting course completion status for user %s ' 'and entitled_course_ids %s', - user_id, + username, entitled_course_ids) retry_revoke_subscriptions_verified_access.apply_async(args=(revocable_entitlement_uuids, entitled_course_ids, - user_id)) + username)) return - log.info('B2C_SUBSCRIPTIONS: Starting revoke_entitlements_and_downgrade_courses_to_audit for user %s and ' + log.info('B2C_SUBSCRIPTIONS: Starting revoke_entitlements_and_downgrade_courses_to_audit for user [%s] and ' 'awarded_cert_course_ids %s and revocable_entitlement_uuids %s', - user_id, + username, awarded_cert_course_ids, revocable_entitlement_uuids) - revoke_entitlements_and_downgrade_courses_to_audit(course_entitlements, user_id, awarded_cert_course_ids, + revoke_entitlements_and_downgrade_courses_to_audit(course_entitlements, username, awarded_cert_course_ids, revocable_entitlement_uuids) def post(self, request): diff --git a/common/djangoapps/entitlements/tasks.py b/common/djangoapps/entitlements/tasks.py index 47bc0cfd26..0adb2c3338 100644 --- a/common/djangoapps/entitlements/tasks.py +++ b/common/djangoapps/entitlements/tasks.py @@ -157,7 +157,7 @@ def expire_and_create_entitlements(self, entitlement_ids, support_username): @shared_task(bind=True) -def retry_revoke_subscriptions_verified_access(self, revocable_entitlement_uuids, entitled_course_ids, user_id): +def retry_revoke_subscriptions_verified_access(self, revocable_entitlement_uuids, entitled_course_ids, username): """ Task to process course access revoke and move to audit. This is called only if call to get_courses_completion_status fails due to any exception. @@ -165,7 +165,7 @@ def retry_revoke_subscriptions_verified_access(self, revocable_entitlement_uuids course_entitlements = CourseEntitlement.objects.filter(uuid__in=revocable_entitlement_uuids) course_entitlements = course_entitlements.select_related('user').select_related('enrollment_course_run') if course_entitlements.exists(): - awarded_cert_course_ids, is_exception = get_courses_completion_status(user_id, entitled_course_ids) + awarded_cert_course_ids, is_exception = get_courses_completion_status(username, entitled_course_ids) if is_exception: try: countdown = 2 ** self.request.retries @@ -173,20 +173,20 @@ def retry_revoke_subscriptions_verified_access(self, revocable_entitlement_uuids except MaxRetriesExceededError: log.exception( 'B2C_SUBSCRIPTIONS: Failed to process retry_revoke_subscriptions_verified_access ' - 'for user_id %s and entitlement_uuids %s', - user_id, + 'for user [%s] and entitlement_uuids %s', + username, revocable_entitlement_uuids ) return - log.info('B2C_SUBSCRIPTIONS: Starting revoke_entitlements_and_downgrade_courses_to_audit for user %s and ' + log.info('B2C_SUBSCRIPTIONS: Starting revoke_entitlements_and_downgrade_courses_to_audit for user [%s] and ' 'awarded_cert_course_ids %s and revocable_entitlement_uuids %s from retry task', - user_id, + username, awarded_cert_course_ids, revocable_entitlement_uuids) - revoke_entitlements_and_downgrade_courses_to_audit(course_entitlements, user_id, awarded_cert_course_ids, + revoke_entitlements_and_downgrade_courses_to_audit(course_entitlements, username, awarded_cert_course_ids, revocable_entitlement_uuids) else: log.info('B2C_SUBSCRIPTIONS: Entitlements not found for the provided entitlements uuids %s ' - 'for user_id %s duing the retry_revoke_subscriptions_verified_access task', + 'for user [%s] duing the retry_revoke_subscriptions_verified_access task', revocable_entitlement_uuids, - user_id) + username) diff --git a/common/djangoapps/entitlements/utils.py b/common/djangoapps/entitlements/utils.py index 397b0cd1c0..89a00914de 100644 --- a/common/djangoapps/entitlements/utils.py +++ b/common/djangoapps/entitlements/utils.py @@ -61,7 +61,7 @@ def is_course_run_entitlement_fulfillable( return course_overview.start and can_upgrade and (is_enrolled or can_enroll) -def revoke_entitlements_and_downgrade_courses_to_audit(course_entitlements, user_id, awarded_cert_course_ids, +def revoke_entitlements_and_downgrade_courses_to_audit(course_entitlements, username, awarded_cert_course_ids, revocable_entitlement_uuids): """ This method expires the entitlements for provided course_entitlements and also moves the enrollments @@ -69,8 +69,8 @@ def revoke_entitlements_and_downgrade_courses_to_audit(course_entitlements, user """ log.info('B2C_SUBSCRIPTIONS: Starting revoke_entitlements_and_downgrade_courses_to_audit for ' - 'user: %s, course_entitlements_uuids: %s, awarded_cert_course_ids: %s', - user_id, + 'user: [%s], course_entitlements_uuids: %s, awarded_cert_course_ids: %s', + username, revocable_entitlement_uuids, awarded_cert_course_ids) for course_entitlement in course_entitlements: @@ -87,11 +87,11 @@ def revoke_entitlements_and_downgrade_courses_to_audit(course_entitlements, user course_entitlement.expire_entitlement() update_enrollment(username, str(course_id), CourseMode.AUDIT, include_expired=True) else: - log.warning('B2C_SUBSCRIPTIONS: Enrollment mode mismatch for user_id: %s and course_id: %s', - user_id, + log.warning('B2C_SUBSCRIPTIONS: Enrollment mode mismatch for user: %s and course_id: %s', + username, course_id) log.info('B2C_SUBSCRIPTIONS: Completed revoke_entitlements_and_downgrade_courses_to_audit for ' - 'user: %s, course_entitlements_uuids: %s, awarded_cert_course_ids: %s', - user_id, + 'user: [%s], course_entitlements_uuids: %s, awarded_cert_course_ids: %s', + username, revocable_entitlement_uuids, awarded_cert_course_ids) diff --git a/openedx/core/djangoapps/credentials/utils.py b/openedx/core/djangoapps/credentials/utils.py index 893aba7871..9e7f61e189 100644 --- a/openedx/core/djangoapps/credentials/utils.py +++ b/openedx/core/djangoapps/credentials/utils.py @@ -110,11 +110,11 @@ def get_credentials(user, program_uuid=None, credential_type=None): ) -def get_courses_completion_status(lms_user_id, course_run_ids): +def get_courses_completion_status(username, course_run_ids): """ - Given the lms_user_id and course run ids, checks for course completion status + Given the username and course run ids, checks for course completion status Arguments: - lms_user_id (User): The user to authenticate as when requesting credentials. + username (User): Username of the user whose credentials are being requested. course_run_ids(List): list of course run ids for which we need to check the completion status Returns: list of course_run_ids for which user has completed the course @@ -134,7 +134,7 @@ def get_courses_completion_status(lms_user_id, course_run_ids): api_response = api_client.post( completion_status_url, json={ - 'lms_user_id': lms_user_id, + 'username': username, 'course_runs': course_run_ids, } ) @@ -142,16 +142,16 @@ def get_courses_completion_status(lms_user_id, course_run_ids): course_completion_response = api_response.json() except Exception as exc: # pylint: disable=broad-except log.exception("An unexpected error occurred while reqeusting course completion statuses " - "for lms_user_id [%s] for course_run_ids [%s] with exc [%s]:", - lms_user_id, + "for user [%s] for course_run_ids [%s] with exc [%s]:", + username, course_run_ids, exc ) return [], True # Yes, This is course_credentials_data. The key is named status but # it contains all the courses data from credentials. - log.info("Course completion status response for lms_user_id [%s] for course_run_ids [%s] is [%s]", - lms_user_id, + log.info("Course completion status response for user [%s] for course_run_ids [%s] is [%s]", + username, course_run_ids, course_completion_response) course_credentials_data = course_completion_response.get('status', []) @@ -159,8 +159,8 @@ def get_courses_completion_status(lms_user_id, course_run_ids): filtered_records = [course_data['course_run']['key'] for course_data in course_credentials_data if course_data['course_run']['key'] in course_run_ids and course_data['status'] == settings.CREDENTIALS_COURSE_COMPLETION_STATE] - log.info("Filtered course completion status response for lms_user_id [%s] for course_run_ids [%s] is [%s]", - lms_user_id, + log.info("Filtered course completion status response for user [%s] for course_run_ids [%s] is [%s]", + username, course_run_ids, filtered_records) return filtered_records, False From 53718094a593f9a3ffe73c7d6e2cb648c3f6392e Mon Sep 17 00:00:00 2001 From: David Ormsbee Date: Thu, 13 Jul 2023 09:43:24 -0400 Subject: [PATCH 05/21] fix: update Studio DEFAULT_FILE_STORAGE to s3boto3 s3boto is no longer a supported backend in django-storages, so this was causing failues on startup when trying to run with the tutor-minio plugin. --- cms/envs/production.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cms/envs/production.py b/cms/envs/production.py index c3c88abeb6..92e14799b9 100644 --- a/cms/envs/production.py +++ b/cms/envs/production.py @@ -338,7 +338,7 @@ AWS_S3_CUSTOM_DOMAIN = AUTH_TOKENS.get('AWS_S3_CUSTOM_DOMAIN', 'edxuploads.s3.am if AUTH_TOKENS.get('DEFAULT_FILE_STORAGE'): DEFAULT_FILE_STORAGE = AUTH_TOKENS.get('DEFAULT_FILE_STORAGE') elif AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY: - DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' + DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' else: DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' From 4b64d8342d69bb92afe56a49c61bc7e5663aceff Mon Sep 17 00:00:00 2001 From: Kyle McCormick Date: Mon, 17 Jul 2023 13:26:58 -0400 Subject: [PATCH 06/21] build: copy from node_modules using NPM postinstall hook, not Paver (#32717) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit During the review of ADR 17 [1], Régis pointed out [2] that the shell script which replaces Paver's `process_npm_assets` could be automatically invoked as an NPM post-install hook, ensuring that the step is seamlessly executed whenever `npm install` is run. I had avoided using that suggestion, as I worried that it would make it harder to move node_modules out of the edx-platform directory in Tutor's openedx image. Since then, two things have changed. Firstly, Tutor v16's new persistent mounts interface [3] has lessened the importance of moving node_modules. Secondly, I have realized that using a post-install hook would not preclude us from modifying the underlying script (scripts/copy-node-modules.sh) to look in an alternative location for node_modules, should that end up being something we want to do. This commit modifies the ADR based on those findings, stubs out Paver's `process_npm_assets`, and adds the suggested post-install hook and replacement Bash script. References: 1. https://github.com/openedx/edx-platform/blob/master/docs/decisions/0017-reimplement-asset-processing.rst 2. https://github.com/openedx/edx-platform/pull/31790#discussion_r1122802492 3. https://github.com/overhangio/tutor/blob/master/CHANGELOG.md#v1600-2023-06-14 Part of: https://github.com/openedx/edx-platform/issues/31604 --- .../0017-reimplement-asset-processing.rst | 27 +++--- package.json | 3 + pavelib/assets.py | 90 +------------------ pavelib/utils/test/suites/js_suite.py | 2 - scripts/copy-node-modules.sh | 90 +++++++++++++++++++ 5 files changed, 105 insertions(+), 107 deletions(-) create mode 100755 scripts/copy-node-modules.sh diff --git a/docs/decisions/0017-reimplement-asset-processing.rst b/docs/decisions/0017-reimplement-asset-processing.rst index 7f16dcc249..7ffb7ab5e8 100644 --- a/docs/decisions/0017-reimplement-asset-processing.rst +++ b/docs/decisions/0017-reimplement-asset-processing.rst @@ -131,17 +131,17 @@ The three top-level edx-platform asset processing actions are *build*, *collect* - ``scripts/build-assets.sh`` A Bash script that contains all build stages, with subcommands available for running each stage separately. Its command-line interface inspired by Tutor's ``openedx-assets`` script. The script will be runnable on any POSIX system, including macOS and Ubuntu and it will linted for common shell scripting mistakes using `shellcheck `_. - + * - + **Build stage 1: Copy npm-installed assets** from node_modules to other folders in edx-platform. They are used by certain especially-old legacy LMS & CMS frontends that are not set up to work with npm directly. - ``paver update_assets --skip-collect`` Implemented in Python within update_assets. There is no standalone command for it. - - ``scripts/build-assets.sh npm`` + - ``npm install`` + + An NPM post-install hook will automatically call scripts/copy-node-modules.sh, a pure Bash reimplementation of the node_modules asset copying, whenever ``npm install`` is invoked. - Pure Bash reimplementation. See *Rejected Alternatives* for a note about this. - * - + **Build stage 2: Copy XModule fragments** from the xmodule source tree over to input directories for Webpack and SCSS compilation. This is required for a hard-coded list of old XModule-style XBlocks. This is not required for new pure XBlocks, which include (or pip-install) their assets into edx-platform as ready-to-serve JS/CSS/etc fragments. - ``paver process_xmodule_assets``, or @@ -156,7 +156,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* + `Reimplement this step in Bash `_. + `Remove the need for this step entirely `_. - + * - + **Build stage 3: Run Webpack** in order to to shim, minify, otherwise process, and bundle JS modules. This requires a call to the npm-installed ``webpack`` binary. - ``paver webpack`` @@ -168,7 +168,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* Bash wrapper around a call to webpack. The script will accept parameters rather than looking up Django settings itself. The print_setting command will still be available for distributions to use to extract ``STATIC_ROOT`` from Django settings, but it will only need to be run once. As described in **Build Configuration** below, unnecessary Django settings will be removed. Some distributions may not even need to look up ``STATIC_ROOT``; Tutor, for example, will probably render ``STATIC_ROOT`` directly into the environment variable ``OPENEDX_BUILD_ASSETS_OPTS`` variable, described in the **Build Configuration**. - + * - + **Build stage 4: Compile default SCSS** into CSS for legacy LMS/CMS frontends. - ``paver compile_sass`` @@ -180,7 +180,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* - ``scripts/build-assets.sh css`` Bash reimplementation, calling ``node-sass`` and ``rtlcss``. - + The initial implementation of build-assets.sh may use ``sassc``, a CLI provided by libsass, instead of node-sass. Then, ``sassc`` can be replaced by ``node-sass`` as part of a subsequent `edx-platform frontend framework upgrade effort `_. * - + **Build stage 5: Compile themes' SCSS** into CSS for legacy LMS/CMS frontends. The default SCSS is used as a base, and theme-provided SCSS files are used as overrides. Themes are searched for from some number of operator-specified theme directories. @@ -198,7 +198,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* The management command will remain available, but it will need to be updated to point at the Bash script, which will replace the paver task (see build stage 4 for details). The overall asset *build* action will use the Bash script; this means that list of theme directories will need to be provided as arguments, but it ensures that the build can remain Python-free. - + * - **Collect** the built static assets from edx-platform to another location (the ``STATIC_ROOT``) so that they can be efficiently served *without* Django's webserver. This step, by nature, requires Python and Django in order to find and organize the assets, which may come from edx-platform itself or from its many installed Python and NPM packages. This is only needed for **production** environments, where it is usually desirable to serve assets with something efficient like NGINX. - ``paver update_assets`` @@ -210,7 +210,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* - ``./manage.py lms collectstatic --noinput && ./manage.py cms collectstatic --noinput`` The standard Django interface will be used without a wrapper. The ignore patterns will be added to edx-platform's `staticfiles app configuration `_ so that they do not need to be supplied as part of the command. - + * - **Watch** static assets for changes in the background. When a change occurs, rebuild them automatically, so that the Django webserver picks up the changes. This is only necessary in **development** environments. A few different sets of assets may be watched: XModule fragments, Webpack assets, default SCSS, and theme SCSS. - ``paver watch_assets`` @@ -300,7 +300,7 @@ Either way, the migration path is straightforward: * - ``openedx-assets build`` - ``scripts/build-assets.sh`` * - ``openedx-assets npm`` - - ``scripts/build-assets.sh npm`` + - ``scripts/copy-node-modules.sh # (automatically invoked by 'npm install'!) * - ``openedx-assets xmodule`` - ``scripts/build-assets.sh xmodule`` * - ``openedx-assets common`` @@ -328,13 +328,6 @@ OpenCraft has also performed a discovery on a `modernized system for static asse Rejected Alternatives ********************* -Copy node_modules via npm post-install -====================================== - -It was noted that `npm supports lifecycle scripts `_ in package.json, including ``postinstall``. We could use a post-install script to copy assets out of node_modules; this would occurr automatically after ``npm install``. Arguably, this would be more idiomatic than this ADR's proposal of ``scripts/build-assets.sh npm``. - -For now, we decided against this. While it seems like a good potential future improvement, we are currently unsure how it would interact with `moving node_modules out of edx-platform in Tutor `_, which is a motivation behind this ADR. For example, if node_modules could be located anywhere on the image, then we are not sure how the post-install script could know its target directory without us hard-coding Tutor's directory structure into the script. - Live with the problem ====================== diff --git a/package.json b/package.json index fb855d32a3..ebdcf240e1 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,9 @@ "name": "edx", "version": "0.1.0", "repository": "https://github.com/openedx/edx-platform", + "scripts": { + "postinstall": "scripts/copy-node-modules.sh" + }, "dependencies": { "@babel/core": "7.19.0", "@babel/plugin-proposal-object-rest-spread": "^7.18.9", diff --git a/pavelib/assets.py b/pavelib/assets.py index 3bf8a9ce88..8b1b4e7065 100644 --- a/pavelib/assets.py +++ b/pavelib/assets.py @@ -46,39 +46,6 @@ COMMON_LOOKUP_PATHS = [ path('node_modules'), ] -# A list of NPM installed libraries that should be copied into the common -# static directory. -# If string ends with '/' then all file in the directory will be copied. -NPM_INSTALLED_LIBRARIES = [ - 'backbone.paginator/lib/backbone.paginator.js', - 'backbone/backbone.js', - 'bootstrap/dist/js/bootstrap.bundle.js', - 'hls.js/dist/hls.js', - 'jquery-migrate/dist/jquery-migrate.js', - 'jquery.scrollto/jquery.scrollTo.js', - 'jquery/dist/jquery.js', - 'moment-timezone/builds/moment-timezone-with-data.js', - 'moment/min/moment-with-locales.js', - 'picturefill/dist/picturefill.js', - 'requirejs/require.js', - 'underscore.string/dist/underscore.string.js', - 'underscore/underscore.js', - '@edx/studio-frontend/dist/', - 'which-country/index.js' -] - -# A list of NPM installed developer libraries that should be copied into the common -# static directory only in development mode. -NPM_INSTALLED_DEVELOPER_LIBRARIES = [ - 'sinon/pkg/sinon.js', - 'squirejs/src/Squire.js', -] - -# Directory to install static vendor files -NPM_JS_VENDOR_DIRECTORY = path('common/static/common/js/vendor') -NPM_CSS_VENDOR_DIRECTORY = path("common/static/common/css/vendor") -NPM_CSS_DIRECTORY = path("common/static/common/css") - # system specific lookup path additions, add sass dirs if one system depends on the sass files for other systems SASS_LOOKUP_DEPENDENCIES = { 'cms': [path('lms') / 'static' / 'sass' / 'partials', ], @@ -644,60 +611,8 @@ def process_npm_assets(): """ Process vendor libraries installed via NPM. """ - def copy_vendor_library(library, skip_if_missing=False): - """ - Copies a vendor library to the shared vendor directory. - """ - if library.startswith('node_modules/'): - library_path = library - else: - library_path = f'node_modules/{library}' - - if library.endswith('.css') or library.endswith('.css.map'): - vendor_dir = NPM_CSS_VENDOR_DIRECTORY - else: - vendor_dir = NPM_JS_VENDOR_DIRECTORY - if os.path.exists(library_path): - sh('/bin/cp -rf {library_path} {vendor_dir}'.format( - library_path=library_path, - vendor_dir=vendor_dir, - )) - elif not skip_if_missing: - raise Exception(f'Missing vendor file {library_path}') - - def copy_vendor_library_dir(library_dir, skip_if_missing=False): - """ - Copies all vendor libraries in directory to the shared vendor directory. - """ - library_dir_path = f'node_modules/{library_dir}' - print(f'Copying vendor library dir: {library_dir_path}') - if os.path.exists(library_dir_path): - for dirpath, _, filenames in os.walk(library_dir_path): - for filename in filenames: - copy_vendor_library(os.path.join(dirpath, filename), skip_if_missing=skip_if_missing) - - # Skip processing of the libraries if this is just a dry run - if tasks.environment.dry_run: - tasks.environment.info("install npm_assets") - return - - # Ensure that the vendor directory exists - NPM_JS_VENDOR_DIRECTORY.mkdir_p() - NPM_CSS_DIRECTORY.mkdir_p() - NPM_CSS_VENDOR_DIRECTORY.mkdir_p() - - # Copy each file to the vendor directory, overwriting any existing file. - print("Copying vendor files into static directory") - for library in NPM_INSTALLED_LIBRARIES: - if library.endswith('/'): - copy_vendor_library_dir(library) - else: - copy_vendor_library(library) - - # Copy over each developer library too if they have been installed - print("Copying developer vendor files into static directory") - for library in NPM_INSTALLED_DEVELOPER_LIBRARIES: - copy_vendor_library(library, skip_if_missing=True) + print("\t\tProcessing NPM assets is now done automatically in an npm post-install hook.") + print("\t\tThis function is now a no-op.") @task @@ -983,7 +898,6 @@ def update_assets(args): collect_log_args = {} process_xmodule_assets() - process_npm_assets() # Build Webpack call_task('pavelib.assets.webpack', options={'settings': args.settings}) diff --git a/pavelib/utils/test/suites/js_suite.py b/pavelib/utils/test/suites/js_suite.py index a6896e2858..65c5feaf84 100644 --- a/pavelib/utils/test/suites/js_suite.py +++ b/pavelib/utils/test/suites/js_suite.py @@ -39,8 +39,6 @@ class JsTestSuite(TestSuite): if self.mode == 'run' and not self.run_under_coverage: test_utils.clean_dir(self.report_dir) - assets.process_npm_assets() - @property def _default_subsuites(self): """ diff --git a/scripts/copy-node-modules.sh b/scripts/copy-node-modules.sh new file mode 100755 index 0000000000..db997da957 --- /dev/null +++ b/scripts/copy-node-modules.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +# Copy certain npm-installed assets from node_modules to other folders in +# edx-platform. These assets are used by certain especially-old legacy LMS & CMS +# frontends that are not set up to import from node_modules directly. +# Many of the destination folders are named "vendor", because they originally +# held vendored-in (directly-committed) libraries; once we moved most frontends +# to use NPM, we decided to keep library versions in-sync by copying to the +# former "vendor" directories. + +# Enable stricter error handling. +set -euo pipefail + +COL_LOG="\e[36m" # Log/step/section color (cyan) +COL_OFF="\e[0m" # Normal color + +# Keep these as variables in case we ever want to parameterize this script's +# input or output dirs, as proposed in: +# https://github.com/openedx/wg-developer-experience/issues/150 +# https://github.com/openedx/wg-developer-experience/issues/151 +node_modules="node_modules" +vendor_js="common/static/common/js/vendor" +vendor_css="common/static/common/css/vendor" + +# Stylized logging. +log ( ) { + echo -e "${COL_LOG}$* $COL_OFF" +} + +log "=====================================================================================" +log "Copying required assets from node_modules..." +log "-------------------------------------------------------------------------------" + +# Start echoing all commands back to user for ease of debugging. +set -x + +log "Ensuring vendor directories exist..." +mkdir -p "$vendor_js" +mkdir -p "$vendor_css" + +log "Copying studio-frontend JS & CSS from node_modules into vendor directores..." +while read -r -d $'\0' src_file ; do + if [[ "$src_file" = *.css ]] || [[ "$src_file" = *.css.map ]] ; then + cp --force "$src_file" "$vendor_css" + else + cp --force "$src_file" "$vendor_js" + fi +done < <(find "$node_modules/@edx/studio-frontend/dist" -type f -print0) + +log "Copying certain JS modules from node_modules into vendor directory..." +cp --force \ + "$node_modules/backbone.paginator/lib/backbone.paginator.js" \ + "$node_modules/backbone/backbone.js" \ + "$node_modules/bootstrap/dist/js/bootstrap.bundle.js" \ + "$node_modules/hls.js/dist/hls.js" \ + "$node_modules/jquery-migrate/dist/jquery-migrate.js" \ + "$node_modules/jquery.scrollto/jquery.scrollTo.js" \ + "$node_modules/jquery/dist/jquery.js" \ + "$node_modules/moment-timezone/builds/moment-timezone-with-data.js" \ + "$node_modules/moment/min/moment-with-locales.js" \ + "$node_modules/picturefill/dist/picturefill.js" \ + "$node_modules/requirejs/require.js" \ + "$node_modules/underscore.string/dist/underscore.string.js" \ + "$node_modules/underscore/underscore.js" \ + "$node_modules/which-country/index.js" \ + "$vendor_js" + +log "Copying certain JS developer modules into vendor directory..." +if [[ "${NODE_ENV:-production}" = development ]] ; then + cp --force "$node_modules/sinon/pkg/sinon.js" "$vendor_js" + cp --force "$node_modules/squirejs/src/Squire.js" "$vendor_js" +else + # TODO: https://github.com/openedx/edx-platform/issues/31768 + # In the old implementation of this scipt (pavelib/assets.py), these two + # developer libraries were copied into the JS vendor directory whether not + # the build was for prod or dev. In order to exactly match the output of + # the old script, this script will also copy them in for prod builds. + # However, in the future, it would be good to only copy them for dev + # builds. Furthermore, these libraries should not be `npm install`ed + # into prod builds in the first place. + cp --force "$node_modules/sinon/pkg/sinon.js" "$vendor_js" || true # "|| true" means "tolerate errors"; in this case, + cp --force "$node_modules/squirejs/src/Squire.js" "$vendor_js" || true # that's "tolerate if these files don't exist." +fi + +# Done echoing. +set +x + +log "-------------------------------------------------------------------------------" +log " Done copying required assets from node_modules." +log "=====================================================================================" + From df6c0fc69fddbdeb0c2758e9104ad406ddea731a Mon Sep 17 00:00:00 2001 From: leangseu-edx <83240113+leangseu-edx@users.noreply.github.com> Date: Mon, 17 Jul 2023 13:43:17 -0400 Subject: [PATCH 07/21] fix: work around existing css that fail to draw mathjax (#32764) --- cms/djangoapps/pipeline_js/js/xmodule.js | 9 ++++++++- cms/templates/content_libraries/xblock_iframe.html | 7 +++++++ common/templates/mathjax_include.html | 7 +++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/cms/djangoapps/pipeline_js/js/xmodule.js b/cms/djangoapps/pipeline_js/js/xmodule.js index 96f8f1afa9..9688d97a4b 100644 --- a/cms/djangoapps/pipeline_js/js/xmodule.js +++ b/cms/djangoapps/pipeline_js/js/xmodule.js @@ -63,7 +63,14 @@ define( t = -1; }, delay); } - }; + + // this is added to compensate for custom css that accidentally hide mathjax + $('.MathJax_SVG>svg').toArray().forEach(el => { + if ($(el).width() === 0) { + $(el).css('max-width', 'inherit'); + } + }); + }; } ); window.CodeMirror = CodeMirror; diff --git a/cms/templates/content_libraries/xblock_iframe.html b/cms/templates/content_libraries/xblock_iframe.html index 79d0de1409..6a60530cc9 100644 --- a/cms/templates/content_libraries/xblock_iframe.html +++ b/cms/templates/content_libraries/xblock_iframe.html @@ -115,6 +115,13 @@ t = -1; }, delay); } + + // this is added to compensate for custom css that accidentally hide mathjax + $('.MathJax_SVG>svg').toArray().forEach(el => { + if ($(el).width() === 0) { + $(el).css('max-width', 'inherit'); + } + }); }; From 90c41555096bea89b10f5e2f8730d333af7ff581 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 14 Jul 2023 13:28:58 -0400 Subject: [PATCH 08/21] docs: Don't build certain doc strings for now. We ran into memory issues at RTD so skip the xmodule, cms and common docs for now so we can get some of the stuff up. We can come back to it later once we make things better. --- docs/guides/conf.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/guides/conf.py b/docs/guides/conf.py index b18de3c48d..0135285246 100644 --- a/docs/guides/conf.py +++ b/docs/guides/conf.py @@ -278,11 +278,14 @@ autodoc_mock_imports = [ # run sphinx-apidoc against and the directories under "docs" in which to store # the generated *.rst files modules = { - 'cms': 'references/docstrings/cms', 'lms': 'references/docstrings/lms', 'openedx': 'references/docstrings/openedx', - 'common': 'references/docstrings/common', - 'xmodule': 'references/docstrings/xmodule', + # Commenting this out for now because they blow up the build + # time and memory limits for RTD. We can come back to these + # later once we get parallel builds working hopefully. + # 'cms': 'references/docstrings/cms', + # 'common': 'references/docstrings/common', + # 'xmodule': 'references/docstrings/xmodule', } From 1de6ff7ad2de8d95fa2af335567e6a73ed28ce1b Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Mon, 17 Jul 2023 12:39:34 -0400 Subject: [PATCH 09/21] chore: Run `make upgrade` --- requirements/edx-sandbox/py38.txt | 2 +- requirements/edx/base.txt | 10 +- requirements/edx/coverage.txt | 2 +- requirements/edx/development.txt | 504 +++++++++-- requirements/edx/doc.txt | 1394 ++++++++++++++++++++++++++++- requirements/edx/testing.txt | 24 +- requirements/pip-tools.txt | 3 +- requirements/pip.txt | 2 +- 8 files changed, 1810 insertions(+), 131 deletions(-) diff --git a/requirements/edx-sandbox/py38.txt b/requirements/edx-sandbox/py38.txt index 725fed910e..98b4b5521e 100644 --- a/requirements/edx-sandbox/py38.txt +++ b/requirements/edx-sandbox/py38.txt @@ -8,7 +8,7 @@ cffi==1.15.1 # via cryptography chem==1.2.0 # via -r requirements/edx-sandbox/py38.in -click==8.1.4 +click==8.1.5 # via # -c requirements/edx-sandbox/../constraints.txt # nltk diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index ad06c70931..c6ce8d79bf 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -121,7 +121,7 @@ charset-normalizer==2.0.12 # snowflake-connector-python chem==1.2.0 # via -r requirements/edx/kernel.in -click==8.1.4 +click==8.1.5 # via # -c requirements/edx/../constraints.txt # celery @@ -657,7 +657,7 @@ jsonfield==3.1.0 # lti-consumer-xblock # ora2 # outcome-surveys -jsonschema==4.18.2 +jsonschema==4.18.3 # via optimizely-sdk jsonschema-specifications==2023.6.1 # via jsonschema @@ -1013,7 +1013,7 @@ requests-oauthlib==1.3.1 # via # -r requirements/edx/kernel.in # social-auth-core -rpds-py==0.8.10 +rpds-py==0.8.11 # via # jsonschema # referencing @@ -1170,7 +1170,7 @@ vine==5.0.0 # kombu voluptuous==0.13.1 # via ora2 -walrus==0.9.2 +walrus==0.9.3 # via edx-event-bus-redis watchdog==3.0.0 # via -r requirements/edx/paver.txt @@ -1233,7 +1233,7 @@ xss-utils==0.4.0 # via -r requirements/edx/kernel.in yarl==1.9.2 # via aiohttp -zipp==3.16.1 +zipp==3.16.2 # via # importlib-metadata # importlib-resources diff --git a/requirements/edx/coverage.txt b/requirements/edx/coverage.txt index fbf2b5cfb8..c0b44e4fdd 100644 --- a/requirements/edx/coverage.txt +++ b/requirements/edx/coverage.txt @@ -8,7 +8,7 @@ chardet==5.1.0 # via diff-cover coverage==7.2.7 # via -r requirements/edx/coverage.in -diff-cover==7.6.1 +diff-cover==7.7.0 # via -r requirements/edx/coverage.in jinja2==3.1.2 # via diff-cover diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 49b95e50a5..7aa4814c51 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -9,13 +9,17 @@ accessible-pygments==0.0.4 # -r requirements/edx/doc.txt # pydata-sphinx-theme acid-xblock==0.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt aiohttp==3.8.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # geoip2 aiosignal==1.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp alabaster==0.7.13 @@ -25,15 +29,20 @@ alabaster==0.7.13 algoliasearch==2.6.3 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt amqp==5.1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # kombu analytics-python==1.4.post1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt aniso8601==9.0.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-tincan-py35 annotated-types==0.5.0 @@ -47,15 +56,18 @@ anyio==3.7.1 # starlette appdirs==1.4.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # fs asgiref==3.7.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django # django-countries asn1crypto==1.5.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # oscrypto # snowflake-connector-python @@ -66,6 +78,7 @@ astroid==2.13.5 # pylint-celery async-timeout==4.0.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp # redis @@ -91,10 +104,12 @@ babel==2.11.0 # sphinx backoff==1.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # analytics-python backports-zoneinfo[tzdata]==0.2.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery # icalendar @@ -107,10 +122,12 @@ beautifulsoup4==4.12.2 # pynliner billiard==4.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery bleach[css]==6.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # lti-consumer-xblock @@ -123,10 +140,12 @@ bok-choy==2.0.2 boto==2.39.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt boto3==1.7.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-ses # fs-s3fs @@ -134,11 +153,14 @@ boto3==1.7.0 botocore==1.10.84 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # boto3 # s3transfer bridgekeeper==0.9 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt build==0.10.0 # via # -r requirements/edx/../pip-tools.txt @@ -146,6 +168,7 @@ build==0.10.0 celery==5.3.1 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-celery-results # django-user-tasks @@ -164,12 +187,14 @@ certifi==2023.5.7 # snowflake-connector-python cffi==1.15.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # cryptography # pynacl # snowflake-connector-python chardet==5.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # diff-cover # pysrt @@ -182,8 +207,10 @@ charset-normalizer==2.0.12 # requests # snowflake-connector-python chem==1.2.0 - # via -r requirements/edx/testing.txt -click==8.1.4 + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt +click==8.1.5 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/../pip-tools.txt @@ -206,6 +233,7 @@ click==8.1.4 # uvicorn click-didyoumean==0.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery click-log==0.4.0 @@ -214,10 +242,12 @@ click-log==0.4.0 # edx-lint click-plugins==1.1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery click-repl==0.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery code-annotations==1.3.0 @@ -228,13 +258,17 @@ code-annotations==1.3.0 # edx-lint # edx-toggles codejail-includes==1.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt coreapi==2.3.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # drf-yasg coreschema==0.0.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # coreapi # drf-yasg @@ -243,10 +277,13 @@ coverage[toml]==7.2.7 # -r requirements/edx/testing.txt # pytest-cov crowdsourcehinter-xblock==0.6 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt cryptography==38.0.4 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-fernet-fields # djfernet @@ -264,6 +301,7 @@ cssselect==1.2.0 # pyquery cssutils==2.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pynliner ddt==1.6.0 @@ -274,6 +312,7 @@ deepmerge==1.1.0 # sphinxcontrib-openapi defusedxml==0.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # djangorestframework-xml # ora2 @@ -281,21 +320,23 @@ defusedxml==0.7.1 # social-auth-core deprecated==1.2.14 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # jwcrypto -diff-cover==7.6.1 +diff-cover==7.7.0 # via -r requirements/edx/testing.txt dill==0.3.6 # via # -r requirements/edx/testing.txt # pylint -distlib==0.3.6 +distlib==0.3.7 # via # -r requirements/edx/testing.txt # virtualenv django==3.2.20 # via # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-appconf # django-celery-results @@ -366,32 +407,42 @@ django==3.2.20 # xss-utils django-appconf==1.0.5 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-statici18n django-cache-memoize==0.1.10 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-celery-results==2.5.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-classy-tags==4.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-sekizai django-config-models==2.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-name-affirmation # lti-consumer-xblock django-cors-headers==4.2.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-countries==7.5.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-crum==0.7.9 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils # edx-enterprise @@ -403,14 +454,17 @@ django-debug-toolbar==4.1.0 # via -r requirements/edx/development.in django-environ==0.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-blockstore django-fernet-fields==0.6 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-filter==23.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # learner-pathway-progress @@ -419,17 +473,22 @@ django-filter==23.2 django-ipware==4.0.2 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-proctoring django-js-asset==2.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-mptt django-method-override==1.0.4 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-model-utils==4.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-user-tasks # edx-bulk-grades @@ -451,35 +510,49 @@ django-model-utils==4.3.1 # super-csv django-mptt==0.14.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki django-multi-email-field==0.7.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-mysql==4.11.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-oauth-toolkit==1.3.2 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt django-object-actions==4.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-pipeline==2.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-ratelimit==4.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-sekizai==4.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki django-ses==3.5.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-simple-history==3.0.0 # via # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-name-affirmation @@ -488,21 +561,28 @@ django-simple-history==3.0.0 # learner-pathway-progress # ora2 django-splash==1.3.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-statici18n==2.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # lti-consumer-xblock # xblock-drag-and-drop-v2 django-storages==1.9.1 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval django-user-tasks==3.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-waffle==3.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils # edx-drf-extensions @@ -513,11 +593,13 @@ django-waffle==3.0.0 django-webpack-loader==0.7.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring djangorestframework==3.14.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-config-models # django-user-tasks @@ -538,10 +620,12 @@ djangorestframework==3.14.0 # super-csv djangorestframework-xml==2.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise djfernet==0.8.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval docutils==0.19 @@ -554,57 +638,80 @@ docutils==0.19 # sphinx # sphinx-mdinclude done-xblock==2.0.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt drf-jwt==1.19.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-drf-extensions drf-nested-routers==0.93.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-blockstore drf-yasg==1.21.5 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-api-doc-tools edx-ace==1.6.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-api-doc-tools==1.6.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-name-affirmation # openedx-blockstore edx-auth-backends==4.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-blockstore edx-braze-client==0.1.7 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-bulk-grades==1.0.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # staff-graded-xblock edx-ccx-keys==1.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-celeryutils==1.2.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-name-affirmation # super-csv edx-codejail==3.3.3 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-completion==4.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-django-release-util==1.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval # openedx-blockstore edx-django-sites-extensions==4.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-django-utils==5.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-config-models # edx-drf-extensions @@ -623,6 +730,7 @@ edx-django-utils==5.5.0 # super-csv edx-drf-extensions==8.8.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-completion # edx-enterprise @@ -636,24 +744,35 @@ edx-drf-extensions==8.8.0 edx-enterprise==4.0.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # learner-pathway-progress edx-event-bus-kafka==5.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-event-bus-redis==0.3.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-i18n-tools==1.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 edx-lint==5.3.4 # via -r requirements/edx/testing.txt edx-milestones==0.4.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-name-affirmation==2.3.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-opaque-keys[django]==2.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-bulk-grades # edx-ccx-keys @@ -671,36 +790,50 @@ edx-opaque-keys[django]==2.3.0 # ora2 # outcome-surveys edx-organizations==6.11.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-proctoring==4.16.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring-proctortrack edx-proctoring-proctortrack==1.0.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-rbac==1.7.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise edx-rest-api-client==5.5.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-proctoring edx-search==3.6.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-sga==0.22.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-submissions==3.5.6 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 edx-tincan-py35==1.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise edx-toggles==5.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-completion # edx-event-bus-kafka @@ -711,28 +844,40 @@ edx-toggles==5.0.0 # learner-pathway-progress # ora2 edx-token-utils==0.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-user-state-client==1.3.2 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-when==2.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring edxval==2.3.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt elasticsearch==7.13.4 # via # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-search enmerkar==0.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # enmerkar-underscore enmerkar-underscore==2.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt event-tracking==2.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring # edx-search @@ -757,10 +902,12 @@ fastapi==0.100.0 # pact-python fastavro==1.8.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-events filelock==3.12.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # snowflake-connector-python # tox @@ -769,25 +916,31 @@ freezegun==1.2.2 # via -r requirements/edx/testing.txt frozenlist==1.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp # aiosignal fs==2.0.27 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # fs-s3fs # openedx-django-pyfs # xblock fs-s3fs==0.1.8 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-pyfs future==0.18.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pyjwkest geoip2==4.7.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt gitdb==4.0.10 # via # -r requirements/edx/doc.txt @@ -795,22 +948,29 @@ gitdb==4.0.10 gitpython==3.1.32 # via -r requirements/edx/doc.txt glob2==0.7 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt grimp==2.5 # via # -r requirements/edx/testing.txt # import-linter gunicorn==20.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt h11==0.14.0 # via # -r requirements/edx/testing.txt # httpcore # uvicorn help-tokens==2.2.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt html5lib==1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 httpcore==0.16.3 @@ -824,7 +984,9 @@ httpx==0.23.3 # -r requirements/edx/testing.txt # pact-python icalendar==5.0.7 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt idna==3.4 # via # -r requirements/edx/doc.txt @@ -856,6 +1018,7 @@ importlib-resources==6.0.0 # jsonschema-specifications inflection==0.5.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # drf-yasg iniconfig==2.0.0 @@ -864,12 +1027,16 @@ iniconfig==2.0.0 # pytest interchange==2021.0.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # py2neo ipaddress==1.0.23 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt isodate==0.6.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # python3-saml isort==5.12.0 @@ -878,6 +1045,7 @@ isort==5.12.0 # pylint itypes==1.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # coreapi jinja2==3.1.2 @@ -890,19 +1058,23 @@ jinja2==3.1.2 # sphinx jmespath==0.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # boto3 # botocore joblib==1.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # nltk jsondiff==2.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise jsonfield==3.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-celeryutils # edx-enterprise @@ -912,7 +1084,7 @@ jsonfield==3.1.0 # lti-consumer-xblock # ora2 # outcome-surveys -jsonschema==4.18.2 +jsonschema==4.18.3 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -925,16 +1097,21 @@ jsonschema-specifications==2023.6.1 # jsonschema jwcrypto==1.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pylti1p3 kombu==5.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery laboratory==1.0.2 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt lazy==1.5 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # acid-xblock # bok-choy @@ -946,19 +1123,26 @@ lazy-object-proxy==1.9.0 # -r requirements/edx/testing.txt # astroid learner-pathway-progress==1.3.4 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt libsass==0.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 loremipsum==1.0.5 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 lti-consumer-xblock==9.5.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt lxml==4.9.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval # lti-consumer-xblock @@ -970,9 +1154,12 @@ lxml==4.9.3 # xblock # xmlsec mailsnake==1.6.4 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt mako==1.2.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # acid-xblock # lti-consumer-xblock @@ -981,12 +1168,14 @@ mako==1.2.4 markdown==3.3.7 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki # staff-graded-xblock # xblock-poll markey==0.8 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # enmerkar-underscore markupsafe==2.1.3 @@ -1000,6 +1189,7 @@ markupsafe==2.1.3 # xblock maxminddb==2.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # geoip2 mccabe==0.7.0 @@ -1011,20 +1201,27 @@ mistune==2.0.5 # -r requirements/edx/doc.txt # sphinx-mdinclude mock==5.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt mongoengine==0.27.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt monotonic==1.6 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # analytics-python # py2neo mpmath==1.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # sympy multidict==6.0.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp # yarl @@ -1034,20 +1231,26 @@ mypy-extensions==1.0.0 # via mypy mysqlclient==2.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-blockstore newrelic==8.8.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils nltk==3.8.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # chem nodeenv==1.8.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt numpy==1.22.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # chem # openedx-calc @@ -1056,48 +1259,71 @@ numpy==1.22.4 oauthlib==3.0.1 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-oauth-toolkit # lti-consumer-xblock # requests-oauthlib # social-auth-core olxcleaner==0.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-blockstore==1.3.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-calc==3.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-django-pyfs==3.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # xblock openedx-django-require==2.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-django-wiki==2.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-events==8.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-event-bus-kafka # edx-event-bus-redis # skill-tagging openedx-filters==1.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # lti-consumer-xblock # skill-tagging openedx-mongodbproxy==0.2.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt optimizely-sdk==4.1.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt ora2==5.1.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt oscrypto==1.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # snowflake-connector-python outcome-surveys==2.4.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt packaging==23.1 # via # -r requirements/edx/../pip-tools.txt @@ -1115,21 +1341,26 @@ pact-python==2.0.0 # via -r requirements/edx/testing.txt pansi==2020.7.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # py2neo path==16.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-i18n-tools # path-py path-py==12.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # ora2 # staff-graded-xblock paver==1.3.4 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pbr==5.11.1 # via # -r requirements/edx/doc.txt @@ -1137,6 +1368,7 @@ pbr==5.11.1 # stevedore pgpy==0.6.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise picobox==3.0.0 @@ -1144,10 +1376,13 @@ picobox==3.0.0 # -r requirements/edx/doc.txt # sphinxcontrib-openapi piexif==1.1.3 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pillow==9.5.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-organizations @@ -1159,7 +1394,7 @@ pkgutil-resolve-name==1.3.10 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # jsonschema -platformdirs==3.8.1 +platformdirs==3.9.1 # via # -r requirements/edx/testing.txt # pylint @@ -1172,14 +1407,17 @@ pluggy==1.2.0 # tox polib==1.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-i18n-tools prompt-toolkit==3.0.39 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # click-repl psutil==5.9.5 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils # pact-python @@ -1191,9 +1429,11 @@ py==1.11.0 py2neo==2021.2.3 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt pyasn1==0.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pgpy pycodestyle==2.8.0 @@ -1201,23 +1441,27 @@ pycodestyle==2.8.0 # -c requirements/edx/../constraints.txt # -r requirements/edx/testing.txt pycountry==22.3.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pycparser==2.21 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # cffi pycryptodomex==3.18.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring # lti-consumer-xblock # pyjwkest # snowflake-connector-python -pydantic==2.0.2 +pydantic==2.0.3 # via # -r requirements/edx/testing.txt # fastapi -pydantic-core==2.1.2 +pydantic-core==2.3.0 # via # -r requirements/edx/testing.txt # pydantic @@ -1237,11 +1481,13 @@ pygments==2.15.1 # sphinx-mdinclude pyjwkest==1.4.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-token-utils # lti-consumer-xblock pyjwt[crypto]==2.7.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # drf-jwt # edx-auth-backends @@ -1253,6 +1499,7 @@ pyjwt[crypto]==2.7.0 # social-auth-core pylatexenc==2.10 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # olxcleaner pylint==2.15.10 @@ -1280,12 +1527,17 @@ pylint-plugin-utils==0.8.2 pylint-pytest==0.3.0 # via -r requirements/edx/testing.txt pylti1p3==2.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pymemcache==4.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pymongo==3.13.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-opaque-keys # event-tracking @@ -1293,18 +1545,23 @@ pymongo==3.13.0 # openedx-mongodbproxy pynacl==1.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils pynliner==0.8.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pyopenssl==22.0.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # optimizely-sdk # snowflake-connector-python pyparsing==3.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # chem # openedx-calc @@ -1316,10 +1573,12 @@ pyquery==2.0.0 # via -r requirements/edx/testing.txt pyrsistent==0.19.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # optimizely-sdk pysrt==1.1.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval pytest==7.4.0 @@ -1351,6 +1610,7 @@ pytest-xdist[psutil]==3.3.1 # via -r requirements/edx/testing.txt python-dateutil==2.8.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # analytics-python # botocore @@ -1366,7 +1626,9 @@ python-dateutil==2.8.2 # ora2 # xblock python-memcached==1.59 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt python-slugify==8.0.1 # via # -r requirements/edx/doc.txt @@ -1374,14 +1636,18 @@ python-slugify==8.0.1 # code-annotations python-swiftclient==4.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 python3-openid==3.2.0 ; python_version >= "3" # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # social-auth-core python3-saml==1.15.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pytz==2022.7.1 # via # -c requirements/edx/../constraints.txt @@ -1408,7 +1674,9 @@ pytz==2022.7.1 # snowflake-connector-python # xblock pyuca==1.2 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pywatchman==1.4.1 # via -r requirements/edx/development.in pyyaml==6.0 @@ -1421,11 +1689,16 @@ pyyaml==6.0 # sphinxcontrib-openapi # xblock random2==1.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt recommender-xblock==2.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt redis==4.6.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # walrus referencing==0.29.1 @@ -1436,6 +1709,7 @@ referencing==0.29.1 # jsonschema-specifications regex==2023.6.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # nltk requests==2.31.0 @@ -1467,13 +1741,14 @@ requests==2.31.0 # sphinx requests-oauthlib==1.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # social-auth-core rfc3986[idna2008]==1.5.0 # via # -r requirements/edx/testing.txt # httpx -rpds-py==0.8.10 +rpds-py==0.8.11 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1481,28 +1756,34 @@ rpds-py==0.8.10 # referencing ruamel-yaml==0.17.32 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # drf-yasg ruamel-yaml-clib==0.2.7 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ruamel-yaml rules==3.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-proctoring s3transfer==0.1.13 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # boto3 sailthru-client==2.2.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-ace scipy==1.7.3 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # chem # openedx-calc @@ -1512,12 +1793,16 @@ selenium==3.141.0 # bok-choy semantic-version==2.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-drf-extensions shapely==2.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt simplejson==3.19.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # sailthru-client # super-csv @@ -1560,9 +1845,12 @@ six==1.16.0 # sphinxcontrib-httpdomain # tox skill-tagging==0.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt slumber==0.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-bulk-grades # edx-enterprise @@ -1583,25 +1871,30 @@ snowballstemmer==2.2.0 # sphinx snowflake-connector-python==3.0.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise social-auth-app-django==5.0.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-auth-backends social-auth-core==4.3.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-auth-backends # social-auth-app-django sorl-thumbnail==12.9.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki sortedcontainers==2.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # snowflake-connector-python soupsieve==2.4.1 @@ -1660,12 +1953,15 @@ sphinxext-rediraffe==0.2.7 # via -r requirements/edx/doc.txt sqlparse==0.4.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django # django-debug-toolbar # openedx-blockstore staff-graded-xblock==2.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt starlette==0.27.0 # via # -r requirements/edx/testing.txt @@ -1681,14 +1977,17 @@ stevedore==5.1.0 # edx-opaque-keys super-csv==3.0.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-bulk-grades sympy==1.12 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-calc testfixtures==7.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise text-unidecode==1.3 @@ -1698,6 +1997,7 @@ text-unidecode==1.3 # python-slugify tinycss2==1.1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # bleach toml==0.10.2 @@ -1728,6 +2028,7 @@ tox-battery==0.6.1 # via -r requirements/edx/testing.txt tqdm==4.65.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # nltk typing-extensions==4.7.1 @@ -1753,17 +2054,20 @@ typing-extensions==4.7.1 # starlette tzdata==2023.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # backports-zoneinfo # celery unicodecsv==0.14.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise unidiff==0.7.5 # via -r requirements/edx/testing.txt uritemplate==4.1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # coreapi # drf-yasg @@ -1779,39 +2083,48 @@ urllib3==1.26.16 # selenium # snowflake-connector-python user-util==1.0.0 - # via -r requirements/edx/testing.txt -uvicorn==0.22.0 + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt +uvicorn==0.23.0 # via # -r requirements/edx/testing.txt # pact-python vine==5.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # amqp # celery # kombu -virtualenv==20.23.1 +virtualenv==20.24.0 # via # -r requirements/edx/testing.txt # tox voluptuous==0.13.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 vulture==2.7 # via -r requirements/edx/development.in -walrus==0.9.2 +walrus==0.9.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-event-bus-redis watchdog==3.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt wcwidth==0.2.6 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # prompt-toolkit web-fragments==2.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # crowdsourcehinter-xblock # edx-sga @@ -1820,12 +2133,14 @@ web-fragments==2.0.0 # xblock-utils webencodings==0.5.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # bleach # html5lib # tinycss2 webob==1.8.7 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # xblock wheel==0.40.0 @@ -1834,11 +2149,13 @@ wheel==0.40.0 # pip-tools wrapt==1.15.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # astroid # deprecated xblock[django]==1.6.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # acid-xblock # crowdsourcehinter-xblock @@ -1854,13 +2171,20 @@ xblock[django]==1.6.2 # xblock-poll # xblock-utils xblock-drag-and-drop-v2==3.2.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt xblock-google-drive==0.3.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt xblock-poll==1.13.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt xblock-utils==3.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-sga # lti-consumer-xblock @@ -1869,15 +2193,19 @@ xblock-utils==3.2.0 # xblock-google-drive xmlsec==1.3.13 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # python3-saml xss-utils==0.4.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt yarl==1.9.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp -zipp==3.16.1 +zipp==3.16.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index c5852af197..4de37923f3 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -6,111 +6,1313 @@ # accessible-pygments==0.0.4 # via pydata-sphinx-theme +acid-xblock==0.2.1 + # via -r requirements/edx/base.txt +aiohttp==3.8.4 + # via + # -r requirements/edx/base.txt + # geoip2 +aiosignal==1.3.1 + # via + # -r requirements/edx/base.txt + # aiohttp alabaster==0.7.13 # via sphinx +algoliasearch==2.6.3 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt +amqp==5.1.1 + # via + # -r requirements/edx/base.txt + # kombu +analytics-python==1.4.post1 + # via -r requirements/edx/base.txt +aniso8601==9.0.1 + # via + # -r requirements/edx/base.txt + # edx-tincan-py35 +appdirs==1.4.4 + # via + # -r requirements/edx/base.txt + # fs +asgiref==3.7.2 + # via + # -r requirements/edx/base.txt + # django + # django-countries +asn1crypto==1.5.1 + # via + # -r requirements/edx/base.txt + # oscrypto + # snowflake-connector-python +async-timeout==4.0.2 + # via + # -r requirements/edx/base.txt + # aiohttp + # redis attrs==23.1.0 # via + # -r requirements/edx/base.txt + # aiohttp + # edx-ace # jsonschema + # lti-consumer-xblock + # openedx-blockstore + # openedx-events # referencing babel==2.11.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # enmerkar + # enmerkar-underscore # pydata-sphinx-theme # sphinx +backoff==1.10.0 + # via + # -r requirements/edx/base.txt + # analytics-python +backports-zoneinfo[tzdata]==0.2.1 + # via + # -r requirements/edx/base.txt + # celery + # icalendar + # kombu beautifulsoup4==4.12.2 - # via pydata-sphinx-theme + # via + # -r requirements/edx/base.txt + # pydata-sphinx-theme + # pynliner +billiard==4.1.0 + # via + # -r requirements/edx/base.txt + # celery +bleach[css]==6.0.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # lti-consumer-xblock + # openedx-django-wiki + # ora2 + # xblock-drag-and-drop-v2 + # xblock-poll +boto==2.39.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt +boto3==1.7.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-ses + # fs-s3fs + # ora2 +botocore==1.10.84 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # boto3 + # s3transfer +bridgekeeper==0.9 + # via -r requirements/edx/base.txt +celery==5.3.1 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-celery-results + # django-user-tasks + # edx-celeryutils + # edx-enterprise + # event-tracking certifi==2023.5.7 - # via requests + # via + # -r requirements/edx/base.txt + # elasticsearch + # py2neo + # requests + # snowflake-connector-python +cffi==1.15.1 + # via + # -r requirements/edx/base.txt + # cryptography + # pynacl + # snowflake-connector-python +chardet==5.1.0 + # via + # -r requirements/edx/base.txt + # pysrt charset-normalizer==2.0.12 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # aiohttp # requests -click==8.1.4 + # snowflake-connector-python +chem==1.2.0 + # via -r requirements/edx/base.txt +click==8.1.5 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # celery + # click-didyoumean + # click-plugins + # click-repl # code-annotations + # edx-django-utils + # nltk + # user-util +click-didyoumean==0.3.0 + # via + # -r requirements/edx/base.txt + # celery +click-plugins==1.1.1 + # via + # -r requirements/edx/base.txt + # celery +click-repl==0.3.0 + # via + # -r requirements/edx/base.txt + # celery code-annotations==1.3.0 - # via -r requirements/edx/doc.in + # via + # -r requirements/edx/base.txt + # -r requirements/edx/doc.in + # edx-enterprise + # edx-toggles +codejail-includes==1.0.0 + # via -r requirements/edx/base.txt +coreapi==2.3.3 + # via + # -r requirements/edx/base.txt + # drf-yasg +coreschema==0.0.4 + # via + # -r requirements/edx/base.txt + # coreapi + # drf-yasg +crowdsourcehinter-xblock==0.6 + # via -r requirements/edx/base.txt +cryptography==38.0.4 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-fernet-fields + # djfernet + # edx-enterprise + # jwcrypto + # optimizely-sdk + # pgpy + # pyjwt + # pyopenssl + # snowflake-connector-python + # social-auth-core +cssutils==2.7.1 + # via + # -r requirements/edx/base.txt + # pynliner deepmerge==1.1.0 # via sphinxcontrib-openapi +defusedxml==0.7.1 + # via + # -r requirements/edx/base.txt + # djangorestframework-xml + # ora2 + # python3-openid + # social-auth-core +deprecated==1.2.14 + # via + # -r requirements/edx/base.txt + # jwcrypto +django==3.2.20 + # via + # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/base.txt + # django-appconf + # django-celery-results + # django-classy-tags + # django-config-models + # django-cors-headers + # django-crum + # django-fernet-fields + # django-filter + # django-js-asset + # django-method-override + # django-model-utils + # django-multi-email-field + # django-mysql + # django-oauth-toolkit + # django-sekizai + # django-ses + # django-splash + # django-statici18n + # django-storages + # django-user-tasks + # djangorestframework + # drf-jwt + # drf-nested-routers + # drf-yasg + # edx-ace + # edx-api-doc-tools + # edx-auth-backends + # edx-bulk-grades + # edx-celeryutils + # edx-completion + # edx-django-release-util + # edx-django-sites-extensions + # edx-django-utils + # edx-drf-extensions + # edx-enterprise + # edx-event-bus-kafka + # edx-event-bus-redis + # edx-i18n-tools + # edx-milestones + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-rbac + # edx-search + # edx-submissions + # edx-toggles + # edx-token-utils + # edx-when + # edxval + # enmerkar + # enmerkar-underscore + # event-tracking + # help-tokens + # jsonfield + # learner-pathway-progress + # lti-consumer-xblock + # openedx-blockstore + # openedx-django-pyfs + # openedx-django-wiki + # openedx-events + # openedx-filters + # ora2 + # outcome-surveys + # skill-tagging + # super-csv + # xss-utils +django-appconf==1.0.5 + # via + # -r requirements/edx/base.txt + # django-statici18n +django-cache-memoize==0.1.10 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-celery-results==2.5.1 + # via -r requirements/edx/base.txt +django-classy-tags==4.0.0 + # via + # -r requirements/edx/base.txt + # django-sekizai +django-config-models==2.3.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # edx-name-affirmation + # lti-consumer-xblock +django-cors-headers==4.2.0 + # via -r requirements/edx/base.txt +django-countries==7.5.1 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-crum==0.7.9 + # via + # -r requirements/edx/base.txt + # edx-django-utils + # edx-enterprise + # edx-proctoring + # edx-rbac + # edx-toggles + # super-csv +django-environ==0.10.0 + # via + # -r requirements/edx/base.txt + # openedx-blockstore +django-fernet-fields==0.6 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-filter==23.2 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # learner-pathway-progress + # lti-consumer-xblock + # openedx-blockstore +django-ipware==4.0.2 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-enterprise + # edx-proctoring +django-js-asset==2.1.0 + # via + # -r requirements/edx/base.txt + # django-mptt +django-method-override==1.0.4 + # via -r requirements/edx/base.txt +django-model-utils==4.3.1 + # via + # -r requirements/edx/base.txt + # django-user-tasks + # edx-bulk-grades + # edx-celeryutils + # edx-completion + # edx-enterprise + # edx-milestones + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-rbac + # edx-submissions + # edx-when + # edxval + # learner-pathway-progress + # ora2 + # outcome-surveys + # skill-tagging + # super-csv +django-mptt==0.14.0 + # via + # -r requirements/edx/base.txt + # openedx-django-wiki +django-multi-email-field==0.7.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-mysql==4.11.0 + # via -r requirements/edx/base.txt +django-oauth-toolkit==1.3.2 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt +django-object-actions==4.1.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-pipeline==2.1.0 + # via -r requirements/edx/base.txt +django-ratelimit==4.0.0 + # via -r requirements/edx/base.txt +django-sekizai==4.1.0 + # via + # -r requirements/edx/base.txt + # openedx-django-wiki +django-ses==3.5.0 + # via -r requirements/edx/base.txt +django-simple-history==3.0.0 + # via + # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/base.txt + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # learner-pathway-progress + # ora2 +django-splash==1.3.0 + # via -r requirements/edx/base.txt +django-statici18n==2.3.1 + # via + # -r requirements/edx/base.txt + # lti-consumer-xblock + # xblock-drag-and-drop-v2 +django-storages==1.9.1 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edxval +django-user-tasks==3.0.0 + # via -r requirements/edx/base.txt +django-waffle==3.0.0 + # via + # -r requirements/edx/base.txt + # edx-django-utils + # edx-drf-extensions + # edx-enterprise + # edx-proctoring + # edx-toggles + # openedx-blockstore +django-webpack-loader==0.7.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-proctoring +djangorestframework==3.14.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-config-models + # django-user-tasks + # drf-jwt + # drf-nested-routers + # drf-yasg + # edx-api-doc-tools + # edx-completion + # edx-drf-extensions + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-submissions + # learner-pathway-progress + # openedx-blockstore + # ora2 + # super-csv +djangorestframework-xml==2.0.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +djfernet==0.8.1 + # via + # -r requirements/edx/base.txt + # edxval docutils==0.19 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # botocore # pydata-sphinx-theme # sphinx # sphinx-mdinclude +done-xblock==2.0.5 + # via -r requirements/edx/base.txt +drf-jwt==1.19.2 + # via + # -r requirements/edx/base.txt + # edx-drf-extensions +drf-nested-routers==0.93.4 + # via + # -r requirements/edx/base.txt + # openedx-blockstore +drf-yasg==1.21.5 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-api-doc-tools +edx-ace==1.6.1 + # via -r requirements/edx/base.txt +edx-api-doc-tools==1.6.0 + # via + # -r requirements/edx/base.txt + # edx-name-affirmation + # openedx-blockstore +edx-auth-backends==4.1.0 + # via + # -r requirements/edx/base.txt + # openedx-blockstore +edx-braze-client==0.1.7 + # via -r requirements/edx/base.txt +edx-bulk-grades==1.0.1 + # via + # -r requirements/edx/base.txt + # staff-graded-xblock +edx-ccx-keys==1.2.1 + # via -r requirements/edx/base.txt +edx-celeryutils==1.2.2 + # via + # -r requirements/edx/base.txt + # edx-name-affirmation + # super-csv +edx-codejail==3.3.3 + # via -r requirements/edx/base.txt +edx-completion==4.2.1 + # via -r requirements/edx/base.txt +edx-django-release-util==1.2.0 + # via + # -r requirements/edx/base.txt + # edxval + # openedx-blockstore +edx-django-sites-extensions==4.0.0 + # via -r requirements/edx/base.txt +edx-django-utils==5.5.0 + # via + # -r requirements/edx/base.txt + # django-config-models + # edx-drf-extensions + # edx-enterprise + # edx-event-bus-kafka + # edx-event-bus-redis + # edx-name-affirmation + # edx-rest-api-client + # edx-toggles + # edx-when + # event-tracking + # learner-pathway-progress + # openedx-blockstore + # ora2 + # outcome-surveys + # super-csv +edx-drf-extensions==8.8.0 + # via + # -r requirements/edx/base.txt + # edx-completion + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-rbac + # edx-when + # edxval + # learner-pathway-progress +edx-enterprise==4.0.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # learner-pathway-progress +edx-event-bus-kafka==5.1.0 + # via -r requirements/edx/base.txt +edx-event-bus-redis==0.3.1 + # via -r requirements/edx/base.txt +edx-i18n-tools==1.0.0 + # via + # -r requirements/edx/base.txt + # ora2 +edx-milestones==0.4.0 + # via -r requirements/edx/base.txt +edx-name-affirmation==2.3.5 + # via -r requirements/edx/base.txt +edx-opaque-keys[django]==2.3.0 + # via + # -r requirements/edx/base.txt + # edx-bulk-grades + # edx-ccx-keys + # edx-completion + # edx-drf-extensions + # edx-enterprise + # edx-milestones + # edx-organizations + # edx-proctoring + # edx-user-state-client + # edx-when + # learner-pathway-progress + # lti-consumer-xblock + # openedx-events + # ora2 + # outcome-surveys +edx-organizations==6.11.1 + # via -r requirements/edx/base.txt +edx-proctoring==4.16.0 + # via + # -r requirements/edx/base.txt + # edx-proctoring-proctortrack +edx-proctoring-proctortrack==1.0.5 + # via -r requirements/edx/base.txt +edx-rbac==1.7.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +edx-rest-api-client==5.5.2 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # edx-proctoring +edx-search==3.6.0 + # via -r requirements/edx/base.txt +edx-sga==0.22.0 + # via -r requirements/edx/base.txt +edx-submissions==3.5.6 + # via + # -r requirements/edx/base.txt + # ora2 +edx-tincan-py35==1.0.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +edx-toggles==5.0.0 + # via + # -r requirements/edx/base.txt + # edx-completion + # edx-event-bus-kafka + # edx-event-bus-redis + # edx-name-affirmation + # edx-search + # edxval + # learner-pathway-progress + # ora2 +edx-token-utils==0.2.1 + # via -r requirements/edx/base.txt +edx-user-state-client==1.3.2 + # via -r requirements/edx/base.txt +edx-when==2.4.0 + # via + # -r requirements/edx/base.txt + # edx-proctoring +edxval==2.3.0 + # via -r requirements/edx/base.txt +elasticsearch==7.13.4 + # via + # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/base.txt + # edx-search +enmerkar==0.7.1 + # via + # -r requirements/edx/base.txt + # enmerkar-underscore +enmerkar-underscore==2.1.0 + # via -r requirements/edx/base.txt +event-tracking==2.1.0 + # via + # -r requirements/edx/base.txt + # edx-proctoring + # edx-search +fastavro==1.8.0 + # via + # -r requirements/edx/base.txt + # openedx-events +filelock==3.12.2 + # via + # -r requirements/edx/base.txt + # snowflake-connector-python +frozenlist==1.4.0 + # via + # -r requirements/edx/base.txt + # aiohttp + # aiosignal +fs==2.0.27 + # via + # -r requirements/edx/base.txt + # fs-s3fs + # openedx-django-pyfs + # xblock +fs-s3fs==0.1.8 + # via + # -r requirements/edx/base.txt + # openedx-django-pyfs +future==0.18.3 + # via + # -r requirements/edx/base.txt + # pyjwkest +geoip2==4.7.0 + # via -r requirements/edx/base.txt gitdb==4.0.10 # via gitpython gitpython==3.1.32 # via -r requirements/edx/doc.in +glob2==0.7 + # via -r requirements/edx/base.txt +gunicorn==20.1.0 + # via -r requirements/edx/base.txt +help-tokens==2.2.0 + # via -r requirements/edx/base.txt +html5lib==1.1 + # via + # -r requirements/edx/base.txt + # ora2 +icalendar==5.0.7 + # via -r requirements/edx/base.txt idna==3.4 - # via requests + # via + # -r requirements/edx/base.txt + # optimizely-sdk + # requests + # snowflake-connector-python + # yarl imagesize==1.4.1 # via sphinx importlib-metadata==6.8.0 - # via sphinx + # via + # -r requirements/edx/base.txt + # markdown + # sphinx importlib-resources==6.0.0 # via + # -r requirements/edx/base.txt # jsonschema # jsonschema-specifications +inflection==0.5.1 + # via + # -r requirements/edx/base.txt + # drf-yasg +interchange==2021.0.4 + # via + # -r requirements/edx/base.txt + # py2neo +ipaddress==1.0.23 + # via -r requirements/edx/base.txt +isodate==0.6.1 + # via + # -r requirements/edx/base.txt + # python3-saml +itypes==1.2.0 + # via + # -r requirements/edx/base.txt + # coreapi jinja2==3.1.2 # via + # -r requirements/edx/base.txt # code-annotations + # coreschema # sphinx -jsonschema==4.18.2 - # via sphinxcontrib-openapi +jmespath==0.10.0 + # via + # -r requirements/edx/base.txt + # boto3 + # botocore +joblib==1.3.1 + # via + # -r requirements/edx/base.txt + # nltk +jsondiff==2.0.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +jsonfield==3.1.0 + # via + # -r requirements/edx/base.txt + # edx-celeryutils + # edx-enterprise + # edx-proctoring + # edx-submissions + # learner-pathway-progress + # lti-consumer-xblock + # ora2 + # outcome-surveys +jsonschema==4.18.3 + # via + # -r requirements/edx/base.txt + # optimizely-sdk + # sphinxcontrib-openapi jsonschema-specifications==2023.6.1 - # via jsonschema + # via + # -r requirements/edx/base.txt + # jsonschema +jwcrypto==1.5.0 + # via + # -r requirements/edx/base.txt + # pylti1p3 +kombu==5.3.1 + # via + # -r requirements/edx/base.txt + # celery +laboratory==1.0.2 + # via -r requirements/edx/base.txt +lazy==1.5 + # via + # -r requirements/edx/base.txt + # acid-xblock + # lti-consumer-xblock + # ora2 + # xblock +learner-pathway-progress==1.3.4 + # via -r requirements/edx/base.txt +libsass==0.10.0 + # via + # -r requirements/edx/base.txt + # ora2 +loremipsum==1.0.5 + # via + # -r requirements/edx/base.txt + # ora2 +lti-consumer-xblock==9.5.5 + # via -r requirements/edx/base.txt +lxml==4.9.3 + # via + # -r requirements/edx/base.txt + # edxval + # lti-consumer-xblock + # olxcleaner + # openedx-calc + # ora2 + # python3-saml + # xblock + # xmlsec +mailsnake==1.6.4 + # via -r requirements/edx/base.txt +mako==1.2.4 + # via + # -r requirements/edx/base.txt + # acid-xblock + # lti-consumer-xblock + # xblock-google-drive + # xblock-utils +markdown==3.3.7 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # openedx-django-wiki + # staff-graded-xblock + # xblock-poll +markey==0.8 + # via + # -r requirements/edx/base.txt + # enmerkar-underscore markupsafe==2.1.3 - # via jinja2 + # via + # -r requirements/edx/base.txt + # chem + # jinja2 + # mako + # openedx-calc + # xblock +maxminddb==2.4.0 + # via + # -r requirements/edx/base.txt + # geoip2 mistune==2.0.5 # via sphinx-mdinclude +mock==5.1.0 + # via -r requirements/edx/base.txt +mongoengine==0.27.0 + # via -r requirements/edx/base.txt +monotonic==1.6 + # via + # -r requirements/edx/base.txt + # analytics-python + # py2neo +mpmath==1.3.0 + # via + # -r requirements/edx/base.txt + # sympy +multidict==6.0.4 + # via + # -r requirements/edx/base.txt + # aiohttp + # yarl +mysqlclient==2.2.0 + # via + # -r requirements/edx/base.txt + # openedx-blockstore +newrelic==8.8.1 + # via + # -r requirements/edx/base.txt + # edx-django-utils +nltk==3.8.1 + # via + # -r requirements/edx/base.txt + # chem +nodeenv==1.8.0 + # via -r requirements/edx/base.txt +numpy==1.22.4 + # via + # -r requirements/edx/base.txt + # chem + # openedx-calc + # scipy + # shapely +oauthlib==3.0.1 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-oauth-toolkit + # lti-consumer-xblock + # requests-oauthlib + # social-auth-core +olxcleaner==0.2.1 + # via -r requirements/edx/base.txt +openedx-blockstore==1.3.1 + # via -r requirements/edx/base.txt +openedx-calc==3.0.1 + # via -r requirements/edx/base.txt +openedx-django-pyfs==3.4.0 + # via + # -r requirements/edx/base.txt + # xblock +openedx-django-require==2.0.0 + # via -r requirements/edx/base.txt +openedx-django-wiki==2.0.0 + # via -r requirements/edx/base.txt +openedx-events==8.2.0 + # via + # -r requirements/edx/base.txt + # edx-event-bus-kafka + # edx-event-bus-redis + # skill-tagging +openedx-filters==1.3.0 + # via + # -r requirements/edx/base.txt + # lti-consumer-xblock + # skill-tagging +openedx-mongodbproxy==0.2.0 + # via -r requirements/edx/base.txt +optimizely-sdk==4.1.1 + # via -r requirements/edx/base.txt +ora2==5.1.1 + # via -r requirements/edx/base.txt +oscrypto==1.3.0 + # via + # -r requirements/edx/base.txt + # snowflake-connector-python +outcome-surveys==2.4.0 + # via -r requirements/edx/base.txt packaging==23.1 # via + # -r requirements/edx/base.txt + # drf-yasg + # py2neo # pydata-sphinx-theme + # snowflake-connector-python # sphinx +pansi==2020.7.3 + # via + # -r requirements/edx/base.txt + # py2neo +path==16.7.1 + # via + # -r requirements/edx/base.txt + # edx-i18n-tools + # path-py +path-py==12.5.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # ora2 + # staff-graded-xblock +paver==1.3.4 + # via -r requirements/edx/base.txt pbr==5.11.1 - # via stevedore + # via + # -r requirements/edx/base.txt + # stevedore +pgpy==0.6.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise picobox==3.0.0 # via sphinxcontrib-openapi +piexif==1.1.3 + # via -r requirements/edx/base.txt +pillow==9.5.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-enterprise + # edx-organizations + # edxval pkgutil-resolve-name==1.3.10 - # via jsonschema + # via + # -r requirements/edx/base.txt + # jsonschema +polib==1.2.0 + # via + # -r requirements/edx/base.txt + # edx-i18n-tools +prompt-toolkit==3.0.39 + # via + # -r requirements/edx/base.txt + # click-repl +psutil==5.9.5 + # via + # -r requirements/edx/base.txt + # edx-django-utils +py2neo==2021.2.3 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt +pyasn1==0.5.0 + # via + # -r requirements/edx/base.txt + # pgpy +pycountry==22.3.5 + # via -r requirements/edx/base.txt +pycparser==2.21 + # via + # -r requirements/edx/base.txt + # cffi +pycryptodomex==3.18.0 + # via + # -r requirements/edx/base.txt + # edx-proctoring + # lti-consumer-xblock + # pyjwkest + # snowflake-connector-python pydata-sphinx-theme==0.13.3 # via sphinx-book-theme pygments==2.15.1 # via + # -r requirements/edx/base.txt # accessible-pygments + # py2neo # pydata-sphinx-theme # sphinx # sphinx-mdinclude +pyjwkest==1.4.2 + # via + # -r requirements/edx/base.txt + # edx-token-utils + # lti-consumer-xblock +pyjwt[crypto]==2.7.0 + # via + # -r requirements/edx/base.txt + # drf-jwt + # edx-auth-backends + # edx-drf-extensions + # edx-proctoring + # edx-rest-api-client + # pylti1p3 + # snowflake-connector-python + # social-auth-core +pylatexenc==2.10 + # via + # -r requirements/edx/base.txt + # olxcleaner +pylti1p3==2.0.0 + # via -r requirements/edx/base.txt +pymemcache==4.0.0 + # via -r requirements/edx/base.txt +pymongo==3.13.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-opaque-keys + # event-tracking + # mongoengine + # openedx-mongodbproxy +pynacl==1.5.0 + # via + # -r requirements/edx/base.txt + # edx-django-utils +pynliner==0.8.0 + # via -r requirements/edx/base.txt +pyopenssl==22.0.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # optimizely-sdk + # snowflake-connector-python +pyparsing==3.1.0 + # via + # -r requirements/edx/base.txt + # chem + # openedx-calc +pyrsistent==0.19.3 + # via + # -r requirements/edx/base.txt + # optimizely-sdk +pysrt==1.1.2 + # via + # -r requirements/edx/base.txt + # edxval +python-dateutil==2.8.2 + # via + # -r requirements/edx/base.txt + # analytics-python + # botocore + # celery + # edx-ace + # edx-drf-extensions + # edx-enterprise + # edx-proctoring + # icalendar + # olxcleaner + # ora2 + # xblock +python-memcached==1.59 + # via -r requirements/edx/base.txt python-slugify==8.0.1 - # via code-annotations + # via + # -r requirements/edx/base.txt + # code-annotations +python-swiftclient==4.3.0 + # via + # -r requirements/edx/base.txt + # ora2 +python3-openid==3.2.0 ; python_version >= "3" + # via + # -r requirements/edx/base.txt + # social-auth-core +python3-saml==1.15.0 + # via -r requirements/edx/base.txt pytz==2022.7.1 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt # babel + # django + # django-ses + # djangorestframework + # drf-yasg + # edx-completion + # edx-enterprise + # edx-proctoring + # edx-submissions + # edx-tincan-py35 + # event-tracking + # fs + # icalendar + # interchange + # learner-pathway-progress + # olxcleaner + # openedx-blockstore + # ora2 + # snowflake-connector-python + # xblock +pyuca==1.2 + # via -r requirements/edx/base.txt pyyaml==6.0 # via + # -r requirements/edx/base.txt # code-annotations + # edx-django-release-util + # edx-i18n-tools # sphinxcontrib-openapi + # xblock +random2==1.0.1 + # via -r requirements/edx/base.txt +recommender-xblock==2.0.1 + # via -r requirements/edx/base.txt +redis==4.6.0 + # via + # -r requirements/edx/base.txt + # walrus referencing==0.29.1 # via + # -r requirements/edx/base.txt # jsonschema # jsonschema-specifications -requests==2.31.0 - # via sphinx -rpds-py==0.8.10 +regex==2023.6.3 # via + # -r requirements/edx/base.txt + # nltk +requests==2.31.0 + # via + # -r requirements/edx/base.txt + # algoliasearch + # analytics-python + # coreapi + # django-oauth-toolkit + # edx-bulk-grades + # edx-drf-extensions + # edx-enterprise + # edx-rest-api-client + # geoip2 + # learner-pathway-progress + # mailsnake + # optimizely-sdk + # outcome-surveys + # pyjwkest + # pylti1p3 + # python-swiftclient + # requests-oauthlib + # sailthru-client + # slumber + # snowflake-connector-python + # social-auth-core + # sphinx +requests-oauthlib==1.3.1 + # via + # -r requirements/edx/base.txt + # social-auth-core +rpds-py==0.8.11 + # via + # -r requirements/edx/base.txt # jsonschema # referencing +ruamel-yaml==0.17.32 + # via + # -r requirements/edx/base.txt + # drf-yasg +ruamel-yaml-clib==0.2.7 + # via + # -r requirements/edx/base.txt + # ruamel-yaml +rules==3.3 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # edx-proctoring +s3transfer==0.1.13 + # via + # -r requirements/edx/base.txt + # boto3 +sailthru-client==2.2.3 + # via + # -r requirements/edx/base.txt + # edx-ace +scipy==1.7.3 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # chem + # openedx-calc +semantic-version==2.10.0 + # via + # -r requirements/edx/base.txt + # edx-drf-extensions +shapely==2.0.1 + # via -r requirements/edx/base.txt +simplejson==3.19.1 + # via + # -r requirements/edx/base.txt + # sailthru-client + # super-csv + # xblock-utils six==1.16.0 - # via sphinxcontrib-httpdomain + # via + # -r requirements/edx/base.txt + # analytics-python + # bleach + # chem + # codejail-includes + # crowdsourcehinter-xblock + # edx-ace + # edx-auth-backends + # edx-ccx-keys + # edx-codejail + # edx-django-release-util + # edx-drf-extensions + # edx-milestones + # edx-rbac + # event-tracking + # fs + # fs-s3fs + # html5lib + # interchange + # isodate + # libsass + # optimizely-sdk + # pansi + # paver + # py2neo + # pyjwkest + # python-dateutil + # python-memcached + # sphinxcontrib-httpdomain +skill-tagging==0.1.0 + # via -r requirements/edx/base.txt +slumber==0.7.1 + # via + # -r requirements/edx/base.txt + # edx-bulk-grades + # edx-enterprise + # edx-rest-api-client smmap==5.0.0 # via gitdb snowballstemmer==2.2.0 # via sphinx +snowflake-connector-python==3.0.4 + # via + # -r requirements/edx/base.txt + # edx-enterprise +social-auth-app-django==5.0.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-auth-backends +social-auth-core==4.3.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-auth-backends + # social-auth-app-django +sorl-thumbnail==12.9.0 + # via + # -r requirements/edx/base.txt + # openedx-django-wiki +sortedcontainers==2.4.0 + # via + # -r requirements/edx/base.txt + # snowflake-connector-python soupsieve==2.4.1 - # via beautifulsoup4 + # via + # -r requirements/edx/base.txt + # beautifulsoup4 sphinx==6.2.1 # via # -r requirements/edx/doc.in @@ -144,17 +1346,165 @@ sphinxcontrib-serializinghtml==1.1.5 # via sphinx sphinxext-rediraffe==0.2.7 # via -r requirements/edx/doc.in +sqlparse==0.4.4 + # via + # -r requirements/edx/base.txt + # django + # openedx-blockstore +staff-graded-xblock==2.0.1 + # via -r requirements/edx/base.txt stevedore==5.1.0 - # via code-annotations + # via + # -r requirements/edx/base.txt + # code-annotations + # edx-ace + # edx-django-utils + # edx-enterprise + # edx-opaque-keys +super-csv==3.0.1 + # via + # -r requirements/edx/base.txt + # edx-bulk-grades +sympy==1.12 + # via + # -r requirements/edx/base.txt + # openedx-calc +testfixtures==7.1.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise text-unidecode==1.3 - # via python-slugify + # via + # -r requirements/edx/base.txt + # python-slugify +tinycss2==1.1.1 + # via + # -r requirements/edx/base.txt + # bleach +tqdm==4.65.0 + # via + # -r requirements/edx/base.txt + # nltk typing-extensions==4.7.1 - # via pydata-sphinx-theme + # via + # -r requirements/edx/base.txt + # asgiref + # django-countries + # kombu + # pydata-sphinx-theme + # pylti1p3 + # snowflake-connector-python +tzdata==2023.3 + # via + # -r requirements/edx/base.txt + # backports-zoneinfo + # celery +unicodecsv==0.14.1 + # via + # -r requirements/edx/base.txt + # edx-enterprise +uritemplate==4.1.1 + # via + # -r requirements/edx/base.txt + # coreapi + # drf-yasg urllib3==1.26.16 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # elasticsearch + # py2neo # requests -zipp==3.16.1 + # snowflake-connector-python +user-util==1.0.0 + # via -r requirements/edx/base.txt +vine==5.0.0 # via + # -r requirements/edx/base.txt + # amqp + # celery + # kombu +voluptuous==0.13.1 + # via + # -r requirements/edx/base.txt + # ora2 +walrus==0.9.3 + # via + # -r requirements/edx/base.txt + # edx-event-bus-redis +watchdog==3.0.0 + # via -r requirements/edx/base.txt +wcwidth==0.2.6 + # via + # -r requirements/edx/base.txt + # prompt-toolkit +web-fragments==2.0.0 + # via + # -r requirements/edx/base.txt + # crowdsourcehinter-xblock + # edx-sga + # staff-graded-xblock + # xblock + # xblock-utils +webencodings==0.5.1 + # via + # -r requirements/edx/base.txt + # bleach + # html5lib + # tinycss2 +webob==1.8.7 + # via + # -r requirements/edx/base.txt + # xblock +wrapt==1.15.0 + # via + # -r requirements/edx/base.txt + # deprecated +xblock[django]==1.6.2 + # via + # -r requirements/edx/base.txt + # acid-xblock + # crowdsourcehinter-xblock + # done-xblock + # edx-completion + # edx-sga + # edx-user-state-client + # edx-when + # lti-consumer-xblock + # ora2 + # staff-graded-xblock + # xblock-google-drive + # xblock-poll + # xblock-utils +xblock-drag-and-drop-v2==3.2.0 + # via -r requirements/edx/base.txt +xblock-google-drive==0.3.0 + # via -r requirements/edx/base.txt +xblock-poll==1.13.0 + # via -r requirements/edx/base.txt +xblock-utils==3.2.0 + # via + # -r requirements/edx/base.txt + # edx-sga + # lti-consumer-xblock + # staff-graded-xblock + # xblock-drag-and-drop-v2 + # xblock-google-drive +xmlsec==1.3.13 + # via + # -r requirements/edx/base.txt + # python3-saml +xss-utils==0.4.0 + # via -r requirements/edx/base.txt +yarl==1.9.2 + # via + # -r requirements/edx/base.txt + # aiohttp +zipp==3.16.2 + # via + # -r requirements/edx/base.txt # importlib-metadata # importlib-resources + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index d11a06211b..edfaefb8ef 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -161,7 +161,7 @@ charset-normalizer==2.0.12 # snowflake-connector-python chem==1.2.0 # via -r requirements/edx/base.txt -click==8.1.4 +click==8.1.5 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt @@ -251,11 +251,11 @@ deprecated==1.2.14 # via # -r requirements/edx/base.txt # jwcrypto -diff-cover==7.6.1 +diff-cover==7.7.0 # via -r requirements/edx/coverage.txt dill==0.3.6 # via pylint -distlib==0.3.6 +distlib==0.3.7 # via virtualenv django==3.2.20 # via @@ -839,7 +839,7 @@ jsonfield==3.1.0 # lti-consumer-xblock # ora2 # outcome-surveys -jsonschema==4.18.2 +jsonschema==4.18.3 # via # -r requirements/edx/base.txt # optimizely-sdk @@ -1058,7 +1058,7 @@ pkgutil-resolve-name==1.3.10 # via # -r requirements/edx/base.txt # jsonschema -platformdirs==3.8.1 +platformdirs==3.9.1 # via # pylint # virtualenv @@ -1110,9 +1110,9 @@ pycryptodomex==3.18.0 # lti-consumer-xblock # pyjwkest # snowflake-connector-python -pydantic==2.0.2 +pydantic==2.0.3 # via fastapi -pydantic-core==2.1.2 +pydantic-core==2.3.0 # via pydantic pygments==2.15.1 # via @@ -1337,7 +1337,7 @@ requests-oauthlib==1.3.1 # social-auth-core rfc3986[idna2008]==1.5.0 # via httpx -rpds-py==0.8.10 +rpds-py==0.8.11 # via # -r requirements/edx/base.txt # jsonschema @@ -1564,7 +1564,7 @@ urllib3==1.26.16 # snowflake-connector-python user-util==1.0.0 # via -r requirements/edx/base.txt -uvicorn==0.22.0 +uvicorn==0.23.0 # via pact-python vine==5.0.0 # via @@ -1572,13 +1572,13 @@ vine==5.0.0 # amqp # celery # kombu -virtualenv==20.23.1 +virtualenv==20.24.0 # via tox voluptuous==0.13.1 # via # -r requirements/edx/base.txt # ora2 -walrus==0.9.2 +walrus==0.9.3 # via # -r requirements/edx/base.txt # edx-event-bus-redis @@ -1651,7 +1651,7 @@ yarl==1.9.2 # via # -r requirements/edx/base.txt # aiohttp -zipp==3.16.1 +zipp==3.16.2 # via # -r requirements/edx/base.txt # importlib-metadata diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index f25e2bece4..c668c984a2 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -6,7 +6,7 @@ # build==0.10.0 # via pip-tools -click==8.1.4 +click==8.1.5 # via # -c requirements/constraints.txt # pip-tools @@ -20,6 +20,7 @@ tomli==2.0.1 # via # build # pip-tools + # pyproject-hooks wheel==0.40.0 # via pip-tools diff --git a/requirements/pip.txt b/requirements/pip.txt index fa19e6f0b1..bd9fb55318 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -8,7 +8,7 @@ wheel==0.40.0 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==23.1.2 +pip==23.2 # via -r requirements/pip.in setuptools==68.0.0 # via -r requirements/pip.in From 95e0cdef281db8010607c27345758b90ebe6ad72 Mon Sep 17 00:00:00 2001 From: Kyle McCormick Date: Mon, 17 Jul 2023 14:06:05 -0400 Subject: [PATCH 10/21] Revert "build: copy from node_modules using NPM postinstall hook, not Paver (#32717)" This reverts commit 4b64d8342d69bb92afe56a49c61bc7e5663aceff. --- .../0017-reimplement-asset-processing.rst | 27 +++--- package.json | 3 - pavelib/assets.py | 90 ++++++++++++++++++- pavelib/utils/test/suites/js_suite.py | 2 + scripts/copy-node-modules.sh | 90 ------------------- 5 files changed, 107 insertions(+), 105 deletions(-) delete mode 100755 scripts/copy-node-modules.sh diff --git a/docs/decisions/0017-reimplement-asset-processing.rst b/docs/decisions/0017-reimplement-asset-processing.rst index 7ffb7ab5e8..7f16dcc249 100644 --- a/docs/decisions/0017-reimplement-asset-processing.rst +++ b/docs/decisions/0017-reimplement-asset-processing.rst @@ -131,17 +131,17 @@ The three top-level edx-platform asset processing actions are *build*, *collect* - ``scripts/build-assets.sh`` A Bash script that contains all build stages, with subcommands available for running each stage separately. Its command-line interface inspired by Tutor's ``openedx-assets`` script. The script will be runnable on any POSIX system, including macOS and Ubuntu and it will linted for common shell scripting mistakes using `shellcheck `_. - + * - + **Build stage 1: Copy npm-installed assets** from node_modules to other folders in edx-platform. They are used by certain especially-old legacy LMS & CMS frontends that are not set up to work with npm directly. - ``paver update_assets --skip-collect`` Implemented in Python within update_assets. There is no standalone command for it. - - ``npm install`` - - An NPM post-install hook will automatically call scripts/copy-node-modules.sh, a pure Bash reimplementation of the node_modules asset copying, whenever ``npm install`` is invoked. + - ``scripts/build-assets.sh npm`` + Pure Bash reimplementation. See *Rejected Alternatives* for a note about this. + * - + **Build stage 2: Copy XModule fragments** from the xmodule source tree over to input directories for Webpack and SCSS compilation. This is required for a hard-coded list of old XModule-style XBlocks. This is not required for new pure XBlocks, which include (or pip-install) their assets into edx-platform as ready-to-serve JS/CSS/etc fragments. - ``paver process_xmodule_assets``, or @@ -156,7 +156,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* + `Reimplement this step in Bash `_. + `Remove the need for this step entirely `_. - + * - + **Build stage 3: Run Webpack** in order to to shim, minify, otherwise process, and bundle JS modules. This requires a call to the npm-installed ``webpack`` binary. - ``paver webpack`` @@ -168,7 +168,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* Bash wrapper around a call to webpack. The script will accept parameters rather than looking up Django settings itself. The print_setting command will still be available for distributions to use to extract ``STATIC_ROOT`` from Django settings, but it will only need to be run once. As described in **Build Configuration** below, unnecessary Django settings will be removed. Some distributions may not even need to look up ``STATIC_ROOT``; Tutor, for example, will probably render ``STATIC_ROOT`` directly into the environment variable ``OPENEDX_BUILD_ASSETS_OPTS`` variable, described in the **Build Configuration**. - + * - + **Build stage 4: Compile default SCSS** into CSS for legacy LMS/CMS frontends. - ``paver compile_sass`` @@ -180,7 +180,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* - ``scripts/build-assets.sh css`` Bash reimplementation, calling ``node-sass`` and ``rtlcss``. - + The initial implementation of build-assets.sh may use ``sassc``, a CLI provided by libsass, instead of node-sass. Then, ``sassc`` can be replaced by ``node-sass`` as part of a subsequent `edx-platform frontend framework upgrade effort `_. * - + **Build stage 5: Compile themes' SCSS** into CSS for legacy LMS/CMS frontends. The default SCSS is used as a base, and theme-provided SCSS files are used as overrides. Themes are searched for from some number of operator-specified theme directories. @@ -198,7 +198,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* The management command will remain available, but it will need to be updated to point at the Bash script, which will replace the paver task (see build stage 4 for details). The overall asset *build* action will use the Bash script; this means that list of theme directories will need to be provided as arguments, but it ensures that the build can remain Python-free. - + * - **Collect** the built static assets from edx-platform to another location (the ``STATIC_ROOT``) so that they can be efficiently served *without* Django's webserver. This step, by nature, requires Python and Django in order to find and organize the assets, which may come from edx-platform itself or from its many installed Python and NPM packages. This is only needed for **production** environments, where it is usually desirable to serve assets with something efficient like NGINX. - ``paver update_assets`` @@ -210,7 +210,7 @@ The three top-level edx-platform asset processing actions are *build*, *collect* - ``./manage.py lms collectstatic --noinput && ./manage.py cms collectstatic --noinput`` The standard Django interface will be used without a wrapper. The ignore patterns will be added to edx-platform's `staticfiles app configuration `_ so that they do not need to be supplied as part of the command. - + * - **Watch** static assets for changes in the background. When a change occurs, rebuild them automatically, so that the Django webserver picks up the changes. This is only necessary in **development** environments. A few different sets of assets may be watched: XModule fragments, Webpack assets, default SCSS, and theme SCSS. - ``paver watch_assets`` @@ -300,7 +300,7 @@ Either way, the migration path is straightforward: * - ``openedx-assets build`` - ``scripts/build-assets.sh`` * - ``openedx-assets npm`` - - ``scripts/copy-node-modules.sh # (automatically invoked by 'npm install'!) + - ``scripts/build-assets.sh npm`` * - ``openedx-assets xmodule`` - ``scripts/build-assets.sh xmodule`` * - ``openedx-assets common`` @@ -328,6 +328,13 @@ OpenCraft has also performed a discovery on a `modernized system for static asse Rejected Alternatives ********************* +Copy node_modules via npm post-install +====================================== + +It was noted that `npm supports lifecycle scripts `_ in package.json, including ``postinstall``. We could use a post-install script to copy assets out of node_modules; this would occurr automatically after ``npm install``. Arguably, this would be more idiomatic than this ADR's proposal of ``scripts/build-assets.sh npm``. + +For now, we decided against this. While it seems like a good potential future improvement, we are currently unsure how it would interact with `moving node_modules out of edx-platform in Tutor `_, which is a motivation behind this ADR. For example, if node_modules could be located anywhere on the image, then we are not sure how the post-install script could know its target directory without us hard-coding Tutor's directory structure into the script. + Live with the problem ====================== diff --git a/package.json b/package.json index ebdcf240e1..fb855d32a3 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,6 @@ "name": "edx", "version": "0.1.0", "repository": "https://github.com/openedx/edx-platform", - "scripts": { - "postinstall": "scripts/copy-node-modules.sh" - }, "dependencies": { "@babel/core": "7.19.0", "@babel/plugin-proposal-object-rest-spread": "^7.18.9", diff --git a/pavelib/assets.py b/pavelib/assets.py index 8b1b4e7065..3bf8a9ce88 100644 --- a/pavelib/assets.py +++ b/pavelib/assets.py @@ -46,6 +46,39 @@ COMMON_LOOKUP_PATHS = [ path('node_modules'), ] +# A list of NPM installed libraries that should be copied into the common +# static directory. +# If string ends with '/' then all file in the directory will be copied. +NPM_INSTALLED_LIBRARIES = [ + 'backbone.paginator/lib/backbone.paginator.js', + 'backbone/backbone.js', + 'bootstrap/dist/js/bootstrap.bundle.js', + 'hls.js/dist/hls.js', + 'jquery-migrate/dist/jquery-migrate.js', + 'jquery.scrollto/jquery.scrollTo.js', + 'jquery/dist/jquery.js', + 'moment-timezone/builds/moment-timezone-with-data.js', + 'moment/min/moment-with-locales.js', + 'picturefill/dist/picturefill.js', + 'requirejs/require.js', + 'underscore.string/dist/underscore.string.js', + 'underscore/underscore.js', + '@edx/studio-frontend/dist/', + 'which-country/index.js' +] + +# A list of NPM installed developer libraries that should be copied into the common +# static directory only in development mode. +NPM_INSTALLED_DEVELOPER_LIBRARIES = [ + 'sinon/pkg/sinon.js', + 'squirejs/src/Squire.js', +] + +# Directory to install static vendor files +NPM_JS_VENDOR_DIRECTORY = path('common/static/common/js/vendor') +NPM_CSS_VENDOR_DIRECTORY = path("common/static/common/css/vendor") +NPM_CSS_DIRECTORY = path("common/static/common/css") + # system specific lookup path additions, add sass dirs if one system depends on the sass files for other systems SASS_LOOKUP_DEPENDENCIES = { 'cms': [path('lms') / 'static' / 'sass' / 'partials', ], @@ -611,8 +644,60 @@ def process_npm_assets(): """ Process vendor libraries installed via NPM. """ - print("\t\tProcessing NPM assets is now done automatically in an npm post-install hook.") - print("\t\tThis function is now a no-op.") + def copy_vendor_library(library, skip_if_missing=False): + """ + Copies a vendor library to the shared vendor directory. + """ + if library.startswith('node_modules/'): + library_path = library + else: + library_path = f'node_modules/{library}' + + if library.endswith('.css') or library.endswith('.css.map'): + vendor_dir = NPM_CSS_VENDOR_DIRECTORY + else: + vendor_dir = NPM_JS_VENDOR_DIRECTORY + if os.path.exists(library_path): + sh('/bin/cp -rf {library_path} {vendor_dir}'.format( + library_path=library_path, + vendor_dir=vendor_dir, + )) + elif not skip_if_missing: + raise Exception(f'Missing vendor file {library_path}') + + def copy_vendor_library_dir(library_dir, skip_if_missing=False): + """ + Copies all vendor libraries in directory to the shared vendor directory. + """ + library_dir_path = f'node_modules/{library_dir}' + print(f'Copying vendor library dir: {library_dir_path}') + if os.path.exists(library_dir_path): + for dirpath, _, filenames in os.walk(library_dir_path): + for filename in filenames: + copy_vendor_library(os.path.join(dirpath, filename), skip_if_missing=skip_if_missing) + + # Skip processing of the libraries if this is just a dry run + if tasks.environment.dry_run: + tasks.environment.info("install npm_assets") + return + + # Ensure that the vendor directory exists + NPM_JS_VENDOR_DIRECTORY.mkdir_p() + NPM_CSS_DIRECTORY.mkdir_p() + NPM_CSS_VENDOR_DIRECTORY.mkdir_p() + + # Copy each file to the vendor directory, overwriting any existing file. + print("Copying vendor files into static directory") + for library in NPM_INSTALLED_LIBRARIES: + if library.endswith('/'): + copy_vendor_library_dir(library) + else: + copy_vendor_library(library) + + # Copy over each developer library too if they have been installed + print("Copying developer vendor files into static directory") + for library in NPM_INSTALLED_DEVELOPER_LIBRARIES: + copy_vendor_library(library, skip_if_missing=True) @task @@ -898,6 +983,7 @@ def update_assets(args): collect_log_args = {} process_xmodule_assets() + process_npm_assets() # Build Webpack call_task('pavelib.assets.webpack', options={'settings': args.settings}) diff --git a/pavelib/utils/test/suites/js_suite.py b/pavelib/utils/test/suites/js_suite.py index 65c5feaf84..a6896e2858 100644 --- a/pavelib/utils/test/suites/js_suite.py +++ b/pavelib/utils/test/suites/js_suite.py @@ -39,6 +39,8 @@ class JsTestSuite(TestSuite): if self.mode == 'run' and not self.run_under_coverage: test_utils.clean_dir(self.report_dir) + assets.process_npm_assets() + @property def _default_subsuites(self): """ diff --git a/scripts/copy-node-modules.sh b/scripts/copy-node-modules.sh deleted file mode 100755 index db997da957..0000000000 --- a/scripts/copy-node-modules.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env bash -# Copy certain npm-installed assets from node_modules to other folders in -# edx-platform. These assets are used by certain especially-old legacy LMS & CMS -# frontends that are not set up to import from node_modules directly. -# Many of the destination folders are named "vendor", because they originally -# held vendored-in (directly-committed) libraries; once we moved most frontends -# to use NPM, we decided to keep library versions in-sync by copying to the -# former "vendor" directories. - -# Enable stricter error handling. -set -euo pipefail - -COL_LOG="\e[36m" # Log/step/section color (cyan) -COL_OFF="\e[0m" # Normal color - -# Keep these as variables in case we ever want to parameterize this script's -# input or output dirs, as proposed in: -# https://github.com/openedx/wg-developer-experience/issues/150 -# https://github.com/openedx/wg-developer-experience/issues/151 -node_modules="node_modules" -vendor_js="common/static/common/js/vendor" -vendor_css="common/static/common/css/vendor" - -# Stylized logging. -log ( ) { - echo -e "${COL_LOG}$* $COL_OFF" -} - -log "=====================================================================================" -log "Copying required assets from node_modules..." -log "-------------------------------------------------------------------------------" - -# Start echoing all commands back to user for ease of debugging. -set -x - -log "Ensuring vendor directories exist..." -mkdir -p "$vendor_js" -mkdir -p "$vendor_css" - -log "Copying studio-frontend JS & CSS from node_modules into vendor directores..." -while read -r -d $'\0' src_file ; do - if [[ "$src_file" = *.css ]] || [[ "$src_file" = *.css.map ]] ; then - cp --force "$src_file" "$vendor_css" - else - cp --force "$src_file" "$vendor_js" - fi -done < <(find "$node_modules/@edx/studio-frontend/dist" -type f -print0) - -log "Copying certain JS modules from node_modules into vendor directory..." -cp --force \ - "$node_modules/backbone.paginator/lib/backbone.paginator.js" \ - "$node_modules/backbone/backbone.js" \ - "$node_modules/bootstrap/dist/js/bootstrap.bundle.js" \ - "$node_modules/hls.js/dist/hls.js" \ - "$node_modules/jquery-migrate/dist/jquery-migrate.js" \ - "$node_modules/jquery.scrollto/jquery.scrollTo.js" \ - "$node_modules/jquery/dist/jquery.js" \ - "$node_modules/moment-timezone/builds/moment-timezone-with-data.js" \ - "$node_modules/moment/min/moment-with-locales.js" \ - "$node_modules/picturefill/dist/picturefill.js" \ - "$node_modules/requirejs/require.js" \ - "$node_modules/underscore.string/dist/underscore.string.js" \ - "$node_modules/underscore/underscore.js" \ - "$node_modules/which-country/index.js" \ - "$vendor_js" - -log "Copying certain JS developer modules into vendor directory..." -if [[ "${NODE_ENV:-production}" = development ]] ; then - cp --force "$node_modules/sinon/pkg/sinon.js" "$vendor_js" - cp --force "$node_modules/squirejs/src/Squire.js" "$vendor_js" -else - # TODO: https://github.com/openedx/edx-platform/issues/31768 - # In the old implementation of this scipt (pavelib/assets.py), these two - # developer libraries were copied into the JS vendor directory whether not - # the build was for prod or dev. In order to exactly match the output of - # the old script, this script will also copy them in for prod builds. - # However, in the future, it would be good to only copy them for dev - # builds. Furthermore, these libraries should not be `npm install`ed - # into prod builds in the first place. - cp --force "$node_modules/sinon/pkg/sinon.js" "$vendor_js" || true # "|| true" means "tolerate errors"; in this case, - cp --force "$node_modules/squirejs/src/Squire.js" "$vendor_js" || true # that's "tolerate if these files don't exist." -fi - -# Done echoing. -set +x - -log "-------------------------------------------------------------------------------" -log " Done copying required assets from node_modules." -log "=====================================================================================" - From 9b9b88df5203b83d438d83f13481b5471ca2b559 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Mon, 17 Jul 2023 12:18:43 -0700 Subject: [PATCH 11/21] chore: remove some usages of six (Python2 compat) (#32554) * get rid of six.text_type(s) * get rid of six.b() * get rid of six.string_types * get rid of six.PY2/six.PY3 * get rid of six.iteritems() and six.viewvalues() --- cms/djangoapps/contentstore/tasks.py | 4 +- cms/templates/certificates.html | 3 +- cms/templates/checklists.html | 4 +- cms/templates/course_outline.html | 5 +-- cms/templates/export_git.html | 4 +- cms/templates/group_configurations.html | 3 +- cms/templates/manage_users.html | 4 +- cms/templates/settings.html | 3 +- cms/templates/settings_advanced.html | 5 +-- cms/templates/settings_graders.html | 3 +- cms/templates/widgets/header.html | 43 +++++++++---------- cms/templates/widgets/metadata-edit.html | 3 +- cms/templates/widgets/source-edit.html | 3 +- common/djangoapps/edxmako/paths.py | 5 +-- .../tests/test_bulk_change_enrollment_csv.py | 3 +- .../management/tests/test_bulk_unenroll.py | 3 +- .../management/tests/test_recover_account.py | 3 +- .../tests/test_unsubscribe_user_email.py | 3 +- common/djangoapps/student/tests/test_roles.py | 13 +++--- common/djangoapps/terrain/stubs/http.py | 2 +- common/djangoapps/track/contexts.py | 1 - lms/djangoapps/ccx/views.py | 6 +-- .../discussion/notification_prefs/views.py | 3 +- lms/djangoapps/grades/api.py | 1 - .../teams/templates/teams/teams.html | 4 +- lms/djangoapps/teams/tests/test_models.py | 2 +- lms/templates/conditional_block.html | 5 +-- lms/templates/course.html | 3 +- lms/templates/courseware/course_about.html | 9 ++-- .../course_about_sidebar_header.html | 3 +- lms/templates/courseware/courseware.html | 5 +-- lms/templates/courseware/gradebook.html | 3 +- lms/templates/courseware/xqa_interface.html | 5 +-- lms/templates/dashboard.html | 3 +- .../dashboard/_dashboard_course_listing.html | 7 ++- .../_dashboard_entitlement_actions.html | 5 +-- .../header/navbar-not-authenticated.html | 1 - lms/templates/main.html | 3 +- .../navigation/navbar-not-authenticated.html | 1 - lms/templates/public_video_share_embed.html | 3 +- lms/templates/staff_problem_info.html | 3 +- lms/templates/support/index.html | 3 +- lms/templates/survey/survey.html | 3 +- openedx/core/djangoapps/credit/signature.py | 2 +- .../lms/templates/register-form.html | 3 +- xmodule/capa/capa_problem.py | 11 +++-- xmodule/capa/inputtypes.py | 21 +++------ xmodule/capa/responsetypes.py | 31 +++++++------ xmodule/capa/safe_exec/safe_exec.py | 10 ++--- .../capa/safe_exec/tests/test_safe_exec.py | 13 +++--- xmodule/capa/templates/choicegroup.html | 5 +-- xmodule/capa/tests/helpers.py | 6 +-- xmodule/capa/tests/response_xml_factory.py | 2 +- xmodule/capa/tests/test_capa_problem.py | 8 ++-- xmodule/capa/tests/test_inputtypes.py | 1 - xmodule/capa/tests/test_responsetypes.py | 10 ++--- xmodule/capa/util.py | 3 +- xmodule/modulestore/mongo/base.py | 2 +- 58 files changed, 124 insertions(+), 205 deletions(-) diff --git a/cms/djangoapps/contentstore/tasks.py b/cms/djangoapps/contentstore/tasks.py index d452b2f004..4d4fff967c 100644 --- a/cms/djangoapps/contentstore/tasks.py +++ b/cms/djangoapps/contentstore/tasks.py @@ -296,7 +296,7 @@ class CourseExportTask(UserTask): # pylint: disable=abstract-method arguments_dict (dict): The arguments given to the task function Returns: - text_type: The generated name + str: The generated name """ key = arguments_dict['course_key_string'] return f'Export of {key}' @@ -431,7 +431,7 @@ class CourseImportTask(UserTask): # pylint: disable=abstract-method arguments_dict (dict): The arguments given to the task function Returns: - text_type: The generated name + str: The generated name """ key = arguments_dict['course_key_string'] filename = arguments_dict['archive_name'] diff --git a/cms/templates/certificates.html b/cms/templates/certificates.html index edf4e45c6c..400d300bf5 100644 --- a/cms/templates/certificates.html +++ b/cms/templates/certificates.html @@ -9,7 +9,6 @@ from openedx.core.djangolib.markup import HTML, Text from openedx.core.djangolib.js_utils import ( dump_js_escaped_json, js_escaped_string ) -import six from six.moves.urllib.parse import quote %> @@ -104,7 +103,7 @@ CMS.User.isGlobalStaff = '${is_global_staff | n, js_escaped_string}'=='True' ? t
% if context_course: <% - url_encoded_course_id = quote(six.text_type(context_course.id).encode('utf-8'), safe='') + url_encoded_course_id = quote(str(context_course.id).encode('utf-8'), safe='') details_url = utils.reverse_course_url('settings_handler', context_course.id) grading_url = utils.reverse_course_url('grading_handler', context_course.id) course_team_url = utils.reverse_course_url('course_team_handler', context_course.id) diff --git a/cms/templates/checklists.html b/cms/templates/checklists.html index 44d456de26..e949f37d79 100644 --- a/cms/templates/checklists.html +++ b/cms/templates/checklists.html @@ -2,8 +2,6 @@ <%inherit file="base.html" /> <%def name="online_help_token()"><% return "files" %> <%! - import six - from cms.djangoapps.contentstore import utils from cms.djangoapps.contentstore.config.waffle_utils import should_show_checklists_quality from django.urls import reverse @@ -40,7 +38,7 @@ <%static:studiofrontend entry="courseHealthCheck"> <% - course_key = six.text_type(context_course.id) + course_key = str(context_course.id) certificates_url = '' if has_certificates_enabled(context_course): certificates_url = utils.reverse_course_url('certificates_list_handler', course_key) diff --git a/cms/templates/course_outline.html b/cms/templates/course_outline.html index fd68ad9cd4..915ec64da4 100644 --- a/cms/templates/course_outline.html +++ b/cms/templates/course_outline.html @@ -3,7 +3,6 @@ <%def name="online_help_token()"><% return "develop_course" %> <%! import logging -import six from six.moves.urllib.parse import quote from cms.djangoapps.contentstore.config.waffle_utils import should_show_checklists_quality @@ -160,7 +159,7 @@ from django.urls import reverse

${_("This course has proctored exam settings that are incomplete or invalid.")}

% if mfe_proctored_exam_settings_url: - <% url_encoded_course_id = quote(six.text_type(context_course.id).encode('utf-8'), safe='') %> + <% url_encoded_course_id = quote(str(context_course.id).encode('utf-8'), safe='') %> ${Text(_("To update these settings go to the {link_start}Proctored Exam Settings page{link_end}.")).format( link_start=HTML('').format( mfe_proctored_exam_settings_url=mfe_proctored_exam_settings_url @@ -263,7 +262,7 @@ from django.urls import reverse }, "enable_quality": ${should_show_checklists_quality(context_course.id) | n, dump_js_escaped_json}, "links": { - "settings": ${reverse('settings_handler', kwargs={'course_key_string': six.text_type(course_key)})| n, dump_js_escaped_json} + "settings": ${reverse('settings_handler', kwargs={'course_key_string': str(course_key)})| n, dump_js_escaped_json} } } diff --git a/cms/templates/export_git.html b/cms/templates/export_git.html index fe6bd9dd16..296e3caa3a 100644 --- a/cms/templates/export_git.html +++ b/cms/templates/export_git.html @@ -3,8 +3,6 @@ <%namespace name='static' file='static_content.html'/> <%! - import six - from django.urls import reverse from django.utils.translation import gettext as _ %> @@ -41,7 +39,7 @@ % else:

  • - + ${_("Export to Git")} diff --git a/cms/templates/group_configurations.html b/cms/templates/group_configurations.html index 0a0165df93..9e247d3d27 100644 --- a/cms/templates/group_configurations.html +++ b/cms/templates/group_configurations.html @@ -11,7 +11,6 @@ from openedx.core.djangolib.js_utils import ( dump_js_escaped_json, js_escaped_string ) from openedx.core.djangolib.markup import HTML, Text -import six from six.moves.urllib.parse import quote %> @@ -115,7 +114,7 @@ from six.moves.urllib.parse import quote
    % if context_course: <% - url_encoded_course_id = quote(six.text_type(context_course.id).encode('utf-8'), safe='') + url_encoded_course_id = quote(str(context_course.id).encode('utf-8'), safe='') details_url = utils.reverse_course_url('settings_handler', context_course.id) grading_url = utils.reverse_course_url('grading_handler', context_course.id) course_team_url = utils.reverse_course_url('course_team_handler', context_course.id) diff --git a/cms/templates/manage_users.html b/cms/templates/manage_users.html index 5d844eed27..b0c278d114 100644 --- a/cms/templates/manage_users.html +++ b/cms/templates/manage_users.html @@ -1,8 +1,6 @@ ## xss-lint: disable=mako-missing-default <%inherit file="base.html" /> <%! -import six - from django.utils.translation import gettext as _ from django.urls import reverse @@ -125,7 +123,7 @@ from openedx.core.djangolib.js_utils import ( "${context_course.display_name_with_default | h}", ${users | n, dump_js_escaped_json}, // xss-lint: disable=mako-invalid-js-filter - "${reverse('course_team_handler', kwargs={'course_key_string': six.text_type(context_course.id), 'email': '@@EMAIL@@'}) | n, js_escaped_string}", + "${reverse('course_team_handler', kwargs={'course_key_string': str(context_course.id), 'email': '@@EMAIL@@'}) | n, js_escaped_string}", ${request.user.id | n, dump_js_escaped_json}, ${allow_actions | n, dump_js_escaped_json} ); diff --git a/cms/templates/settings.html b/cms/templates/settings.html index b7ef368a09..15d259b8b7 100644 --- a/cms/templates/settings.html +++ b/cms/templates/settings.html @@ -14,7 +14,6 @@ dump_js_escaped_json, js_escaped_string ) from openedx.core.djangolib.markup import HTML, Text - import six from six.moves.urllib.parse import quote from six.moves.urllib import parse as urllib %> @@ -711,7 +710,7 @@ CMS.URL.UPLOAD_ASSET = '${upload_asset_url | n, js_escaped_string}'
    % if context_course: <% - url_encoded_course_id = quote(six.text_type(context_course.id).encode('utf-8'), safe='') + url_encoded_course_id = quote(str(context_course.id).encode('utf-8'), safe='') course_team_url = utils.reverse_course_url('course_team_handler', context_course.id) grading_config_url = utils.reverse_course_url('grading_handler', context_course.id) advanced_config_url = utils.reverse_course_url('advanced_settings_handler', context_course.id) diff --git a/cms/templates/settings_advanced.html b/cms/templates/settings_advanced.html index 14df03e228..3eccb3528d 100644 --- a/cms/templates/settings_advanced.html +++ b/cms/templates/settings_advanced.html @@ -3,7 +3,6 @@ <%def name="online_help_token()"><% return "advanced" %> <%namespace name='static' file='static_content.html'/> <%! - import six from six.moves.urllib.parse import quote from django.utils.translation import gettext as _ from cms.djangoapps.contentstore import utils @@ -43,7 +42,7 @@

    ${_("This course has proctored exam settings that are incomplete or invalid.")}

    % if mfe_proctored_exam_settings_url: - <% url_encoded_course_id = quote(six.text_type(context_course.id).encode('utf-8'), safe='') %> + <% url_encoded_course_id = quote(str(context_course.id).encode('utf-8'), safe='') %> ${Text(_("You will be unable to make changes until the errors are resolved. To update these settings go to the {link_start}Proctored Exam Settings page{link_end}.")).format( link_start=HTML('').format( mfe_proctored_exam_settings_url=mfe_proctored_exam_settings_url @@ -136,7 +135,7 @@

    % if context_course: <% - url_encoded_course_id = quote(six.text_type(context_course.id).encode('utf-8'), safe='') + url_encoded_course_id = quote(str(context_course.id).encode('utf-8'), safe='') details_url = utils.reverse_course_url('settings_handler', context_course.id) grading_url = utils.reverse_course_url('grading_handler', context_course.id) course_team_url = utils.reverse_course_url('course_team_handler', context_course.id) diff --git a/cms/templates/settings_graders.html b/cms/templates/settings_graders.html index 0bd6483f44..c3b6f8f73a 100644 --- a/cms/templates/settings_graders.html +++ b/cms/templates/settings_graders.html @@ -6,7 +6,6 @@ <%namespace name='static' file='static_content.html'/> <%! - import six from six.moves.urllib.parse import quote import json from cms.djangoapps.contentstore import utils @@ -158,7 +157,7 @@
    % if context_course: <% - url_encoded_course_id = quote(six.text_type(context_course.id).encode('utf-8'), safe='') + url_encoded_course_id = quote(str(context_course.id).encode('utf-8'), safe='') detailed_settings_url = utils.reverse_course_url('settings_handler', context_course.id) course_team_url = utils.reverse_course_url('course_team_handler', context_course.id) advanced_settings_url = utils.reverse_course_url('advanced_settings_handler', context_course.id) diff --git a/cms/templates/widgets/header.html b/cms/templates/widgets/header.html index 57e40c35ff..dd8f760b3c 100644 --- a/cms/templates/widgets/header.html +++ b/cms/templates/widgets/header.html @@ -1,7 +1,6 @@ <%page expression_filter="h" args="online_help_token"/> <%namespace name='static' file='../static_content.html'/> <%! - import six from six.moves.urllib.parse import quote from django.conf import settings from django.urls import reverse @@ -39,23 +38,23 @@ % if context_course: <% course_key = context_course.id - url_encoded_course_key = quote(six.text_type(course_key).encode('utf-8'), safe='') - index_url = reverse('course_handler', kwargs={'course_key_string': six.text_type(course_key)}) - course_team_url = reverse('course_team_handler', kwargs={'course_key_string': six.text_type(course_key)}) - assets_url = reverse('assets_handler', kwargs={'course_key_string': six.text_type(course_key)}) - textbooks_url = reverse('textbooks_list_handler', kwargs={'course_key_string': six.text_type(course_key)}) - videos_url = reverse('videos_handler', kwargs={'course_key_string': six.text_type(course_key)}) - import_url = reverse('import_handler', kwargs={'course_key_string': six.text_type(course_key)}) - course_info_url = reverse('course_info_handler', kwargs={'course_key_string': six.text_type(course_key)}) - export_url = reverse('export_handler', kwargs={'course_key_string': six.text_type(course_key)}) - settings_url = reverse('settings_handler', kwargs={'course_key_string': six.text_type(course_key)}) - grading_url = reverse('grading_handler', kwargs={'course_key_string': six.text_type(course_key)}) - advanced_settings_url = reverse('advanced_settings_handler', kwargs={'course_key_string': six.text_type(course_key)}) - tabs_url = reverse('tabs_handler', kwargs={'course_key_string': six.text_type(course_key)}) + url_encoded_course_key = quote(str(course_key).encode('utf-8'), safe='') + index_url = reverse('course_handler', kwargs={'course_key_string': str(course_key)}) + course_team_url = reverse('course_team_handler', kwargs={'course_key_string': str(course_key)}) + assets_url = reverse('assets_handler', kwargs={'course_key_string': str(course_key)}) + textbooks_url = reverse('textbooks_list_handler', kwargs={'course_key_string': str(course_key)}) + videos_url = reverse('videos_handler', kwargs={'course_key_string': str(course_key)}) + import_url = reverse('import_handler', kwargs={'course_key_string': str(course_key)}) + course_info_url = reverse('course_info_handler', kwargs={'course_key_string': str(course_key)}) + export_url = reverse('export_handler', kwargs={'course_key_string': str(course_key)}) + settings_url = reverse('settings_handler', kwargs={'course_key_string': str(course_key)}) + grading_url = reverse('grading_handler', kwargs={'course_key_string': str(course_key)}) + advanced_settings_url = reverse('advanced_settings_handler', kwargs={'course_key_string': str(course_key)}) + tabs_url = reverse('tabs_handler', kwargs={'course_key_string': str(course_key)}) certificates_url = '' if settings.FEATURES.get("CERTIFICATES_HTML_VIEW") and context_course.cert_html_view_enabled: - certificates_url = reverse('certificates_list_handler', kwargs={'course_key_string': six.text_type(course_key)}) - checklists_url = reverse('checklists_handler', kwargs={'course_key_string': six.text_type(course_key)}) + certificates_url = reverse('certificates_list_handler', kwargs={'course_key_string': str(course_key)}) + checklists_url = reverse('checklists_handler', kwargs={'course_key_string': str(course_key)}) pages_and_resources_mfe_enabled = ENABLE_PAGES_AND_RESOURCES_MICROFRONTEND.is_enabled(context_course.id) studio_home_mfe_enabled = toggles.use_new_home_page() course_outline_mfe_enabled = toggles.use_new_course_outline_page(context_course.id) @@ -192,7 +191,7 @@
  • % endif % if mfe_proctored_exam_settings_url: % endif