From 19344446b31bc94e1b4f0a46f7a8ca5647242554 Mon Sep 17 00:00:00 2001 From: Troy Sankey Date: Fri, 16 Feb 2024 09:44:12 -0800 Subject: [PATCH] feat: supply `parent_content_key` to transaction when redeeming content By storing the parent_content_key (i.e. course key) in addition to the content_key (i.e. course run key) on the transaction object, downstream consumers of transactions can conveniently determine the course key without needing to either A) construct it themselves from the course run key (not future proof) or B) make an API request to fetch the course key (not performant when working with many transactions). In support of ENT-8389 and ADR 0008 in openedx-ledger --- enterprise_subsidy/apps/api/v1/serializers.py | 1 + .../apps/api/v1/tests/test_views.py | 5 ++ enterprise_subsidy/apps/subsidy/models.py | 36 +++++++++--- requirements/base.txt | 24 ++++---- requirements/ci.txt | 2 +- requirements/dev.txt | 55 ++++++++----------- requirements/django.txt | 2 +- requirements/doc.txt | 49 +++++++---------- requirements/pip-tools.txt | 6 +- requirements/pip.txt | 2 +- requirements/production.txt | 29 +++++----- requirements/quality.txt | 49 +++++++---------- requirements/test.txt | 35 ++++++------ requirements/validation.txt | 52 +++++++----------- 14 files changed, 166 insertions(+), 181 deletions(-) diff --git a/enterprise_subsidy/apps/api/v1/serializers.py b/enterprise_subsidy/apps/api/v1/serializers.py index 33358a5f..9773261d 100644 --- a/enterprise_subsidy/apps/api/v1/serializers.py +++ b/enterprise_subsidy/apps/api/v1/serializers.py @@ -135,6 +135,7 @@ class Meta: "lms_user_id", "lms_user_email", "content_key", + "parent_content_key", "content_title", "quantity", "unit", # Manually fetch from parent ledger via get_unit(). diff --git a/enterprise_subsidy/apps/api/v1/tests/test_views.py b/enterprise_subsidy/apps/api/v1/tests/test_views.py index 8a77378e..f52ff153 100644 --- a/enterprise_subsidy/apps/api/v1/tests/test_views.py +++ b/enterprise_subsidy/apps/api/v1/tests/test_views.py @@ -56,8 +56,10 @@ class APITestBase(APITestMixin): subsidy_access_policy_3_uuid = str(uuid.uuid4()) subsidy_4_transaction_1_uuid = str(uuid.uuid4()) subsidy_4_transaction_2_uuid = str(uuid.uuid4()) + parent_content_key_1 = "edX+test" content_key_1 = "course-v1:edX+test+course.1" content_title_1 = "edx: Test Course 1" + parent_content_key_2 = "edX+test" content_key_2 = "course-v1:edX+test+course.2" content_title_2 = "edx: Test Course 2" lms_user_email = 'edx@example.com' @@ -83,6 +85,7 @@ def setUp(self): lms_user_email=self.lms_user_email, subsidy_access_policy_uuid=self.subsidy_access_policy_1_uuid, content_key=self.content_key_1, + parent_content_key=self.parent_content_key_1, content_title=self.content_title_1, ) self.subsidy_1_transaction_2 = TransactionFactory( @@ -94,6 +97,7 @@ def setUp(self): lms_user_email=self.lms_user_email, subsidy_access_policy_uuid=self.subsidy_access_policy_2_uuid, content_key=self.content_key_2, + parent_content_key=self.parent_content_key_2, content_title=self.content_title_2, ) @@ -342,6 +346,7 @@ def test_can_redeem_happy_path(self, has_existing_transaction, mock_lms_user_cli 'lms_user_email': self.lms_user_email, 'subsidy_access_policy_uuid': str(self.subsidy_access_policy_1_uuid), 'content_key': self.content_key_1, + 'parent_content_key': self.parent_content_key_1, 'content_title': self.content_title_1, 'external_reference': [], 'transaction_status_api_url': f"{self.transaction_status_api_url}/{self.subsidy_1_transaction_1_uuid}/", diff --git a/enterprise_subsidy/apps/subsidy/models.py b/enterprise_subsidy/apps/subsidy/models.py index 595d50f4..5584f152 100644 --- a/enterprise_subsidy/apps/subsidy/models.py +++ b/enterprise_subsidy/apps/subsidy/models.py @@ -294,27 +294,37 @@ def email_for_learner(self, lms_user_id): return user_data.get('email') return None - def title_for_content(self, content_key): + def metadata_summary_for_content(self, content_key): """ - Best effort return the title of the given content. + Best effort return the metadata summary of the given content. Returns: - string: Title of content or None. + dict: Metadata summary (or empty dict if there is a bug in our code). + + Raises: + ContentNotFoundForCustomerException: If the metadata service returned 404. """ - content_title = None + content_summary = {} try: content_summary = self.content_metadata_api().get_content_summary( self.enterprise_customer_uuid, content_key ) - if content_summary: - content_title = content_summary.get('content_title') except HTTPError as exc: if exc.response.status_code == status.HTTP_404_NOT_FOUND: raise ContentNotFoundForCustomerException( 'The given content_key is not in any catalog for this customer.' ) from exc - return content_title + return content_summary + + def title_for_content(self, content_key): + """ + Best effort return the title of the given content. + + Returns: + string: Title of content or None. + """ + return self.metadata_summary_for_content(content_key).get('content_title') def price_for_content(self, content_key): """ @@ -346,6 +356,7 @@ def create_transaction( lms_user_id=None, lms_user_email=None, content_key=None, + parent_content_key=None, content_title=None, subsidy_access_policy_uuid=None, **transaction_metadata @@ -366,6 +377,7 @@ def create_transaction( lms_user_id=lms_user_id, lms_user_email=lms_user_email, content_key=content_key, + parent_content_key=parent_content_key, content_title=content_title, subsidy_access_policy_uuid=subsidy_access_policy_uuid, **transaction_metadata, @@ -442,10 +454,16 @@ def redeem( return (None, False) try: lms_user_email = self.email_for_learner(lms_user_id) - content_title = self.title_for_content(content_key) + + # Fetch one or more metadata keys from catalog service, with overall metadata request locally cached. + content_metadata_summary = self.metadata_summary_for_content(content_key) + content_title = content_metadata_summary.get('content_title') + parent_content_key = content_metadata_summary.get('content_key') + transaction = self._create_redemption( lms_user_id, content_key, + parent_content_key, content_price, subsidy_access_policy_uuid, lms_user_email=lms_user_email, @@ -476,6 +494,7 @@ def _create_redemption( self, lms_user_id, content_key, + parent_content_key, content_price, subsidy_access_policy_uuid, content_title=None, @@ -531,6 +550,7 @@ def _create_redemption( idempotency_key, quantity, content_key=content_key, + parent_content_key=parent_content_key, content_title=content_title, lms_user_id=lms_user_id, lms_user_email=lms_user_email, diff --git a/requirements/base.txt b/requirements/base.txt index 1e87f4c6..2a67f5c4 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -27,7 +27,7 @@ charset-normalizer==3.3.2 # via requests click==8.1.7 # via edx-django-utils -cryptography==42.0.2 +cryptography==42.0.4 # via # pyjwt # social-auth-core @@ -35,7 +35,7 @@ defusedxml==0.8.0rc2 # via # python3-openid # social-auth-core -django==4.2.9 +django==4.2.10 # via # -c requirements/constraints.txt # -r requirements/base.in @@ -78,7 +78,7 @@ django-filter==23.5 # openedx-ledger django-log-request-id==2.1.0 # via -r requirements/base.in -django-model-utils==4.3.1 +django-model-utils==4.4.0 # via edx-rbac django-object-actions==4.2.0 # via @@ -123,8 +123,9 @@ edx-django-utils==5.10.1 # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients + # openedx-events # openedx-ledger -edx-drf-extensions==10.1.0 +edx-drf-extensions==10.2.0 # via # -r requirements/base.in # edx-rbac @@ -138,7 +139,7 @@ edx-rbac==1.8.0 # openedx-ledger edx-rest-api-client==5.6.1 # via -r requirements/base.in -fastavro==1.9.3 +fastavro==1.9.4 # via openedx-events getsmarter-api-clients==0.6.1 # via -r requirements/base.in @@ -160,7 +161,7 @@ jsonschema==4.21.1 # via drf-spectacular jsonschema-specifications==2023.12.1 # via jsonschema -mysqlclient==2.2.3 +mysqlclient==2.2.4 # via # -r requirements/base.in # openedx-ledger @@ -171,11 +172,11 @@ oauthlib==3.2.2 # getsmarter-api-clients # requests-oauthlib # social-auth-core -openedx-events==9.4.0 +openedx-events==9.5.2 # via # -r requirements/base.in # openedx-ledger -openedx-ledger==1.3.2 +openedx-ledger==1.4.0 # via -r requirements/base.in packaging==23.2 # via drf-yasg @@ -195,7 +196,6 @@ pyjwt[crypto]==2.8.0 # edx-auth-backends # edx-drf-extensions # edx-rest-api-client - # pyjwt # social-auth-core pymemcache==4.0.0 # via -r requirements/base.in @@ -234,7 +234,7 @@ requests-oauthlib==1.3.1 # via # getsmarter-api-clients # social-auth-core -rpds-py==0.17.1 +rpds-py==0.18.0 # via # jsonschema # referencing @@ -253,7 +253,7 @@ slumber==0.7.1 # via edx-rest-api-client social-auth-app-django==5.4.0 # via edx-auth-backends -social-auth-core==4.5.2 +social-auth-core==4.5.3 # via # edx-auth-backends # social-auth-app-django @@ -272,7 +272,7 @@ uritemplate==4.1.1 # via # drf-spectacular # drf-yasg -urllib3==2.2.0 +urllib3==2.2.1 # via requests zipp==3.17.0 # via importlib-resources diff --git a/requirements/ci.txt b/requirements/ci.txt index 742e39c1..bd57292b 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -32,7 +32,7 @@ tomli==2.0.1 # via # pyproject-api # tox -tox==4.12.1 +tox==4.13.0 # via -r requirements/ci.in virtualenv==20.25.0 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index 841d65f4..352b4c58 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -75,16 +75,14 @@ colorama==0.4.6 # via # -r requirements/validation.txt # tox -coverage[toml]==7.4.1 +coverage[toml]==7.4.2 # via # -r requirements/validation.txt - # coverage # pytest-cov -cryptography==42.0.2 +cryptography==42.0.4 # via # -r requirements/validation.txt # pyjwt - # secretstorage # social-auth-core ddt==1.7.1 # via @@ -105,7 +103,7 @@ distlib==0.3.8 # via # -r requirements/validation.txt # virtualenv -django==4.2.9 +django==4.2.10 # via # -r requirements/validation.txt # django-clearcache @@ -155,7 +153,7 @@ django-filter==23.5 # openedx-ledger django-log-request-id==2.1.0 # via -r requirements/validation.txt -django-model-utils==4.3.1 +django-model-utils==4.4.0 # via # -r requirements/validation.txt # edx-rbac @@ -208,8 +206,9 @@ edx-django-utils==5.10.1 # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients + # openedx-events # openedx-ledger -edx-drf-extensions==10.1.0 +edx-drf-extensions==10.2.0 # via # -r requirements/validation.txt # edx-rbac @@ -221,7 +220,6 @@ edx-opaque-keys[django]==2.5.1 # via # -r requirements/validation.txt # edx-drf-extensions - # edx-opaque-keys # openedx-events edx-rbac==1.8.0 # via @@ -235,11 +233,11 @@ exceptiongroup==1.2.0 # pytest factory-boy==3.3.0 # via -r requirements/validation.txt -faker==22.6.0 +faker==23.2.1 # via # -r requirements/validation.txt # factory-boy -fastavro==1.9.3 +fastavro==1.9.4 # via # -r requirements/validation.txt # openedx-events @@ -280,15 +278,10 @@ isort==5.13.2 # via # -r requirements/validation.txt # pylint -jaraco-classes==3.3.0 - # via - # -r requirements/validation.txt - # keyring -jeepney==0.8.0 +jaraco-classes==3.3.1 # via # -r requirements/validation.txt # keyring - # secretstorage jinja2==3.1.3 # via # -r requirements/validation.txt @@ -334,7 +327,7 @@ more-itertools==10.2.0 # via # -r requirements/validation.txt # jaraco-classes -mysqlclient==2.2.3 +mysqlclient==2.2.4 # via # -r requirements/validation.txt # openedx-ledger @@ -352,11 +345,11 @@ oauthlib==3.2.2 # getsmarter-api-clients # requests-oauthlib # social-auth-core -openedx-events==9.4.0 +openedx-events==9.5.2 # via # -r requirements/validation.txt # openedx-ledger -openedx-ledger==1.3.2 +openedx-ledger==1.4.0 # via -r requirements/validation.txt packaging==23.2 # via @@ -373,7 +366,7 @@ pbr==6.0.0 # via # -r requirements/validation.txt # stevedore -pip-tools==7.3.0 +pip-tools==7.4.0 # via -r requirements/pip-tools.txt pkginfo==1.9.6 # via @@ -426,7 +419,6 @@ pyjwt[crypto]==2.8.0 # edx-auth-backends # edx-drf-extensions # edx-rest-api-client - # pyjwt # social-auth-core pylint==3.0.3 # via @@ -466,7 +458,8 @@ pyproject-hooks==1.0.0 # via # -r requirements/pip-tools.txt # build -pytest==8.0.0 + # pip-tools +pytest==8.0.1 # via # -r requirements/validation.txt # pytest-cov @@ -479,7 +472,7 @@ python-dateutil==2.8.2 # via # -r requirements/validation.txt # faker -python-slugify==8.0.3 +python-slugify==8.0.4 # via # -r requirements/validation.txt # code-annotations @@ -536,7 +529,7 @@ requests-toolbelt==1.0.0 # via # -r requirements/validation.txt # twine -responses==0.24.1 +responses==0.25.0 # via -r requirements/validation.txt rfc3986==2.0.0 # via @@ -546,7 +539,7 @@ rich==13.7.0 # via # -r requirements/validation.txt # twine -rpds-py==0.17.1 +rpds-py==0.18.0 # via # -r requirements/validation.txt # jsonschema @@ -555,10 +548,6 @@ rules==3.3 # via # -r requirements/validation.txt # openedx-ledger -secretstorage==3.3.3 - # via - # -r requirements/validation.txt - # keyring semantic-version==2.10.0 # via # -r requirements/validation.txt @@ -583,7 +572,7 @@ social-auth-app-django==5.4.0 # via # -r requirements/validation.txt # edx-auth-backends -social-auth-core==4.5.2 +social-auth-core==4.5.3 # via # -r requirements/validation.txt # edx-auth-backends @@ -619,9 +608,9 @@ tomlkit==0.12.3 # via # -r requirements/validation.txt # pylint -tox==4.12.1 +tox==4.13.0 # via -r requirements/validation.txt -twine==4.0.2 +twine==5.0.0 # via -r requirements/validation.txt typing-extensions==4.9.0 # via @@ -638,7 +627,7 @@ uritemplate==4.1.1 # -r requirements/validation.txt # drf-spectacular # drf-yasg -urllib3==2.2.0 +urllib3==2.2.1 # via # -r requirements/validation.txt # requests diff --git a/requirements/django.txt b/requirements/django.txt index 01c70d8d..1facfe28 100644 --- a/requirements/django.txt +++ b/requirements/django.txt @@ -1 +1 @@ -django==4.2.9 +django==4.2.10 diff --git a/requirements/doc.txt b/requirements/doc.txt index fde2ca58..7b9032b1 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -80,16 +80,14 @@ colorama==0.4.6 # via # -r requirements/test.txt # tox -coverage[toml]==7.4.1 +coverage[toml]==7.4.2 # via # -r requirements/test.txt - # coverage # pytest-cov -cryptography==42.0.2 +cryptography==42.0.4 # via # -r requirements/test.txt # pyjwt - # secretstorage # social-auth-core ddt==1.7.1 # via -r requirements/test.txt @@ -106,7 +104,7 @@ distlib==0.3.8 # via # -r requirements/test.txt # virtualenv -django==4.2.9 +django==4.2.10 # via # -c requirements/constraints.txt # -r requirements/test.txt @@ -152,7 +150,7 @@ django-filter==23.5 # openedx-ledger django-log-request-id==2.1.0 # via -r requirements/test.txt -django-model-utils==4.3.1 +django-model-utils==4.4.0 # via # -r requirements/test.txt # edx-rbac @@ -210,8 +208,9 @@ edx-django-utils==5.10.1 # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients + # openedx-events # openedx-ledger -edx-drf-extensions==10.1.0 +edx-drf-extensions==10.2.0 # via # -r requirements/test.txt # edx-rbac @@ -221,7 +220,6 @@ edx-opaque-keys[django]==2.5.1 # via # -r requirements/test.txt # edx-drf-extensions - # edx-opaque-keys # openedx-events edx-rbac==1.8.0 # via @@ -235,11 +233,11 @@ exceptiongroup==1.2.0 # pytest factory-boy==3.3.0 # via -r requirements/test.txt -faker==22.6.0 +faker==23.2.1 # via # -r requirements/test.txt # factory-boy -fastavro==1.9.3 +fastavro==1.9.4 # via # -r requirements/test.txt # openedx-events @@ -281,12 +279,8 @@ isort==5.13.2 # via # -r requirements/test.txt # pylint -jaraco-classes==3.3.0 +jaraco-classes==3.3.1 # via keyring -jeepney==0.8.0 - # via - # keyring - # secretstorage jinja2==3.1.3 # via # -r requirements/test.txt @@ -322,7 +316,7 @@ mock==5.1.0 # via -r requirements/test.txt more-itertools==10.2.0 # via jaraco-classes -mysqlclient==2.2.3 +mysqlclient==2.2.4 # via # -r requirements/test.txt # openedx-ledger @@ -338,11 +332,11 @@ oauthlib==3.2.2 # getsmarter-api-clients # requests-oauthlib # social-auth-core -openedx-events==9.4.0 +openedx-events==9.5.2 # via # -r requirements/test.txt # openedx-ledger -openedx-ledger==1.3.2 +openedx-ledger==1.4.0 # via -r requirements/test.txt packaging==23.2 # via @@ -404,7 +398,6 @@ pyjwt[crypto]==2.8.0 # edx-auth-backends # edx-drf-extensions # edx-rest-api-client - # pyjwt # social-auth-core pylint==3.0.3 # via @@ -442,7 +435,7 @@ pyproject-api==1.6.1 # tox pyproject-hooks==1.0.0 # via build -pytest==8.0.0 +pytest==8.0.1 # via # -r requirements/test.txt # pytest-cov @@ -455,7 +448,7 @@ python-dateutil==2.8.2 # via # -r requirements/test.txt # faker -python-slugify==8.0.3 +python-slugify==8.0.4 # via # -r requirements/test.txt # code-annotations @@ -509,7 +502,7 @@ requests-oauthlib==1.3.1 # social-auth-core requests-toolbelt==1.0.0 # via twine -responses==0.24.1 +responses==0.25.0 # via -r requirements/test.txt restructuredtext-lint==1.4.0 # via doc8 @@ -517,7 +510,7 @@ rfc3986==2.0.0 # via twine rich==13.7.0 # via twine -rpds-py==0.17.1 +rpds-py==0.18.0 # via # -r requirements/test.txt # jsonschema @@ -526,8 +519,6 @@ rules==3.3 # via # -r requirements/test.txt # openedx-ledger -secretstorage==3.3.3 - # via keyring semantic-version==2.10.0 # via # -r requirements/test.txt @@ -550,7 +541,7 @@ social-auth-app-django==5.4.0 # via # -r requirements/test.txt # edx-auth-backends -social-auth-core==4.5.2 +social-auth-core==4.5.3 # via # -r requirements/test.txt # edx-auth-backends @@ -606,9 +597,9 @@ tomlkit==0.12.3 # via # -r requirements/test.txt # pylint -tox==4.12.1 +tox==4.13.0 # via -r requirements/test.txt -twine==4.0.2 +twine==5.0.0 # via -r requirements/doc.in typing-extensions==4.9.0 # via @@ -626,7 +617,7 @@ uritemplate==4.1.1 # -r requirements/test.txt # drf-spectacular # drf-yasg -urllib3==2.2.0 +urllib3==2.2.1 # via # -r requirements/test.txt # requests diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 0e882265..44c48d99 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -12,10 +12,12 @@ importlib-metadata==7.0.1 # via build packaging==23.2 # via build -pip-tools==7.3.0 +pip-tools==7.4.0 # via -r requirements/pip-tools.in pyproject-hooks==1.0.0 - # via build + # via + # build + # pip-tools tomli==2.0.1 # via # build diff --git a/requirements/pip.txt b/requirements/pip.txt index dfa2b778..71954cc6 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -10,5 +10,5 @@ wheel==0.42.0 # The following packages are considered to be unsafe in a requirements file: pip==24.0 # via -r requirements/pip.in -setuptools==69.0.3 +setuptools==69.1.0 # via -r requirements/pip.in diff --git a/requirements/production.txt b/requirements/production.txt index 9adcaf24..c7b1311f 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -40,7 +40,7 @@ click==8.1.7 # via # -r requirements/base.txt # edx-django-utils -cryptography==42.0.2 +cryptography==42.0.4 # via # -r requirements/base.txt # pyjwt @@ -50,7 +50,7 @@ defusedxml==0.8.0rc2 # -r requirements/base.txt # python3-openid # social-auth-core -django==4.2.9 +django==4.2.10 # via # -r requirements/base.txt # django-clearcache @@ -93,7 +93,7 @@ django-filter==23.5 # openedx-ledger django-log-request-id==2.1.0 # via -r requirements/base.txt -django-model-utils==4.3.1 +django-model-utils==4.4.0 # via # -r requirements/base.txt # edx-rbac @@ -141,8 +141,9 @@ edx-django-utils==5.10.1 # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients + # openedx-events # openedx-ledger -edx-drf-extensions==10.1.0 +edx-drf-extensions==10.2.0 # via # -r requirements/base.txt # edx-rbac @@ -150,7 +151,6 @@ edx-opaque-keys[django]==2.5.1 # via # -r requirements/base.txt # edx-drf-extensions - # edx-opaque-keys # openedx-events edx-rbac==1.8.0 # via @@ -158,13 +158,13 @@ edx-rbac==1.8.0 # openedx-ledger edx-rest-api-client==5.6.1 # via -r requirements/base.txt -fastavro==1.9.3 +fastavro==1.9.4 # via # -r requirements/base.txt # openedx-events getsmarter-api-clients==0.6.1 # via -r requirements/base.txt -gevent==23.9.1 +gevent==24.2.1 # via -r requirements/production.in greenlet==3.0.3 # via gevent @@ -196,7 +196,7 @@ jsonschema-specifications==2023.12.1 # via # -r requirements/base.txt # jsonschema -mysqlclient==2.2.3 +mysqlclient==2.2.4 # via # -r requirements/base.txt # -r requirements/production.in @@ -211,11 +211,11 @@ oauthlib==3.2.2 # getsmarter-api-clients # requests-oauthlib # social-auth-core -openedx-events==9.4.0 +openedx-events==9.5.2 # via # -r requirements/base.txt # openedx-ledger -openedx-ledger==1.3.2 +openedx-ledger==1.4.0 # via -r requirements/base.txt packaging==23.2 # via @@ -249,7 +249,6 @@ pyjwt[crypto]==2.8.0 # edx-auth-backends # edx-drf-extensions # edx-rest-api-client - # pyjwt # social-auth-core pymemcache==4.0.0 # via -r requirements/base.txt @@ -303,7 +302,7 @@ requests-oauthlib==1.3.1 # -r requirements/base.txt # getsmarter-api-clients # social-auth-core -rpds-py==0.17.1 +rpds-py==0.18.0 # via # -r requirements/base.txt # jsonschema @@ -330,7 +329,7 @@ social-auth-app-django==5.4.0 # via # -r requirements/base.txt # edx-auth-backends -social-auth-core==4.5.2 +social-auth-core==4.5.3 # via # -r requirements/base.txt # edx-auth-backends @@ -355,7 +354,7 @@ uritemplate==4.1.1 # -r requirements/base.txt # drf-spectacular # drf-yasg -urllib3==2.2.0 +urllib3==2.2.1 # via # -r requirements/base.txt # requests @@ -365,7 +364,7 @@ zipp==3.17.0 # importlib-resources zope-event==5.0 # via gevent -zope-interface==6.1 +zope-interface==6.2 # via gevent # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/quality.txt b/requirements/quality.txt index 74b93b56..c8503c8b 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -68,16 +68,14 @@ colorama==0.4.6 # via # -r requirements/test.txt # tox -coverage[toml]==7.4.1 +coverage[toml]==7.4.2 # via # -r requirements/test.txt - # coverage # pytest-cov -cryptography==42.0.2 +cryptography==42.0.4 # via # -r requirements/test.txt # pyjwt - # secretstorage # social-auth-core ddt==1.7.1 # via -r requirements/test.txt @@ -94,7 +92,7 @@ distlib==0.3.8 # via # -r requirements/test.txt # virtualenv -django==4.2.9 +django==4.2.10 # via # -c requirements/constraints.txt # -r requirements/test.txt @@ -140,7 +138,7 @@ django-filter==23.5 # openedx-ledger django-log-request-id==2.1.0 # via -r requirements/test.txt -django-model-utils==4.3.1 +django-model-utils==4.4.0 # via # -r requirements/test.txt # edx-rbac @@ -191,8 +189,9 @@ edx-django-utils==5.10.1 # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients + # openedx-events # openedx-ledger -edx-drf-extensions==10.1.0 +edx-drf-extensions==10.2.0 # via # -r requirements/test.txt # edx-rbac @@ -204,7 +203,6 @@ edx-opaque-keys[django]==2.5.1 # via # -r requirements/test.txt # edx-drf-extensions - # edx-opaque-keys # openedx-events edx-rbac==1.8.0 # via @@ -218,11 +216,11 @@ exceptiongroup==1.2.0 # pytest factory-boy==3.3.0 # via -r requirements/test.txt -faker==22.6.0 +faker==23.2.1 # via # -r requirements/test.txt # factory-boy -fastavro==1.9.3 +fastavro==1.9.4 # via # -r requirements/test.txt # openedx-events @@ -261,12 +259,8 @@ isort==5.13.2 # -r requirements/quality.in # -r requirements/test.txt # pylint -jaraco-classes==3.3.0 +jaraco-classes==3.3.1 # via keyring -jeepney==0.8.0 - # via - # keyring - # secretstorage jinja2==3.1.3 # via # -r requirements/test.txt @@ -301,7 +295,7 @@ mock==5.1.0 # via -r requirements/test.txt more-itertools==10.2.0 # via jaraco-classes -mysqlclient==2.2.3 +mysqlclient==2.2.4 # via # -r requirements/test.txt # openedx-ledger @@ -317,11 +311,11 @@ oauthlib==3.2.2 # getsmarter-api-clients # requests-oauthlib # social-auth-core -openedx-events==9.4.0 +openedx-events==9.5.2 # via # -r requirements/test.txt # openedx-ledger -openedx-ledger==1.3.2 +openedx-ledger==1.4.0 # via -r requirements/test.txt packaging==23.2 # via @@ -378,7 +372,6 @@ pyjwt[crypto]==2.8.0 # edx-auth-backends # edx-drf-extensions # edx-rest-api-client - # pyjwt # social-auth-core pylint==3.0.3 # via @@ -414,7 +407,7 @@ pyproject-api==1.6.1 # via # -r requirements/test.txt # tox -pytest==8.0.0 +pytest==8.0.1 # via # -r requirements/test.txt # pytest-cov @@ -427,7 +420,7 @@ python-dateutil==2.8.2 # via # -r requirements/test.txt # faker -python-slugify==8.0.3 +python-slugify==8.0.4 # via # -r requirements/test.txt # code-annotations @@ -479,13 +472,13 @@ requests-oauthlib==1.3.1 # social-auth-core requests-toolbelt==1.0.0 # via twine -responses==0.24.1 +responses==0.25.0 # via -r requirements/test.txt rfc3986==2.0.0 # via twine rich==13.7.0 # via twine -rpds-py==0.17.1 +rpds-py==0.18.0 # via # -r requirements/test.txt # jsonschema @@ -494,8 +487,6 @@ rules==3.3 # via # -r requirements/test.txt # openedx-ledger -secretstorage==3.3.3 - # via keyring semantic-version==2.10.0 # via # -r requirements/test.txt @@ -518,7 +509,7 @@ social-auth-app-django==5.4.0 # via # -r requirements/test.txt # edx-auth-backends -social-auth-core==4.5.2 +social-auth-core==4.5.3 # via # -r requirements/test.txt # edx-auth-backends @@ -549,9 +540,9 @@ tomlkit==0.12.3 # via # -r requirements/test.txt # pylint -tox==4.12.1 +tox==4.13.0 # via -r requirements/test.txt -twine==4.0.2 +twine==5.0.0 # via -r requirements/quality.in typing-extensions==4.9.0 # via @@ -568,7 +559,7 @@ uritemplate==4.1.1 # -r requirements/test.txt # drf-spectacular # drf-yasg -urllib3==2.2.0 +urllib3==2.2.1 # via # -r requirements/test.txt # requests diff --git a/requirements/test.txt b/requirements/test.txt index aba78e1c..36aa6b9a 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -59,11 +59,11 @@ code-annotations==1.6.0 # edx-lint colorama==0.4.6 # via tox -coverage[toml]==7.4.1 +coverage[toml]==7.4.2 # via # -r requirements/test.in # pytest-cov -cryptography==42.0.2 +cryptography==42.0.4 # via # -r requirements/base.txt # pyjwt @@ -124,7 +124,7 @@ django-filter==23.5 # openedx-ledger django-log-request-id==2.1.0 # via -r requirements/base.txt -django-model-utils==4.3.1 +django-model-utils==4.4.0 # via # -r requirements/base.txt # edx-rbac @@ -173,8 +173,9 @@ edx-django-utils==5.10.1 # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients + # openedx-events # openedx-ledger -edx-drf-extensions==10.1.0 +edx-drf-extensions==10.2.0 # via # -r requirements/base.txt # edx-rbac @@ -184,7 +185,6 @@ edx-opaque-keys[django]==2.5.1 # via # -r requirements/base.txt # edx-drf-extensions - # edx-opaque-keys # openedx-events edx-rbac==1.8.0 # via @@ -196,9 +196,9 @@ exceptiongroup==1.2.0 # via pytest factory-boy==3.3.0 # via -r requirements/test.in -faker==22.6.0 +faker==23.2.1 # via factory-boy -fastavro==1.9.3 +fastavro==1.9.4 # via # -r requirements/base.txt # openedx-events @@ -246,7 +246,7 @@ mccabe==0.7.0 # via pylint mock==5.1.0 # via -r requirements/test.in -mysqlclient==2.2.3 +mysqlclient==2.2.4 # via # -r requirements/base.txt # openedx-ledger @@ -260,11 +260,11 @@ oauthlib==3.2.2 # getsmarter-api-clients # requests-oauthlib # social-auth-core -openedx-events==9.4.0 +openedx-events==9.5.2 # via # -r requirements/base.txt # openedx-ledger -openedx-ledger==1.3.2 +openedx-ledger==1.4.0 # via -r requirements/base.txt packaging==23.2 # via @@ -309,7 +309,6 @@ pyjwt[crypto]==2.8.0 # edx-auth-backends # edx-drf-extensions # edx-rest-api-client - # pyjwt # social-auth-core pylint==3.0.3 # via @@ -337,7 +336,7 @@ pynacl==1.5.0 # edx-django-utils pyproject-api==1.6.1 # via tox -pytest==8.0.0 +pytest==8.0.1 # via # pytest-cov # pytest-django @@ -347,7 +346,7 @@ pytest-django==4.8.0 # via -r requirements/test.in python-dateutil==2.8.2 # via faker -python-slugify==8.0.3 +python-slugify==8.0.4 # via code-annotations python3-openid==3.2.0 # via @@ -391,9 +390,9 @@ requests-oauthlib==1.3.1 # -r requirements/base.txt # getsmarter-api-clients # social-auth-core -responses==0.24.1 +responses==0.25.0 # via -r requirements/test.in -rpds-py==0.17.1 +rpds-py==0.18.0 # via # -r requirements/base.txt # jsonschema @@ -422,7 +421,7 @@ social-auth-app-django==5.4.0 # via # -r requirements/base.txt # edx-auth-backends -social-auth-core==4.5.2 +social-auth-core==4.5.3 # via # -r requirements/base.txt # edx-auth-backends @@ -448,7 +447,7 @@ tomli==2.0.1 # tox tomlkit==0.12.3 # via pylint -tox==4.12.1 +tox==4.13.0 # via -r requirements/test.in typing-extensions==4.9.0 # via @@ -464,7 +463,7 @@ uritemplate==4.1.1 # -r requirements/base.txt # drf-spectacular # drf-yasg -urllib3==2.2.0 +urllib3==2.2.1 # via # -r requirements/base.txt # requests diff --git a/requirements/validation.txt b/requirements/validation.txt index 4488d19d..a044856a 100644 --- a/requirements/validation.txt +++ b/requirements/validation.txt @@ -82,18 +82,16 @@ colorama==0.4.6 # -r requirements/quality.txt # -r requirements/test.txt # tox -coverage[toml]==7.4.1 +coverage[toml]==7.4.2 # via # -r requirements/quality.txt # -r requirements/test.txt - # coverage # pytest-cov -cryptography==42.0.2 +cryptography==42.0.4 # via # -r requirements/quality.txt # -r requirements/test.txt # pyjwt - # secretstorage # social-auth-core ddt==1.7.1 # via @@ -115,7 +113,7 @@ distlib==0.3.8 # -r requirements/quality.txt # -r requirements/test.txt # virtualenv -django==4.2.9 +django==4.2.10 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -172,7 +170,7 @@ django-log-request-id==2.1.0 # via # -r requirements/quality.txt # -r requirements/test.txt -django-model-utils==4.3.1 +django-model-utils==4.4.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -239,8 +237,9 @@ edx-django-utils==5.10.1 # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients + # openedx-events # openedx-ledger -edx-drf-extensions==10.1.0 +edx-drf-extensions==10.2.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -254,7 +253,6 @@ edx-opaque-keys[django]==2.5.1 # -r requirements/quality.txt # -r requirements/test.txt # edx-drf-extensions - # edx-opaque-keys # openedx-events edx-rbac==1.8.0 # via @@ -274,12 +272,12 @@ factory-boy==3.3.0 # via # -r requirements/quality.txt # -r requirements/test.txt -faker==22.6.0 +faker==23.2.1 # via # -r requirements/quality.txt # -r requirements/test.txt # factory-boy -fastavro==1.9.3 +fastavro==1.9.4 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -327,15 +325,10 @@ isort==5.13.2 # -r requirements/quality.txt # -r requirements/test.txt # pylint -jaraco-classes==3.3.0 - # via - # -r requirements/quality.txt - # keyring -jeepney==0.8.0 +jaraco-classes==3.3.1 # via # -r requirements/quality.txt # keyring - # secretstorage jinja2==3.1.3 # via # -r requirements/quality.txt @@ -386,7 +379,7 @@ more-itertools==10.2.0 # via # -r requirements/quality.txt # jaraco-classes -mysqlclient==2.2.3 +mysqlclient==2.2.4 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -407,12 +400,12 @@ oauthlib==3.2.2 # getsmarter-api-clients # requests-oauthlib # social-auth-core -openedx-events==9.4.0 +openedx-events==9.5.2 # via # -r requirements/quality.txt # -r requirements/test.txt # openedx-ledger -openedx-ledger==1.3.2 +openedx-ledger==1.4.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -483,7 +476,6 @@ pyjwt[crypto]==2.8.0 # edx-auth-backends # edx-drf-extensions # edx-rest-api-client - # pyjwt # social-auth-core pylint==3.0.3 # via @@ -528,7 +520,7 @@ pyproject-api==1.6.1 # -r requirements/quality.txt # -r requirements/test.txt # tox -pytest==8.0.0 +pytest==8.0.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -547,7 +539,7 @@ python-dateutil==2.8.2 # -r requirements/quality.txt # -r requirements/test.txt # faker -python-slugify==8.0.3 +python-slugify==8.0.4 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -611,7 +603,7 @@ requests-toolbelt==1.0.0 # via # -r requirements/quality.txt # twine -responses==0.24.1 +responses==0.25.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -623,7 +615,7 @@ rich==13.7.0 # via # -r requirements/quality.txt # twine -rpds-py==0.17.1 +rpds-py==0.18.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -634,10 +626,6 @@ rules==3.3 # -r requirements/quality.txt # -r requirements/test.txt # openedx-ledger -secretstorage==3.3.3 - # via - # -r requirements/quality.txt - # keyring semantic-version==2.10.0 # via # -r requirements/quality.txt @@ -666,7 +654,7 @@ social-auth-app-django==5.4.0 # -r requirements/quality.txt # -r requirements/test.txt # edx-auth-backends -social-auth-core==4.5.2 +social-auth-core==4.5.3 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -703,11 +691,11 @@ tomlkit==0.12.3 # -r requirements/quality.txt # -r requirements/test.txt # pylint -tox==4.12.1 +tox==4.13.0 # via # -r requirements/quality.txt # -r requirements/test.txt -twine==4.0.2 +twine==5.0.0 # via -r requirements/quality.txt typing-extensions==4.9.0 # via @@ -726,7 +714,7 @@ uritemplate==4.1.1 # -r requirements/test.txt # drf-spectacular # drf-yasg -urllib3==2.2.0 +urllib3==2.2.1 # via # -r requirements/quality.txt # -r requirements/test.txt