diff --git a/.github/workflows/units-test-scripts-user-retirement.yml b/.github/workflows/units-test-scripts-user-retirement.yml index f1b2b2c539f6..e9b7c84c8ae4 100644 --- a/.github/workflows/units-test-scripts-user-retirement.yml +++ b/.github/workflows/units-test-scripts-user-retirement.yml @@ -26,9 +26,11 @@ jobs: - name: Install dependencies run: | + sudo apt-get update && sudo apt-get install libxmlsec1-dev python -m pip install --upgrade pip pip install -r scripts/user_retirement/requirements/testing.txt - name: Run pytest run: | + export DJANGO_SETTINGS_MODULE=lms.envs.test pytest scripts/user_retirement diff --git a/lms/envs/common.py b/lms/envs/common.py index d0d2eeae765c..980aba1e8312 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -4996,6 +4996,8 @@ def _make_locale_paths(settings): # pylint: disable=missing-function-docstring 'COMPLETE', ] +EXTRA_SERVICES_TO_RETIRE_FROM = [] + USERNAME_REPLACEMENT_WORKER = "REPLACE WITH VALID USERNAME" ############## Settings for Microfrontends ######################### diff --git a/lms/envs/test.py b/lms/envs/test.py index 3c4bb9564927..9d94175980a2 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -662,6 +662,14 @@ CSRF_TRUSTED_ORIGINS = ['.example.com'] CSRF_TRUSTED_ORIGINS_WITH_SCHEME = ['https://*.example.com'] +EXTRA_SERVICES_TO_RETIRE_FROM = [ + { + 'name': 'MOCK_SERVICE', + 'service_base_url': 'http://fake_service_base_url', + 'retirement_url_path': 'fake_retirement_url_path' + } +] + # values are already updated above with default CSRF_TRUSTED_ORIGINS values but in # case of new django version these values will override. if django.VERSION[0] >= 4: # for greater than django 3.2 use with schemes. diff --git a/scripts/user_retirement/docs/implementation_overview.rst b/scripts/user_retirement/docs/implementation_overview.rst index 37a814c1d583..902732a44190 100644 --- a/scripts/user_retirement/docs/implementation_overview.rst +++ b/scripts/user_retirement/docs/implementation_overview.rst @@ -11,8 +11,8 @@ these services. As a consequence, to remove a user's PII, you must be able to request each service containing PII to remove, delete, or unlink the data for that user in that service. -In the user retirement feature, a centralized process (the *driver* scripts) -orchestrates all of these requests. For information about how to configure the +In the user retirement feature, a centralized process (the *driver* scripts) +orchestrates all of these requests. For information about how to configure the driver scripts, see :ref:`driver-setup`. **************************** @@ -46,6 +46,27 @@ table of the states themselves (the ``RetirementState`` model), rather than hard-coding the states. This was done because we cannot predict all the possible states required by all members of the Open edX community. +The workflow also allows the inclusion of additional services that may need to be +retired alongside the core services. These extra services can now be configured within +the Django settings under the ``EXTRA_SERVICES_TO_RETIRE_FROM`` setting. This setting allows +the platform to handle the retirement of PII in custom or internal services that are not +part of the standard Open edX installation but are crucial for specific deployments. + +Here is an example of how the ``EXTRA_SERVICES_TO_RETIRE_FROM`` setting can be configured: + +.. code-block:: python + + EXTRA_SERVICES_TO_RETIRE_FROM = [ + { + 'name': 'MOCK_SERVICE', + 'service_base_url': 'http://fake_service_base_url', + 'retirement_url_path': 'fake_retirement_url_path' + } + ] + +This setting defines a list of services, each with a ``name``, ``service_base_url``, and ``retirement_url_path``, +allowing the user retirement process to include these additional services. + This example state diagram outlines the pathways users follow throughout the workflow: diff --git a/scripts/user_retirement/docs/service_setup.rst b/scripts/user_retirement/docs/service_setup.rst index 4fd59fcfd3ad..58a0f41001b8 100644 --- a/scripts/user_retirement/docs/service_setup.rst +++ b/scripts/user_retirement/docs/service_setup.rst @@ -36,13 +36,13 @@ defining *derived* settings specific to Open edX. Read more about it in - ``'retired.invalid'`` - The domain part of hashed emails. Used in ``RETIRED_EMAIL_FMT``. * - RETIRED_USERNAME_FMT - - ``lambda settings: + - ``lambda settings: settings.RETIRED_USERNAME_PREFIX + '{}'`` - The username field for a retired user gets transformed into this format, where ``{}`` is replaced with the hash of their username. * - RETIRED_EMAIL_FMT - - ``lambda settings: - settings.RETIRED_EMAIL_PREFIX + '{}@' + + - ``lambda settings: + settings.RETIRED_EMAIL_PREFIX + '{}@' + settings.RETIRED_EMAIL_DOMAIN`` - The email field for a retired user gets transformed into this format, where ``{}`` is replaced with the hash of their email. @@ -60,6 +60,27 @@ defining *derived* settings specific to Open edX. Read more about it in * - FEATURES['ENABLE_ACCOUNT_DELETION'] - True - Whether to display the "Delete My Account" section the account settings page. + * - EXTRA_SERVICES_TO_RETIRE_FROM + - None + - A list of additional services from which user data should be retired. Each entry in the list should be a dictionary with the following keys: + + - ``name``: The name of the service. + - ``service_base_url``: The base URL of the service's API. + - ``retirement_url_path``: The API path for the user retirement endpoint. + + This setting allows the retirement process to interact with external services not covered by default. For example: + + .. code-block:: python + + EXTRA_SERVICES_TO_RETIRE_FROM = [ + { + 'name': 'MOCK_SERVICE', + 'service_base_url': 'http://fake_service_base_url', + 'retirement_url_path': 'fake_retirement_url_path' + } + ] + + By default, this setting is empty, meaning no additional services are included. This can be overridden in `common.py `_. ================= @@ -79,10 +100,10 @@ state at the beginning, and ``COMPLETED``, ``ERRORED``, and ``ABORTED`` states at the end of the list. Also, for every ``RETIRING_foo`` state, there must be a corresponding ``foo_COMPLETE`` state. -Override these states if you need to add any states. Typically, these +Override these states if you need to add any states. Typically, these settings are set in ``lms.yml``. -After you have defined any custom states, populate the states table with the +After you have defined any custom states, populate the states table with the following management command: .. code-block:: bash @@ -120,7 +141,7 @@ Retirement Service User The user retirement driver scripts authenticate with the LMS and IDAs as the retirement service user with oauth client credentials. Therefore, to use the -driver scripts, you must create a retirement service user, and generate a DOT +driver scripts, you must create a retirement service user, and generate a DOT application and client credentials, as in the following command. .. code-block:: bash @@ -162,7 +183,7 @@ that relate to user retirement. - ``/admin/user_api/retirementstate/`` - Represents the table of states defined in ``RETIREMENT_STATES`` and populated with ``populate_retirement_states``. - * - User Retirement Requests + * - User Retirement Requests - ``/admin/user_api/userretirementrequest/`` - Represents the table that tracks the user IDs of every learner who has ever requested account deletion. This table is primarily used for @@ -173,7 +194,7 @@ that relate to user retirement. In special cases where you may need to manually intervene with the pipeline, you can use the User Retirement Statuses management page to change the -state for an individual user. For more information about how to handle these +state for an individual user. For more information about how to handle these cases, see :ref:`handling-special-cases`. .. include:: ../../../../links/links.rst diff --git a/scripts/user_retirement/pytest.ini b/scripts/user_retirement/pytest.ini index e69de29bb2d1..7a127196d061 100644 --- a/scripts/user_retirement/pytest.ini +++ b/scripts/user_retirement/pytest.ini @@ -0,0 +1,3 @@ +[pytest] + +DJANGO_SETTINGS_MODULE = lms.envs.test diff --git a/scripts/user_retirement/requirements/base.in b/scripts/user_retirement/requirements/base.in index d0bdab9082a5..ee037a58b528 100644 --- a/scripts/user_retirement/requirements/base.in +++ b/scripts/user_retirement/requirements/base.in @@ -1,4 +1,5 @@ -c ../../../requirements/constraints.txt +-r ../../../requirements/edx/base.txt boto3 click diff --git a/scripts/user_retirement/requirements/base.txt b/scripts/user_retirement/requirements/base.txt index 47e6e79c2240..f57f1dad43ca 100644 --- a/scripts/user_retirement/requirements/base.txt +++ b/scripts/user_retirement/requirements/base.txt @@ -4,168 +4,1545 @@ # # make upgrade # +-e git+https://github.com/anupdhabarde/edx-proctoring-proctortrack.git@31c6c9923a51c903ae83760ecbbac191363aa2a2#egg=edx_proctoring_proctortrack + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +acid-xblock==0.3.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +aiohappyeyeballs==2.3.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # aiohttp +aiohttp==3.10.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # geoip2 + # openai +aiosignal==1.3.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # aiohttp +algoliasearch==3.0.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +amqp==5.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # kombu +analytics-python==1.4.post1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +aniso8601==9.0.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-tincan-py35 +annotated-types==0.7.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # pydantic +appdirs==1.4.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # fs asgiref==3.8.1 - # via django + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django + # django-cors-headers + # django-countries +asn1crypto==1.5.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # snowflake-connector-python attrs==24.2.0 - # via zeep -backoff==2.2.1 - # via -r scripts/user_retirement/requirements/base.in + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # aiohttp + # edx-ace + # jsonschema + # lti-consumer-xblock + # openedx-events + # openedx-learning + # referencing + # zeep +babel==2.15.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # enmerkar + # enmerkar-underscore +backoff==1.10.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # -r scripts/user_retirement/requirements/base.in + # analytics-python +bcrypt==4.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # paramiko +beautifulsoup4==4.12.3 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # pynliner +billiard==4.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # celery +bleach[css]==6.1.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise + # lti-consumer-xblock + # openedx-django-wiki + # ora2 + # xblock-drag-and-drop-v2 + # xblock-poll +boto==2.49.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt boto3==1.34.154 - # via -r scripts/user_retirement/requirements/base.in + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # -r scripts/user_retirement/requirements/base.in + # django-ses + # fs-s3fs + # ora2 botocore==1.34.154 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # boto3 # s3transfer +bridgekeeper==0.9 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +cachecontrol==0.14.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # firebase-admin cachetools==5.4.0 - # via google-auth + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-auth +camel-converter[pydantic]==3.1.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # meilisearch +celery==5.4.0 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-celery-results + # django-user-tasks + # edx-celeryutils + # edx-enterprise + # event-tracking + # openedx-learning certifi==2024.7.4 - # via requests + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # elasticsearch + # py2neo + # requests + # snowflake-connector-python cffi==1.17.0 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # cryptography # pynacl + # snowflake-connector-python +chardet==5.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # pysrt charset-normalizer==2.0.12 # via # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # requests + # snowflake-connector-python +chem==1.3.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt click==8.1.6 # via # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # -r scripts/user_retirement/requirements/base.in + # celery + # click-didyoumean + # click-plugins + # click-repl + # code-annotations # edx-django-utils -cryptography==43.0.0 - # via pyjwt + # nltk + # user-util +click-didyoumean==0.3.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # celery +click-plugins==1.1.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # celery +click-repl==0.3.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # celery +code-annotations==1.8.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise + # edx-toggles +codejail-includes==1.0.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +crowdsourcehinter-xblock==0.7 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +cryptography==42.0.8 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-fernet-fields-v2 + # edx-enterprise + # jwcrypto + # optimizely-sdk + # paramiko + # pgpy + # pyjwt + # pyopenssl + # snowflake-connector-python + # social-auth-core +cssutils==2.11.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # pynliner +defusedxml==0.7.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # djangorestframework-xml + # ora2 + # python3-openid + # social-auth-core django==4.2.15 # via # -c scripts/user_retirement/requirements/../../../requirements/common_constraints.txt # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-appconf + # django-celery-results + # django-classy-tags + # django-config-models + # django-cors-headers # django-crum + # django-fernet-fields-v2 + # django-filter + # django-js-asset + # django-method-override + # django-model-utils + # django-multi-email-field + # django-mysql + # django-oauth-toolkit + # django-push-notifications + # django-sekizai + # django-ses + # django-statici18n + # django-storages + # django-user-tasks # django-waffle + # djangorestframework + # done-xblock + # drf-jwt + # drf-spectacular + # 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 + # lti-consumer-xblock + # openedx-django-pyfs + # openedx-django-wiki + # openedx-events + # openedx-filters + # openedx-learning + # ora2 + # social-auth-app-django + # super-csv + # xblock-google-drive + # xss-utils +django-appconf==1.0.6 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-statici18n +django-cache-memoize==0.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +django-celery-results==2.5.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +django-classy-tags==4.1.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-sekizai +django-config-models==2.7.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise + # edx-name-affirmation + # lti-consumer-xblock +django-cors-headers==4.4.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +django-countries==7.6.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise django-crum==0.7.9 - # via edx-django-utils + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-django-utils + # edx-enterprise + # edx-proctoring + # edx-rbac + # edx-toggles + # super-csv +django-fernet-fields-v2==0.9 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +django-filter==24.3 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise + # lti-consumer-xblock +django-ipware==7.0.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise + # edx-proctoring +django-js-asset==2.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-mptt +django-method-override==1.0.4 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +django-model-utils==4.5.1 + # via + # -r scripts/user_retirement/requirements/../../../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 + # ora2 + # super-csv +django-mptt==0.16.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # openedx-django-wiki +django-multi-email-field==0.7.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +django-mysql==4.14.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +django-oauth-toolkit==1.7.1 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +django-object-actions==4.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +django-pipeline==3.1.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +django-push-notifications==3.1.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-ace +django-ratelimit==4.1.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +django-sekizai==4.1.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # openedx-django-wiki +django-ses==4.1.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +django-simple-history==3.4.0 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # ora2 +django-statici18n==2.5.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # lti-consumer-xblock + # xblock-drag-and-drop-v2 + # xblock-poll +django-storages==1.14.3 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edxval +django-user-tasks==3.2.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt django-waffle==4.1.0 - # via edx-django-utils + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-django-utils + # edx-drf-extensions + # edx-enterprise + # edx-proctoring + # edx-toggles +django-webpack-loader==0.7.0 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-proctoring +djangorestframework==3.14.0 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-config-models + # django-user-tasks + # drf-jwt + # drf-spectacular + # drf-yasg + # edx-api-doc-tools + # edx-completion + # edx-drf-extensions + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-submissions + # openedx-learning + # ora2 + # super-csv +djangorestframework-xml==2.0.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +dnspython==2.6.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # pymongo +done-xblock==2.3.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +drf-jwt==1.19.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-drf-extensions +drf-spectacular==0.27.2 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +drf-yasg==1.21.7 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-user-tasks + # edx-api-doc-tools +edx-ace==1.11.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-api-doc-tools==1.8.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-name-affirmation +edx-auth-backends==4.3.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-braze-client==0.2.5 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +edx-bulk-grades==1.1.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # staff-graded-xblock +edx-ccx-keys==1.3.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # lti-consumer-xblock + # openedx-events +edx-celeryutils==1.3.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-name-affirmation + # super-csv +edx-codejail==3.4.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-completion==4.6.7 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-django-release-util==1.4.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-submissions + # edxval +edx-django-sites-extensions==4.2.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt edx-django-utils==5.15.0 - # via edx-rest-api-client + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-config-models + # edx-ace + # 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 + # openedx-events + # ora2 + # super-csv +edx-drf-extensions==10.3.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-completion + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-rbac + # edx-when + # edxval + # openedx-learning +edx-enterprise==4.23.8 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-event-bus-kafka==5.8.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-event-bus-redis==0.5.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-i18n-tools==1.5.0 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # ora2 +edx-milestones==0.6.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-name-affirmation==2.3.7 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-opaque-keys[django]==2.10.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-bulk-grades + # edx-ccx-keys + # edx-completion + # edx-drf-extensions + # edx-enterprise + # edx-milestones + # edx-organizations + # edx-proctoring + # edx-when + # lti-consumer-xblock + # openedx-events + # ora2 +edx-organizations==6.13.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-proctoring==4.18.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-proctoring-proctortrack +edx-rbac==1.9.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise edx-rest-api-client==5.7.1 - # via -r scripts/user_retirement/requirements/base.in -google-api-core==2.19.1 - # via google-api-python-client + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # -r scripts/user_retirement/requirements/base.in + # edx-enterprise + # edx-proctoring +edx-search==4.0.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-sga==0.25.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-submissions==3.7.6 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # ora2 +edx-tincan-py35==1.0.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +edx-toggles==5.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-completion + # edx-enterprise + # edx-event-bus-kafka + # edx-event-bus-redis + # edx-name-affirmation + # edx-search + # edxval + # event-tracking + # ora2 +edx-token-utils==0.2.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +edx-when==2.5.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-proctoring +edxval==2.5.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +elasticsearch==7.13.4 + # via + # -c scripts/user_retirement/requirements/../../../requirements/common_constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-search +enmerkar==0.7.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # enmerkar-underscore +enmerkar-underscore==2.3.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +event-tracking==3.0.0 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-completion + # edx-proctoring + # edx-search +fastavro==1.9.5 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # openedx-events +filelock==3.15.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # snowflake-connector-python +firebase-admin==6.5.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-ace +frozenlist==1.4.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # aiohttp + # aiosignal +fs==2.0.27 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # fs-s3fs + # openedx-django-pyfs + # xblock +fs-s3fs==0.1.8 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # openedx-django-pyfs +future==1.0.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # pyjwkest +geoip2==4.8.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +glob2==0.7 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +google-api-core[grpc]==2.19.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # firebase-admin + # google-api-python-client + # google-cloud-core + # google-cloud-firestore + # google-cloud-storage google-api-python-client==2.139.0 - # via -r scripts/user_retirement/requirements/base.in + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # -r scripts/user_retirement/requirements/base.in + # firebase-admin google-auth==2.32.0 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # google-api-core # google-api-python-client # google-auth-httplib2 + # google-cloud-core + # google-cloud-firestore + # google-cloud-storage google-auth-httplib2==0.2.0 - # via google-api-python-client + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-api-python-client +google-cloud-core==2.4.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-cloud-firestore + # google-cloud-storage +google-cloud-firestore==2.17.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # firebase-admin +google-cloud-storage==2.18.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # firebase-admin +google-crc32c==1.5.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-cloud-storage + # google-resumable-media +google-resumable-media==2.7.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-cloud-storage googleapis-common-protos==1.63.2 - # via google-api-core + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-api-core + # grpcio-status +grpcio==1.65.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-api-core + # grpcio-status +grpcio-status==1.62.3 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-api-core +gunicorn==22.0.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +help-tokens==2.4.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +html5lib==1.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # ora2 httplib2==0.22.0 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # google-api-python-client # google-auth-httplib2 +icalendar==5.0.13 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt idna==3.7 - # via requests + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # optimizely-sdk + # requests + # snowflake-connector-python + # yarl +importlib-metadata==6.11.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +inflection==0.5.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # drf-spectacular + # drf-yasg +interchange==2021.0.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # py2neo +ipaddress==1.0.23 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt isodate==0.6.1 - # via zeep + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # python3-saml + # zeep jenkinsapi==0.3.13 # via -r scripts/user_retirement/requirements/base.in +jinja2==3.1.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # code-annotations jmespath==1.0.1 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # boto3 # botocore +joblib==1.4.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # nltk +jsondiff==2.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +jsonfield==3.1.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-celeryutils + # edx-enterprise + # edx-proctoring + # edx-submissions + # lti-consumer-xblock + # ora2 +jsonschema==4.23.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # drf-spectacular + # optimizely-sdk +jsonschema-specifications==2023.12.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # jsonschema +jwcrypto==1.5.6 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-oauth-toolkit + # pylti1p3 +kombu==5.4.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # celery +laboratory==1.0.2 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +lazy==1.6 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # acid-xblock + # lti-consumer-xblock + # ora2 + # xblock +libsass==0.10.0 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +loremipsum==1.0.5 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # ora2 +lti-consumer-xblock==9.11.3 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt lxml==4.9.4 # via # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-i18n-tools + # edxval + # lti-consumer-xblock + # olxcleaner + # openedx-calc + # ora2 + # python3-saml + # xblock + # xmlsec # zeep +mailsnake==1.6.4 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +mako==1.3.5 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # acid-xblock + # lti-consumer-xblock + # xblock + # xblock-utils +markdown==3.3.7 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # openedx-django-wiki + # staff-graded-xblock + # xblock-poll +markupsafe==2.1.5 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # chem + # jinja2 + # mako + # openedx-calc + # xblock +maxminddb==2.6.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # geoip2 +meilisearch==0.31.4 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +mock==5.1.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +mongoengine==0.28.2 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +monotonic==1.6 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # analytics-python + # py2neo more-itertools==10.3.0 - # via simple-salesforce + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # cssutils + # simple-salesforce +mpmath==1.3.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # sympy +msgpack==1.0.8 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # cachecontrol +multidict==6.0.5 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # aiohttp + # yarl +mysqlclient==2.2.4 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt newrelic==9.12.0 - # via edx-django-utils + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-django-utils +nh3==0.2.18 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +nltk==3.8.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # chem +nodeenv==1.9.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +numpy==1.26.4 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # chem + # openedx-calc + # scipy + # shapely +oauthlib==3.2.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-oauth-toolkit + # lti-consumer-xblock + # requests-oauthlib + # social-auth-core +olxcleaner==0.3.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +openai==0.28.1 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +openedx-atlas==0.6.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +openedx-calc==3.1.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +openedx-django-pyfs==3.6.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # lti-consumer-xblock + # xblock +openedx-django-require==2.1.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +openedx-django-wiki==2.1.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +openedx-events==9.11.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-event-bus-kafka + # edx-event-bus-redis + # event-tracking + # ora2 +openedx-filters==1.9.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # lti-consumer-xblock + # ora2 +openedx-learning==0.10.1 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +openedx-mongodbproxy==0.2.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +optimizely-sdk==4.1.1 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +ora2==6.11.2 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +packaging==24.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # drf-yasg + # gunicorn + # py2neo + # snowflake-connector-python +pansi==2020.7.3 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # py2neo +paramiko==3.4.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +path==16.11.0 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-i18n-tools + # path-py +path-py==12.5.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise + # ora2 + # staff-graded-xblock +paver==1.3.4 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt pbr==6.0.0 - # via stevedore + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # stevedore +pgpy==0.6.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +piexif==1.1.3 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +pillow==10.4.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise + # edx-organizations + # edxval platformdirs==4.2.2 - # via zeep + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # snowflake-connector-python + # zeep +polib==1.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-i18n-tools +prompt-toolkit==3.0.47 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # click-repl proto-plus==1.24.0 - # via google-api-core -protobuf==5.27.3 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-api-core + # google-cloud-firestore +protobuf==4.25.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # google-api-core + # google-cloud-firestore # googleapis-common-protos + # grpcio-status # proto-plus psutil==6.0.0 - # via edx-django-utils + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-django-utils +py2neo @ https://github.com/overhangio/py2neo/releases/download/2021.2.3/py2neo-2021.2.3.tar.gz + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt pyasn1==0.6.0 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # pgpy # pyasn1-modules # rsa pyasn1-modules==0.4.0 - # via google-auth + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-auth +pycountry==24.6.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt pycparser==2.22 - # via cffi + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # cffi +pycryptodomex==3.20.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-proctoring + # lti-consumer-xblock + # pyjwkest +pydantic==2.8.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # camel-converter +pydantic-core==2.20.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # pydantic +pygments==2.18.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # py2neo +pyjwkest==1.4.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-token-utils + # lti-consumer-xblock pyjwt[crypto]==2.9.0 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # drf-jwt + # edx-auth-backends + # edx-drf-extensions + # edx-proctoring # edx-rest-api-client + # firebase-admin + # pylti1p3 # simple-salesforce + # snowflake-connector-python + # social-auth-core +pylatexenc==2.10 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # olxcleaner +pylti1p3==2.0.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +pymemcache==4.0.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +pymongo==4.4.0 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-opaque-keys + # event-tracking + # mongoengine + # openedx-mongodbproxy pynacl==1.5.0 - # via edx-django-utils + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-django-utils + # paramiko +pynliner==0.8.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +pyopenssl==24.2.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # optimizely-sdk + # snowflake-connector-python pyparsing==3.1.2 - # via httplib2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # chem + # httplib2 + # openedx-calc +pyrsistent==0.20.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # optimizely-sdk +pysrt==1.1.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edxval python-dateutil==2.9.0.post0 - # via botocore + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # analytics-python + # botocore + # celery + # edx-ace + # edx-enterprise + # edx-proctoring + # icalendar + # olxcleaner + # ora2 + # xblock +python-ipware==3.0.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-ipware +python-memcached==1.62 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +python-slugify==8.0.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # code-annotations +python-swiftclient==4.6.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # ora2 +python3-openid==3.2.0 ; python_version >= "3" + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # social-auth-core +python3-saml==1.16.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt pytz==2024.1 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-ses + # djangorestframework + # drf-yasg + # edx-completion + # edx-enterprise + # edx-proctoring + # edx-submissions + # edx-tincan-py35 + # event-tracking + # fs + # icalendar + # interchange # jenkinsapi + # olxcleaner + # ora2 + # snowflake-connector-python + # xblock # zeep +pyuca==1.2 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt pyyaml==6.0.1 - # via -r scripts/user_retirement/requirements/base.in + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # -r scripts/user_retirement/requirements/base.in + # code-annotations + # drf-spectacular + # drf-yasg + # edx-django-release-util + # edx-i18n-tools + # jsondiff + # xblock +random2==1.0.2 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +recommender-xblock==2.2.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +redis==5.0.8 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # walrus +referencing==0.35.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # jsonschema + # jsonschema-specifications +regex==2024.7.24 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # nltk requests==2.32.3 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # -r scripts/user_retirement/requirements/base.in + # algoliasearch + # analytics-python + # cachecontrol + # django-oauth-toolkit + # edx-bulk-grades + # edx-drf-extensions + # edx-enterprise # edx-rest-api-client + # geoip2 # google-api-core + # google-cloud-storage # jenkinsapi + # mailsnake + # meilisearch + # openai + # optimizely-sdk + # pyjwkest + # pylti1p3 + # python-swiftclient # requests-file + # requests-oauthlib # requests-toolbelt + # sailthru-client # simple-salesforce # slumber + # snowflake-connector-python + # social-auth-core + # xblock-google-drive # zeep requests-file==2.1.0 # via zeep +requests-oauthlib==2.0.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # social-auth-core requests-toolbelt==1.0.0 # via zeep +rpds-py==0.20.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # jsonschema + # referencing rsa==4.9 - # via google-auth + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # google-auth +rules==3.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise + # edx-proctoring + # openedx-learning s3transfer==0.10.2 - # via boto3 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # boto3 +sailthru-client==2.2.3 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-ace +scipy==1.14.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # chem + # openedx-calc +semantic-version==2.10.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-drf-extensions +shapely==2.0.5 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt simple-salesforce==1.12.6 # via -r scripts/user_retirement/requirements/base.in simplejson==3.19.2 - # via -r scripts/user_retirement/requirements/base.in + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # -r scripts/user_retirement/requirements/base.in + # sailthru-client + # super-csv + # xblock + # xblock-utils six==1.16.0 # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # analytics-python + # bleach + # codejail-includes + # crowdsourcehinter-xblock + # edx-ace + # edx-auth-backends + # edx-ccx-keys + # edx-codejail + # edx-django-release-util + # edx-milestones + # edx-rbac + # event-tracking + # fs + # fs-s3fs + # html5lib + # interchange # isodate # jenkinsapi + # libsass + # optimizely-sdk + # pansi + # paver + # py2neo + # pyjwkest # python-dateutil slumber==0.7.1 - # via edx-rest-api-client + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-bulk-grades + # edx-enterprise + # edx-rest-api-client +snowflake-connector-python==3.12.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +social-auth-app-django==5.4.1 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-auth-backends +social-auth-core==4.5.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-auth-backends + # social-auth-app-django +sorl-thumbnail==12.10.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # openedx-django-wiki +sortedcontainers==2.4.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # snowflake-connector-python +soupsieve==2.5 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # beautifulsoup4 sqlparse==0.5.1 - # via django + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django +staff-graded-xblock==2.3.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt stevedore==5.2.0 - # via edx-django-utils + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # code-annotations + # edx-ace + # edx-django-utils + # edx-enterprise + # edx-opaque-keys +super-csv==3.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-bulk-grades +sympy==1.13.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # openedx-calc +testfixtures==8.3.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-enterprise +text-unidecode==1.3 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # python-slugify +tinycss2==1.2.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # bleach +tomlkit==0.13.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # snowflake-connector-python +tqdm==4.66.5 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # nltk + # openai typing-extensions==4.12.2 - # via simple-salesforce + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # django-countries + # edx-opaque-keys + # jwcrypto + # pydantic + # pydantic-core + # pylti1p3 + # simple-salesforce + # snowflake-connector-python +tzdata==2024.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # celery unicodecsv==0.14.1 - # via -r scripts/user_retirement/requirements/base.in + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # -r scripts/user_retirement/requirements/base.in + # edx-enterprise uritemplate==4.1.1 - # via google-api-python-client + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # drf-spectacular + # drf-yasg + # google-api-python-client urllib3==1.26.19 # via # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt # botocore + # elasticsearch + # py2neo # requests +user-util==1.1.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +vine==5.1.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # amqp + # celery + # kombu +voluptuous==0.15.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # ora2 +walrus==0.9.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-event-bus-redis +watchdog==4.0.1 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +wcwidth==0.2.13 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # prompt-toolkit +web-fragments==2.2.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # crowdsourcehinter-xblock + # edx-sga + # staff-graded-xblock + # xblock + # xblock-utils +webencodings==0.5.1 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # bleach + # html5lib + # tinycss2 +webob==1.8.7 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # xblock +wrapt==1.16.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +xblock[django]==4.0.1 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # acid-xblock + # crowdsourcehinter-xblock + # done-xblock + # edx-completion + # edx-sga + # edx-when + # lti-consumer-xblock + # ora2 + # staff-graded-xblock + # xblock-drag-and-drop-v2 + # xblock-google-drive + # xblock-utils +xblock-drag-and-drop-v2==4.0.3 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +xblock-google-drive==0.7.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +xblock-poll==1.14.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +xblock-utils==4.0.0 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # edx-sga + # xblock-poll +xmlsec==1.3.13 + # via + # -c scripts/user_retirement/requirements/../../../requirements/constraints.txt + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # python3-saml +xss-utils==0.6.0 + # via -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt +yarl==1.9.4 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # aiohttp zeep==4.2.1 # via simple-salesforce +zipp==3.19.2 + # via + # -r scripts/user_retirement/requirements/../../../requirements/edx/base.txt + # importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/scripts/user_retirement/requirements/testing.txt b/scripts/user_retirement/requirements/testing.txt index 006eabeef436..6231b3bb3672 100644 --- a/scripts/user_retirement/requirements/testing.txt +++ b/scripts/user_retirement/requirements/testing.txt @@ -4,219 +4,1256 @@ # # make upgrade # +-e git+https://github.com/anupdhabarde/edx-proctoring-proctortrack.git@31c6c9923a51c903ae83760ecbbac191363aa2a2#egg=edx_proctoring_proctortrack + # via -r scripts/user_retirement/requirements/base.txt +acid-xblock==0.3.1 + # via -r scripts/user_retirement/requirements/base.txt +aiohappyeyeballs==2.3.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # aiohttp +aiohttp==3.10.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # geoip2 + # openai +aiosignal==1.3.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # aiohttp +algoliasearch==3.0.0 + # via -r scripts/user_retirement/requirements/base.txt +amqp==5.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # kombu +analytics-python==1.4.post1 + # via -r scripts/user_retirement/requirements/base.txt +aniso8601==9.0.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-tincan-py35 +annotated-types==0.7.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # pydantic +appdirs==1.4.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # fs asgiref==3.8.1 # via # -r scripts/user_retirement/requirements/base.txt # django + # django-cors-headers + # django-countries +asn1crypto==1.5.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # snowflake-connector-python attrs==24.2.0 # via # -r scripts/user_retirement/requirements/base.txt + # aiohttp + # edx-ace + # jsonschema + # lti-consumer-xblock + # openedx-events + # openedx-learning + # referencing # zeep -backoff==2.2.1 +babel==2.15.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # enmerkar + # enmerkar-underscore +backoff==1.10.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # analytics-python +bcrypt==4.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # paramiko +beautifulsoup4==4.12.3 + # via + # -r scripts/user_retirement/requirements/base.txt + # pynliner +billiard==4.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # celery +bleach[css]==6.1.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # lti-consumer-xblock + # openedx-django-wiki + # ora2 + # xblock-drag-and-drop-v2 + # xblock-poll +boto==2.49.0 # via -r scripts/user_retirement/requirements/base.txt boto3==1.34.154 # via # -r scripts/user_retirement/requirements/base.txt + # django-ses + # fs-s3fs # moto + # ora2 botocore==1.34.154 # via # -r scripts/user_retirement/requirements/base.txt # boto3 # moto # s3transfer +bridgekeeper==0.9 + # via -r scripts/user_retirement/requirements/base.txt +cachecontrol==0.14.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # firebase-admin cachetools==5.4.0 # via # -r scripts/user_retirement/requirements/base.txt # google-auth +camel-converter[pydantic]==3.1.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # meilisearch +celery==5.4.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-celery-results + # django-user-tasks + # edx-celeryutils + # edx-enterprise + # event-tracking + # openedx-learning certifi==2024.7.4 # via # -r scripts/user_retirement/requirements/base.txt + # elasticsearch + # py2neo # requests + # snowflake-connector-python cffi==1.17.0 # via # -r scripts/user_retirement/requirements/base.txt # cryptography # pynacl + # snowflake-connector-python +chardet==5.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # pysrt charset-normalizer==2.0.12 # via # -r scripts/user_retirement/requirements/base.txt # requests + # snowflake-connector-python +chem==1.3.0 + # via -r scripts/user_retirement/requirements/base.txt click==8.1.6 # via # -r scripts/user_retirement/requirements/base.txt + # celery + # click-didyoumean + # click-plugins + # click-repl + # code-annotations # edx-django-utils -cryptography==43.0.0 + # nltk + # user-util +click-didyoumean==0.3.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # celery +click-plugins==1.1.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # celery +click-repl==0.3.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # celery +code-annotations==1.8.0 # via # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # edx-toggles +codejail-includes==1.0.0 + # via -r scripts/user_retirement/requirements/base.txt +crowdsourcehinter-xblock==0.7 + # via -r scripts/user_retirement/requirements/base.txt +cryptography==42.0.8 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-fernet-fields-v2 + # edx-enterprise + # jwcrypto # moto + # optimizely-sdk + # paramiko + # pgpy # pyjwt + # pyopenssl + # snowflake-connector-python + # social-auth-core +cssutils==2.11.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # pynliner ddt==1.7.2 # via -r scripts/user_retirement/requirements/testing.in +defusedxml==0.7.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # djangorestframework-xml + # ora2 + # python3-openid + # social-auth-core django==4.2.15 # via # -r scripts/user_retirement/requirements/base.txt + # django-appconf + # django-celery-results + # django-classy-tags + # django-config-models + # django-cors-headers # django-crum + # django-fernet-fields-v2 + # django-filter + # django-js-asset + # django-method-override + # django-model-utils + # django-multi-email-field + # django-mysql + # django-oauth-toolkit + # django-push-notifications + # django-sekizai + # django-ses + # django-statici18n + # django-storages + # django-user-tasks # django-waffle + # djangorestframework + # done-xblock + # drf-jwt + # drf-spectacular + # 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 + # lti-consumer-xblock + # openedx-django-pyfs + # openedx-django-wiki + # openedx-events + # openedx-filters + # openedx-learning + # ora2 + # social-auth-app-django + # super-csv + # xblock-google-drive + # xss-utils +django-appconf==1.0.6 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-statici18n +django-cache-memoize==0.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +django-celery-results==2.5.1 + # via -r scripts/user_retirement/requirements/base.txt +django-classy-tags==4.1.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-sekizai +django-config-models==2.7.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # edx-name-affirmation + # lti-consumer-xblock +django-cors-headers==4.4.0 + # via -r scripts/user_retirement/requirements/base.txt +django-countries==7.6.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise django-crum==0.7.9 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils + # edx-enterprise + # edx-proctoring + # edx-rbac + # edx-toggles + # super-csv +django-fernet-fields-v2==0.9 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +django-filter==24.3 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # lti-consumer-xblock +django-ipware==7.0.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # edx-proctoring +django-js-asset==2.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-mptt +django-method-override==1.0.4 + # via -r scripts/user_retirement/requirements/base.txt +django-model-utils==4.5.1 + # via + # -r scripts/user_retirement/requirements/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 + # ora2 + # super-csv +django-mptt==0.16.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # openedx-django-wiki +django-multi-email-field==0.7.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +django-mysql==4.14.0 + # via -r scripts/user_retirement/requirements/base.txt +django-oauth-toolkit==1.7.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +django-object-actions==4.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +django-pipeline==3.1.0 + # via -r scripts/user_retirement/requirements/base.txt +django-push-notifications==3.1.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-ace +django-ratelimit==4.1.0 + # via -r scripts/user_retirement/requirements/base.txt +django-sekizai==4.1.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # openedx-django-wiki +django-ses==4.1.0 + # via -r scripts/user_retirement/requirements/base.txt +django-simple-history==3.4.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # ora2 +django-statici18n==2.5.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # lti-consumer-xblock + # xblock-drag-and-drop-v2 + # xblock-poll +django-storages==1.14.3 + # via + # -r scripts/user_retirement/requirements/base.txt + # edxval +django-user-tasks==3.2.0 + # via -r scripts/user_retirement/requirements/base.txt django-waffle==4.1.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils + # edx-drf-extensions + # edx-enterprise + # edx-proctoring + # edx-toggles +django-webpack-loader==0.7.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-proctoring +djangorestframework==3.14.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-config-models + # django-user-tasks + # drf-jwt + # drf-spectacular + # drf-yasg + # edx-api-doc-tools + # edx-completion + # edx-drf-extensions + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-submissions + # openedx-learning + # ora2 + # super-csv +djangorestframework-xml==2.0.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +dnspython==2.6.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # pymongo +done-xblock==2.3.0 + # via -r scripts/user_retirement/requirements/base.txt +drf-jwt==1.19.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-drf-extensions +drf-spectacular==0.27.2 + # via -r scripts/user_retirement/requirements/base.txt +drf-yasg==1.21.7 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-user-tasks + # edx-api-doc-tools +edx-ace==1.11.1 + # via -r scripts/user_retirement/requirements/base.txt +edx-api-doc-tools==1.8.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-name-affirmation +edx-auth-backends==4.3.0 + # via -r scripts/user_retirement/requirements/base.txt +edx-braze-client==0.2.5 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +edx-bulk-grades==1.1.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # staff-graded-xblock +edx-ccx-keys==1.3.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # lti-consumer-xblock + # openedx-events +edx-celeryutils==1.3.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-name-affirmation + # super-csv +edx-codejail==3.4.1 + # via -r scripts/user_retirement/requirements/base.txt +edx-completion==4.6.7 + # via -r scripts/user_retirement/requirements/base.txt +edx-django-release-util==1.4.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-submissions + # edxval +edx-django-sites-extensions==4.2.0 + # via -r scripts/user_retirement/requirements/base.txt edx-django-utils==5.15.0 # via # -r scripts/user_retirement/requirements/base.txt + # django-config-models + # edx-ace + # 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 + # openedx-events + # ora2 + # super-csv +edx-drf-extensions==10.3.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-completion + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-rbac + # edx-when + # edxval + # openedx-learning +edx-enterprise==4.23.8 + # via -r scripts/user_retirement/requirements/base.txt +edx-event-bus-kafka==5.8.1 + # via -r scripts/user_retirement/requirements/base.txt +edx-event-bus-redis==0.5.0 + # via -r scripts/user_retirement/requirements/base.txt +edx-i18n-tools==1.5.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # ora2 +edx-milestones==0.6.0 + # via -r scripts/user_retirement/requirements/base.txt +edx-name-affirmation==2.3.7 + # via -r scripts/user_retirement/requirements/base.txt +edx-opaque-keys[django]==2.10.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-bulk-grades + # edx-ccx-keys + # edx-completion + # edx-drf-extensions + # edx-enterprise + # edx-milestones + # edx-organizations + # edx-proctoring + # edx-when + # lti-consumer-xblock + # openedx-events + # ora2 +edx-organizations==6.13.0 + # via -r scripts/user_retirement/requirements/base.txt +edx-proctoring==4.18.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-proctoring-proctortrack +edx-rbac==1.9.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise edx-rest-api-client==5.7.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # edx-proctoring +edx-search==4.0.0 + # via -r scripts/user_retirement/requirements/base.txt +edx-sga==0.25.0 + # via -r scripts/user_retirement/requirements/base.txt +edx-submissions==3.7.6 + # via + # -r scripts/user_retirement/requirements/base.txt + # ora2 +edx-tincan-py35==1.0.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +edx-toggles==5.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-completion + # edx-enterprise + # edx-event-bus-kafka + # edx-event-bus-redis + # edx-name-affirmation + # edx-search + # edxval + # event-tracking + # ora2 +edx-token-utils==0.2.1 + # via -r scripts/user_retirement/requirements/base.txt +edx-when==2.5.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-proctoring +edxval==2.5.0 # via -r scripts/user_retirement/requirements/base.txt -google-api-core==2.19.1 +elasticsearch==7.13.4 # via # -r scripts/user_retirement/requirements/base.txt + # edx-search +enmerkar==0.7.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # enmerkar-underscore +enmerkar-underscore==2.3.0 + # via -r scripts/user_retirement/requirements/base.txt +event-tracking==3.0.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-completion + # edx-proctoring + # edx-search +fastavro==1.9.5 + # via + # -r scripts/user_retirement/requirements/base.txt + # openedx-events +filelock==3.15.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # snowflake-connector-python +firebase-admin==6.5.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-ace +frozenlist==1.4.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # aiohttp + # aiosignal +fs==2.0.27 + # via + # -r scripts/user_retirement/requirements/base.txt + # fs-s3fs + # openedx-django-pyfs + # xblock +fs-s3fs==0.1.8 + # via + # -r scripts/user_retirement/requirements/base.txt + # openedx-django-pyfs +future==1.0.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # pyjwkest +geoip2==4.8.0 + # via -r scripts/user_retirement/requirements/base.txt +glob2==0.7 + # via -r scripts/user_retirement/requirements/base.txt +google-api-core[grpc]==2.19.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # firebase-admin # google-api-python-client + # google-cloud-core + # google-cloud-firestore + # google-cloud-storage google-api-python-client==2.139.0 - # via -r scripts/user_retirement/requirements/base.txt + # via + # -r scripts/user_retirement/requirements/base.txt + # firebase-admin google-auth==2.32.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core # google-api-python-client # google-auth-httplib2 + # google-cloud-core + # google-cloud-firestore + # google-cloud-storage google-auth-httplib2==0.2.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-python-client +google-cloud-core==2.4.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # google-cloud-firestore + # google-cloud-storage +google-cloud-firestore==2.17.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # firebase-admin +google-cloud-storage==2.18.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # firebase-admin +google-crc32c==1.5.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # google-cloud-storage + # google-resumable-media +google-resumable-media==2.7.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # google-cloud-storage googleapis-common-protos==1.63.2 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core + # grpcio-status +grpcio==1.65.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # google-api-core + # grpcio-status +grpcio-status==1.62.3 + # via + # -r scripts/user_retirement/requirements/base.txt + # google-api-core +gunicorn==22.0.0 + # via -r scripts/user_retirement/requirements/base.txt +help-tokens==2.4.0 + # via -r scripts/user_retirement/requirements/base.txt +html5lib==1.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # ora2 httplib2==0.22.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-python-client # google-auth-httplib2 +icalendar==5.0.13 + # via -r scripts/user_retirement/requirements/base.txt idna==3.7 # via # -r scripts/user_retirement/requirements/base.txt + # optimizely-sdk # requests + # snowflake-connector-python + # yarl +importlib-metadata==6.11.0 + # via -r scripts/user_retirement/requirements/base.txt +inflection==0.5.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # drf-spectacular + # drf-yasg iniconfig==2.0.0 # via pytest +interchange==2021.0.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # py2neo +ipaddress==1.0.23 + # via -r scripts/user_retirement/requirements/base.txt isodate==0.6.1 # via # -r scripts/user_retirement/requirements/base.txt + # python3-saml # zeep jenkinsapi==0.3.13 # via -r scripts/user_retirement/requirements/base.txt jinja2==3.1.4 - # via moto + # via + # -r scripts/user_retirement/requirements/base.txt + # code-annotations + # moto jmespath==1.0.1 # via # -r scripts/user_retirement/requirements/base.txt # boto3 # botocore +joblib==1.4.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # nltk +jsondiff==2.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +jsonfield==3.1.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-celeryutils + # edx-enterprise + # edx-proctoring + # edx-submissions + # lti-consumer-xblock + # ora2 +jsonschema==4.23.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # drf-spectacular + # optimizely-sdk +jsonschema-specifications==2023.12.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # jsonschema +jwcrypto==1.5.6 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-oauth-toolkit + # pylti1p3 +kombu==5.4.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # celery +laboratory==1.0.2 + # via -r scripts/user_retirement/requirements/base.txt +lazy==1.6 + # via + # -r scripts/user_retirement/requirements/base.txt + # acid-xblock + # lti-consumer-xblock + # ora2 + # xblock +libsass==0.10.0 + # via -r scripts/user_retirement/requirements/base.txt +loremipsum==1.0.5 + # via + # -r scripts/user_retirement/requirements/base.txt + # ora2 +lti-consumer-xblock==9.11.3 + # via -r scripts/user_retirement/requirements/base.txt lxml==4.9.4 # via # -r scripts/user_retirement/requirements/base.txt + # edx-i18n-tools + # edxval + # lti-consumer-xblock + # olxcleaner + # openedx-calc + # ora2 + # python3-saml + # xblock + # xmlsec # zeep +mailsnake==1.6.4 + # via -r scripts/user_retirement/requirements/base.txt +mako==1.3.5 + # via + # -r scripts/user_retirement/requirements/base.txt + # acid-xblock + # lti-consumer-xblock + # xblock + # xblock-utils +markdown==3.3.7 + # via + # -r scripts/user_retirement/requirements/base.txt + # openedx-django-wiki + # staff-graded-xblock + # xblock-poll markupsafe==2.1.5 # via + # -r scripts/user_retirement/requirements/base.txt + # chem # jinja2 + # mako + # openedx-calc # werkzeug + # xblock +maxminddb==2.6.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # geoip2 +meilisearch==0.31.4 + # via -r scripts/user_retirement/requirements/base.txt mock==5.1.0 - # via -r scripts/user_retirement/requirements/testing.in + # via + # -r scripts/user_retirement/requirements/base.txt + # -r scripts/user_retirement/requirements/testing.in +mongoengine==0.28.2 + # via -r scripts/user_retirement/requirements/base.txt +monotonic==1.6 + # via + # -r scripts/user_retirement/requirements/base.txt + # analytics-python + # py2neo more-itertools==10.3.0 # via # -r scripts/user_retirement/requirements/base.txt + # cssutils # simple-salesforce moto==4.2.14 # via -r scripts/user_retirement/requirements/testing.in +mpmath==1.3.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # sympy +msgpack==1.0.8 + # via + # -r scripts/user_retirement/requirements/base.txt + # cachecontrol +multidict==6.0.5 + # via + # -r scripts/user_retirement/requirements/base.txt + # aiohttp + # yarl +mysqlclient==2.2.4 + # via -r scripts/user_retirement/requirements/base.txt newrelic==9.12.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils +nh3==0.2.18 + # via -r scripts/user_retirement/requirements/base.txt +nltk==3.8.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # chem +nodeenv==1.9.1 + # via -r scripts/user_retirement/requirements/base.txt +numpy==1.26.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # chem + # openedx-calc + # scipy + # shapely +oauthlib==3.2.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-oauth-toolkit + # lti-consumer-xblock + # requests-oauthlib + # social-auth-core +olxcleaner==0.3.0 + # via -r scripts/user_retirement/requirements/base.txt +openai==0.28.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +openedx-atlas==0.6.1 + # via -r scripts/user_retirement/requirements/base.txt +openedx-calc==3.1.0 + # via -r scripts/user_retirement/requirements/base.txt +openedx-django-pyfs==3.6.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # lti-consumer-xblock + # xblock +openedx-django-require==2.1.0 + # via -r scripts/user_retirement/requirements/base.txt +openedx-django-wiki==2.1.0 + # via -r scripts/user_retirement/requirements/base.txt +openedx-events==9.11.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-event-bus-kafka + # edx-event-bus-redis + # event-tracking + # ora2 +openedx-filters==1.9.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # lti-consumer-xblock + # ora2 +openedx-learning==0.10.1 + # via -r scripts/user_retirement/requirements/base.txt +openedx-mongodbproxy==0.2.1 + # via -r scripts/user_retirement/requirements/base.txt +optimizely-sdk==4.1.1 + # via -r scripts/user_retirement/requirements/base.txt +ora2==6.11.2 + # via -r scripts/user_retirement/requirements/base.txt packaging==24.1 - # via pytest + # via + # -r scripts/user_retirement/requirements/base.txt + # drf-yasg + # gunicorn + # py2neo + # pytest + # snowflake-connector-python +pansi==2020.7.3 + # via + # -r scripts/user_retirement/requirements/base.txt + # py2neo +paramiko==3.4.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +path==16.11.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-i18n-tools + # path-py +path-py==12.5.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # ora2 + # staff-graded-xblock +paver==1.3.4 + # via -r scripts/user_retirement/requirements/base.txt pbr==6.0.0 # via # -r scripts/user_retirement/requirements/base.txt # stevedore +pgpy==0.6.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +piexif==1.1.3 + # via -r scripts/user_retirement/requirements/base.txt +pillow==10.4.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # edx-organizations + # edxval platformdirs==4.2.2 # via # -r scripts/user_retirement/requirements/base.txt + # snowflake-connector-python # zeep pluggy==1.5.0 # via pytest +polib==1.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-i18n-tools +prompt-toolkit==3.0.47 + # via + # -r scripts/user_retirement/requirements/base.txt + # click-repl proto-plus==1.24.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core -protobuf==5.27.3 + # google-cloud-firestore +protobuf==4.25.4 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core + # google-cloud-firestore # googleapis-common-protos + # grpcio-status # proto-plus psutil==6.0.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils +py2neo @ https://github.com/overhangio/py2neo/releases/download/2021.2.3/py2neo-2021.2.3.tar.gz + # via -r scripts/user_retirement/requirements/base.txt pyasn1==0.6.0 # via # -r scripts/user_retirement/requirements/base.txt + # pgpy # pyasn1-modules # rsa pyasn1-modules==0.4.0 # via # -r scripts/user_retirement/requirements/base.txt # google-auth +pycountry==24.6.1 + # via -r scripts/user_retirement/requirements/base.txt pycparser==2.22 # via # -r scripts/user_retirement/requirements/base.txt # cffi +pycryptodomex==3.20.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-proctoring + # lti-consumer-xblock + # pyjwkest +pydantic==2.8.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # camel-converter +pydantic-core==2.20.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # pydantic +pygments==2.18.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # py2neo +pyjwkest==1.4.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-token-utils + # lti-consumer-xblock pyjwt[crypto]==2.9.0 # via # -r scripts/user_retirement/requirements/base.txt + # drf-jwt + # edx-auth-backends + # edx-drf-extensions + # edx-proctoring # edx-rest-api-client + # firebase-admin + # pylti1p3 # simple-salesforce + # snowflake-connector-python + # social-auth-core +pylatexenc==2.10 + # via + # -r scripts/user_retirement/requirements/base.txt + # olxcleaner +pylti1p3==2.0.0 + # via -r scripts/user_retirement/requirements/base.txt +pymemcache==4.0.0 + # via -r scripts/user_retirement/requirements/base.txt +pymongo==4.4.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-opaque-keys + # event-tracking + # mongoengine + # openedx-mongodbproxy pynacl==1.5.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils + # paramiko +pynliner==0.8.0 + # via -r scripts/user_retirement/requirements/base.txt +pyopenssl==24.2.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # optimizely-sdk + # snowflake-connector-python pyparsing==3.1.2 # via # -r scripts/user_retirement/requirements/base.txt + # chem # httplib2 + # openedx-calc +pyrsistent==0.20.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # optimizely-sdk +pysrt==1.1.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # edxval pytest==8.3.2 # via -r scripts/user_retirement/requirements/testing.in python-dateutil==2.9.0.post0 # via # -r scripts/user_retirement/requirements/base.txt + # analytics-python # botocore + # celery + # edx-ace + # edx-enterprise + # edx-proctoring + # icalendar # moto + # olxcleaner + # ora2 + # xblock +python-ipware==3.0.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # django-ipware +python-memcached==1.62 + # via -r scripts/user_retirement/requirements/base.txt +python-slugify==8.0.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # code-annotations +python-swiftclient==4.6.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # ora2 +python3-openid==3.2.0 ; python_version >= "3" + # via + # -r scripts/user_retirement/requirements/base.txt + # social-auth-core +python3-saml==1.16.0 + # via -r scripts/user_retirement/requirements/base.txt pytz==2024.1 # via # -r scripts/user_retirement/requirements/base.txt + # django-ses + # djangorestframework + # drf-yasg + # edx-completion + # edx-enterprise + # edx-proctoring + # edx-submissions + # edx-tincan-py35 + # event-tracking + # fs + # icalendar + # interchange # jenkinsapi + # olxcleaner + # ora2 + # snowflake-connector-python + # xblock # zeep +pyuca==1.2 + # via -r scripts/user_retirement/requirements/base.txt pyyaml==6.0.1 # via # -r scripts/user_retirement/requirements/base.txt + # code-annotations + # drf-spectacular + # drf-yasg + # edx-django-release-util + # edx-i18n-tools + # jsondiff # responses + # xblock +random2==1.0.2 + # via -r scripts/user_retirement/requirements/base.txt +recommender-xblock==2.2.0 + # via -r scripts/user_retirement/requirements/base.txt +redis==5.0.8 + # via + # -r scripts/user_retirement/requirements/base.txt + # walrus +referencing==0.35.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # jsonschema + # jsonschema-specifications +regex==2024.7.24 + # via + # -r scripts/user_retirement/requirements/base.txt + # nltk requests==2.32.3 # via # -r scripts/user_retirement/requirements/base.txt + # algoliasearch + # analytics-python + # cachecontrol + # django-oauth-toolkit + # edx-bulk-grades + # edx-drf-extensions + # edx-enterprise # edx-rest-api-client + # geoip2 # google-api-core + # google-cloud-storage # jenkinsapi + # mailsnake + # meilisearch # moto + # openai + # optimizely-sdk + # pyjwkest + # pylti1p3 + # python-swiftclient # requests-file # requests-mock + # requests-oauthlib # requests-toolbelt # responses + # sailthru-client # simple-salesforce # slumber + # snowflake-connector-python + # social-auth-core + # xblock-google-drive # zeep requests-file==2.1.0 # via @@ -224,6 +1261,10 @@ requests-file==2.1.0 # zeep requests-mock==1.12.1 # via -r scripts/user_retirement/requirements/testing.in +requests-oauthlib==2.0.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # social-auth-core requests-toolbelt==1.0.0 # via # -r scripts/user_retirement/requirements/base.txt @@ -232,57 +1273,274 @@ responses==0.25.3 # via # -r scripts/user_retirement/requirements/testing.in # moto +rpds-py==0.20.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # jsonschema + # referencing rsa==4.9 # via # -r scripts/user_retirement/requirements/base.txt # google-auth +rules==3.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise + # edx-proctoring + # openedx-learning s3transfer==0.10.2 # via # -r scripts/user_retirement/requirements/base.txt # boto3 +sailthru-client==2.2.3 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-ace +scipy==1.14.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # chem + # openedx-calc +semantic-version==2.10.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-drf-extensions +shapely==2.0.5 + # via -r scripts/user_retirement/requirements/base.txt simple-salesforce==1.12.6 # via -r scripts/user_retirement/requirements/base.txt simplejson==3.19.2 - # via -r scripts/user_retirement/requirements/base.txt + # via + # -r scripts/user_retirement/requirements/base.txt + # sailthru-client + # super-csv + # xblock + # xblock-utils six==1.16.0 # via # -r scripts/user_retirement/requirements/base.txt + # analytics-python + # bleach + # codejail-includes + # crowdsourcehinter-xblock + # edx-ace + # edx-auth-backends + # edx-ccx-keys + # edx-codejail + # edx-django-release-util + # edx-milestones + # edx-rbac + # event-tracking + # fs + # fs-s3fs + # html5lib + # interchange # isodate # jenkinsapi + # libsass + # optimizely-sdk + # pansi + # paver + # py2neo + # pyjwkest # python-dateutil slumber==0.7.1 # via # -r scripts/user_retirement/requirements/base.txt + # edx-bulk-grades + # edx-enterprise # edx-rest-api-client +snowflake-connector-python==3.12.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +social-auth-app-django==5.4.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-auth-backends +social-auth-core==4.5.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-auth-backends + # social-auth-app-django +sorl-thumbnail==12.10.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # openedx-django-wiki +sortedcontainers==2.4.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # snowflake-connector-python +soupsieve==2.5 + # via + # -r scripts/user_retirement/requirements/base.txt + # beautifulsoup4 sqlparse==0.5.1 # via # -r scripts/user_retirement/requirements/base.txt # django +staff-graded-xblock==2.3.0 + # via -r scripts/user_retirement/requirements/base.txt stevedore==5.2.0 # via # -r scripts/user_retirement/requirements/base.txt + # code-annotations + # edx-ace # edx-django-utils + # edx-enterprise + # edx-opaque-keys +super-csv==3.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-bulk-grades +sympy==1.13.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # openedx-calc +testfixtures==8.3.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise +text-unidecode==1.3 + # via + # -r scripts/user_retirement/requirements/base.txt + # python-slugify +tinycss2==1.2.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # bleach +tomlkit==0.13.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # snowflake-connector-python +tqdm==4.66.5 + # via + # -r scripts/user_retirement/requirements/base.txt + # nltk + # openai typing-extensions==4.12.2 # via # -r scripts/user_retirement/requirements/base.txt + # django-countries + # edx-opaque-keys + # jwcrypto + # pydantic + # pydantic-core + # pylti1p3 # simple-salesforce + # snowflake-connector-python +tzdata==2024.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # celery unicodecsv==0.14.1 - # via -r scripts/user_retirement/requirements/base.txt + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-enterprise uritemplate==4.1.1 # via # -r scripts/user_retirement/requirements/base.txt + # drf-spectacular + # drf-yasg # google-api-python-client urllib3==1.26.19 # via # -r scripts/user_retirement/requirements/base.txt # botocore + # elasticsearch + # py2neo # requests # responses +user-util==1.1.0 + # via -r scripts/user_retirement/requirements/base.txt +vine==5.1.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # amqp + # celery + # kombu +voluptuous==0.15.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # ora2 +walrus==0.9.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-event-bus-redis +watchdog==4.0.1 + # via -r scripts/user_retirement/requirements/base.txt +wcwidth==0.2.13 + # via + # -r scripts/user_retirement/requirements/base.txt + # prompt-toolkit +web-fragments==2.2.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # crowdsourcehinter-xblock + # edx-sga + # staff-graded-xblock + # xblock + # xblock-utils +webencodings==0.5.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # bleach + # html5lib + # tinycss2 +webob==1.8.7 + # via + # -r scripts/user_retirement/requirements/base.txt + # xblock werkzeug==3.0.3 # via moto +wrapt==1.16.0 + # via -r scripts/user_retirement/requirements/base.txt +xblock[django]==4.0.1 + # via + # -r scripts/user_retirement/requirements/base.txt + # acid-xblock + # crowdsourcehinter-xblock + # done-xblock + # edx-completion + # edx-sga + # edx-when + # lti-consumer-xblock + # ora2 + # staff-graded-xblock + # xblock-drag-and-drop-v2 + # xblock-google-drive + # xblock-utils +xblock-drag-and-drop-v2==4.0.3 + # via -r scripts/user_retirement/requirements/base.txt +xblock-google-drive==0.7.0 + # via -r scripts/user_retirement/requirements/base.txt +xblock-poll==1.14.0 + # via -r scripts/user_retirement/requirements/base.txt +xblock-utils==4.0.0 + # via + # -r scripts/user_retirement/requirements/base.txt + # edx-sga + # xblock-poll +xmlsec==1.3.13 + # via + # -r scripts/user_retirement/requirements/base.txt + # python3-saml xmltodict==0.13.0 # via moto +xss-utils==0.6.0 + # via -r scripts/user_retirement/requirements/base.txt +yarl==1.9.4 + # via + # -r scripts/user_retirement/requirements/base.txt + # aiohttp zeep==4.2.1 # via # -r scripts/user_retirement/requirements/base.txt # simple-salesforce +zipp==3.19.2 + # via + # -r scripts/user_retirement/requirements/base.txt + # importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/scripts/user_retirement/tests/test_retire_one_learner.py b/scripts/user_retirement/tests/test_retire_one_learner.py index 844325ea3ed0..a30186cf6e4d 100644 --- a/scripts/user_retirement/tests/test_retire_one_learner.py +++ b/scripts/user_retirement/tests/test_retire_one_learner.py @@ -4,6 +4,8 @@ from unittest.mock import DEFAULT, patch from click.testing import CliRunner +from django.conf import settings +from django.test.utils import override_settings from scripts.user_retirement.retire_one_learner import ( END_STATES, @@ -61,8 +63,8 @@ def test_successful_retirement(*args, **kwargs): result = _call_script(username, fetch_ecom_segment_id=True) - # Called once per API we instantiate (LMS, ECommerce, Credentials) - assert mock_get_access_token.call_count == 3 + # Called once per API we instantiate (LMS, ECommerce, Credentials, Additional Services) + assert mock_get_access_token.call_count == 3 + len(settings.EXTRA_SERVICES_TO_RETIRE_FROM) mock_get_retirement_state.assert_called_once_with(username) assert mock_update_learner_state.call_count == 9 @@ -97,7 +99,7 @@ def test_user_does_not_exist(*args, **kwargs): result = _call_script(username) - assert mock_get_access_token.call_count == 3 + assert mock_get_access_token.call_count == 3 + len(settings.EXTRA_SERVICES_TO_RETIRE_FROM) mock_get_retirement_state.assert_called_once_with(username) mock_update_learner_state.assert_not_called() @@ -132,7 +134,7 @@ def test_bad_learner(*args, **kwargs): mock_get_retirement_state.side_effect = HttpDoesNotExistException result = _call_script(username) - assert mock_get_access_token.call_count == 3 + assert mock_get_access_token.call_count == 3 + len(settings.EXTRA_SERVICES_TO_RETIRE_FROM) mock_get_retirement_state.assert_called_once_with(username) mock_update_learner_state.assert_not_called() @@ -160,7 +162,7 @@ def test_user_in_working_state(*args, **kwargs): result = _call_script(username) - assert mock_get_access_token.call_count == 3 + assert mock_get_access_token.call_count == 3 + len(settings.EXTRA_SERVICES_TO_RETIRE_FROM) mock_get_retirement_state.assert_called_once_with(username) mock_update_learner_state.assert_not_called() @@ -188,7 +190,7 @@ def test_user_in_bad_state(*args, **kwargs): ) result = _call_script(username) - assert mock_get_access_token.call_count == 3 + assert mock_get_access_token.call_count == 3 + len(settings.EXTRA_SERVICES_TO_RETIRE_FROM) mock_get_retirement_state.assert_called_once_with(username) mock_update_learner_state.assert_not_called() @@ -223,7 +225,7 @@ def test_user_in_end_state(*args, **kwargs): result = _call_script(username) - assert mock_get_access_token.call_count == 3 + assert mock_get_access_token.call_count == 3 + len(settings.EXTRA_SERVICES_TO_RETIRE_FROM) mock_get_retirement_state.assert_called_once_with(username) mock_update_learner_state.assert_not_called() @@ -265,7 +267,7 @@ def test_skipping_states(*args, **kwargs): result = _call_script(username) # Called once per API we instantiate (LMS, ECommerce, Credentials) - assert mock_get_access_token.call_count == 3 + assert mock_get_access_token.call_count == 3 + len(settings.EXTRA_SERVICES_TO_RETIRE_FROM) mock_get_retirement_state.assert_called_once_with(username) assert mock_update_learner_state.call_count == 5 diff --git a/scripts/user_retirement/tests/utils/test_edx_api.py b/scripts/user_retirement/tests/utils/test_edx_api.py index eb826cd1a4fd..2c86c2cb97a2 100644 --- a/scripts/user_retirement/tests/utils/test_edx_api.py +++ b/scripts/user_retirement/tests/utils/test_edx_api.py @@ -542,3 +542,44 @@ def test_retire_learner(self, mock_method): original_username=FAKE_ORIGINAL_USERNAME ) ) + + +class TestGenericApi(OAuth2Mixin, unittest.TestCase): + """ + Test the Generic API client. + """ + + @responses.activate(registry=OrderedRegistry) + def setUp(self): + super().setUp() + self.mock_access_token_response() + self.lms_base_url = 'http://localhost:18000/' + self.service_api_base_url = 'http://mock_service_url/' + self.retirement_url = 'mock/retirement_url' + self.generic_api = edx_api.GenericRetirementApi( + self.lms_base_url, + self.service_api_base_url, + 'the_client_id', + 'the_client_secret', + self.retirement_url + ) + + @patch.object(edx_api.GenericRetirementApi, '_request') + def test_retire_learner(self, mock_request): + learner_data = get_fake_user_retirement() + json_data = { + 'edx_lms_user_id': learner_data['user']['id'] + } + responses.add( + POST, + urljoin(self.service_api_base_url, 'mock/retirement_url'), + match=[matchers.json_params_matcher(json_data)] + ) + + self.generic_api.retire_learner(learner=learner_data) + + mock_request.assert_called_once_with( + 'POST', + urljoin(self.service_api_base_url, 'mock/retirement_url/'), + json=json_data + ) diff --git a/scripts/user_retirement/utils/edx_api.py b/scripts/user_retirement/utils/edx_api.py index e891f04019a9..b0c5ffae468b 100644 --- a/scripts/user_retirement/utils/edx_api.py +++ b/scripts/user_retirement/utils/edx_api.py @@ -490,3 +490,21 @@ def retire_learner(self, learner): except HttpDoesNotExistException: LOG.info("No license manager data found for user") return True + + +class GenericRetirementApi(BaseApiClient): + """ + Generic API client. + """ + def __init__(self, lms_base_url, api_base_url, client_id, client_secret, retirement_url_path): + super().__init__(lms_base_url, api_base_url, client_id, client_secret) + self.retirement_url_path = retirement_url_path + + @_retry_lms_api() + def retire_learner(self, learner): + """ + Performs the learner retirement step for additonal services. + """ + data = {'edx_lms_user_id': learner['user']['id']} + api_url = self.get_api_url(self.retirement_url_path) + return self._request('POST', api_url, json=data) diff --git a/scripts/user_retirement/utils/helpers.py b/scripts/user_retirement/utils/helpers.py index 1bcbadb4b3c4..7704a25621d9 100644 --- a/scripts/user_retirement/utils/helpers.py +++ b/scripts/user_retirement/utils/helpers.py @@ -16,9 +16,11 @@ import yaml from six import text_type +from django.conf import settings from scripts.user_retirement.utils.edx_api import LmsApi # pylint: disable=wrong-import-position -from scripts.user_retirement.utils.edx_api import CredentialsApi, EcommerceApi, LicenseManagerApi +from scripts.user_retirement.utils.edx_api import CredentialsApi, EcommerceApi, GenericRetirementApi, \ + LicenseManagerApi from scripts.user_retirement.utils.thirdparty_apis.amplitude_api import \ AmplitudeApi # pylint: disable=wrong-import-position from scripts.user_retirement.utils.thirdparty_apis.braze_api import BrazeApi # pylint: disable=wrong-import-position @@ -172,15 +174,19 @@ def _setup_all_apis_or_exit(fail_func, fail_code, config): hubspot_from_address = config.get('hubspot_from_address', None) hubspot_alert_email = config.get('hubspot_alert_email', None) + required_services = [ + ('BRAZE', braze_api_key), + ('AMPLITUDE', amplitude_api_key), + ('ECOMMERCE', ecommerce_base_url), + ('CREDENTIALS', credentials_base_url), + ('SEGMENT', segment_base_url), + ('HUBSPOT', hubspot_api_key), + ] + extra_services = [(service['name'], service['service_base_url']) for service in settings.EXTRA_SERVICES_TO_RETIRE_FROM] + all_services = required_services + extra_services + for state in config['retirement_pipeline']: - for service, service_url in ( - ('BRAZE', braze_api_key), - ('AMPLITUDE', amplitude_api_key), - ('ECOMMERCE', ecommerce_base_url), - ('CREDENTIALS', credentials_base_url), - ('SEGMENT', segment_base_url), - ('HUBSPOT', hubspot_api_key), - ): + for service, service_url in (all_services): if state[2] == service and service_url is None: fail_func(fail_code, 'Service URL is not configured, but required for state {}'.format(state)) @@ -235,5 +241,15 @@ def _setup_all_apis_or_exit(fail_func, fail_code, config): segment_auth_token, segment_workspace_slug ) + + for service_config in settings.EXTRA_SERVICES_TO_RETIRE_FROM: + service_name = service_config['name'] + config[service_name] = GenericRetirementApi( + lms_base_url, + service_config['service_base_url'], + client_id, + client_secret, + service_config['retirement_url_path'] + ) except Exception as exc: # pylint: disable=broad-except fail_func(fail_code, 'Unexpected error occurred!', exc)