Merge pull request #35203 from openedx/jolivier/SONIC-561/coordinator-retirement

feat: Commerce Coordinator step in retirement pipeline
This commit is contained in:
Jade Olivier
2024-08-15 12:43:58 +02:00
committed by GitHub
13 changed files with 2857 additions and 87 deletions

View File

@@ -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

View File

@@ -5003,6 +5003,8 @@ RETIREMENT_STATES = [
'COMPLETE',
]
EXTRA_SERVICES_TO_RETIRE_FROM = []
USERNAME_REPLACEMENT_WORKER = "REPLACE WITH VALID USERNAME"
############## Settings for Microfrontends #########################

View File

@@ -662,6 +662,14 @@ SUBSCRIPTIONS_TRIAL_LENGTH = 7
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.

View File

@@ -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:

View File

@@ -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 <https://github.com/openedx/edx-platform/blob/master/lms/envs/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

View File

@@ -0,0 +1,3 @@
[pytest]
DJANGO_SETTINGS_MODULE = lms.envs.test

View File

@@ -1,4 +1,5 @@
-c ../../../requirements/constraints.txt
-r ../../../requirements/edx/base.txt
boto3
click

View File

@@ -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
more-itertools==10.3.0
# via simple-salesforce
newrelic==9.12.0
# via edx-django-utils
pbr==6.0.0
# via stevedore
platformdirs==4.2.2
# via zeep
proto-plus==1.24.0
# via google-api-core
protobuf==5.27.3
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
# -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
# -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
# -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
# -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
# -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

View File

@@ -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-rest-api-client==5.7.1
# via -r scripts/user_retirement/requirements/base.txt
google-api-core==2.19.1
# 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
# google-api-python-client
google-api-python-client==2.139.0
# 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
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
# 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

View File

@@ -4,6 +4,8 @@ Test the retire_one_learner.py script
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

View File

@@ -542,3 +542,44 @@ class TestLicenseManagerApi(OAuth2Mixin, unittest.TestCase):
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
)

View File

@@ -490,3 +490,21 @@ class LicenseManagerApi(BaseApiClient):
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)

View File

@@ -16,9 +16,11 @@ import unicodedata
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)