diff --git a/README.rst b/README.rst index f4db9fe7..cad21ced 100644 --- a/README.rst +++ b/README.rst @@ -3,7 +3,7 @@ License Manager |Codecov|_ .. |Codecov| image:: http://codecov.io/github/edx/license-manager/coverage.svg?branch=master .. _Codecov: http://codecov.io/github/edx/license-manager?branch=master -Django backend for managing licenses and subscriptions. +Django backend for managing licenses and subscriptions for enterprise customer. Setting up license-manager -------------------------- diff --git a/catalog-info.yaml b/catalog-info.yaml new file mode 100644 index 00000000..725e6d69 --- /dev/null +++ b/catalog-info.yaml @@ -0,0 +1,43 @@ +# This file records information about this repo. Its use is described in OEP-55: +# https://open-edx-proposals.readthedocs.io/en/latest/processes/oep-0055-proc-project-maintainers.html + +apiVersion: backstage.io/v1alpha1 +# (Required) Acceptable Values: Component, Resource, System +# Use `Component` unless you know how backstage works and what the other kinds mean. +kind: Component +metadata: + # (Required) Must be the name of the repo, without the owning organization. + name: 'license-manager' + description: "Django backend for managing licenses and subscriptions for enterprise customer." + annotations: + # (Optional) Annotation keys and values can be whatever you want. + # We use it in Open edX repos to have a comma-separated list of GitHub user + # names that might be interested in changes to the architecture of this + # component. + openedx.org/arch-interest-groups: "" + # (Optional) We use the below annotation to indicate whether or not this + # repository should be tagged for openedx releases and which branch is tagged. + openedx.org/release: "" +spec: + + # (Required) This can be a group (`group:`) or a user (`user:`). + # Don't forget the "user:" or "group:" prefix. Groups must be GitHub team + # names in the openedx GitHub organization: https://github.com/orgs/openedx/teams + # + # If you need a new team created, create an issue with Axim engineering: + # https://github.com/openedx/axim-engineering/issues/new/choose + owner: group:2u-enterprise + + # (Required) Acceptable Type Values: service, website, library + type: 'service' + + # (Required) Acceptable Lifecycle Values: experimental, production, deprecated + lifecycle: 'production' + + # (Optional) The value can be the name of any known component. + subcomponentOf: '' + + # (Optional) An array of different components or resources. + dependsOn: + - '' + - '' diff --git a/license_manager/apps/subscriptions/api.py b/license_manager/apps/subscriptions/api.py index a9413fdd..d37dce20 100644 --- a/license_manager/apps/subscriptions/api.py +++ b/license_manager/apps/subscriptions/api.py @@ -233,20 +233,17 @@ def sync_agreement_with_enterprise_customer(customer_agreement): def toggle_auto_apply_licenses(customer_agreement_uuid, subscription_uuid): """ - Turn auto apply licenses on for the subscription with the given uuid and off for the current - plan used for auto applied licenses. If subscription_uuid is empty or None, turn auto apply licenses + Turn auto apply licenses on for the subscription with the given uuid and off for all other + auto-applied plans in the given customer agreement. If subscription_uuid is empty or None, turn auto apply licenses off for the current plan. """ - # There should only be one plan for auto-applied licenses at any given time - current_plan_for_auto_applied_licenses = SubscriptionPlan.objects.filter( + for plan in SubscriptionPlan.objects.filter( customer_agreement_id=customer_agreement_uuid, should_auto_apply_licenses=True - ).first() - - if current_plan_for_auto_applied_licenses: - current_plan_for_auto_applied_licenses.should_auto_apply_licenses = False - current_plan_for_auto_applied_licenses.save() + ): + plan.should_auto_apply_licenses = False + plan.save() if not subscription_uuid: return diff --git a/license_manager/apps/subscriptions/forms.py b/license_manager/apps/subscriptions/forms.py index 4e96753e..fd4c4fd6 100644 --- a/license_manager/apps/subscriptions/forms.py +++ b/license_manager/apps/subscriptions/forms.py @@ -46,7 +46,13 @@ class SubscriptionPlanForm(forms.ModelForm): choices=SubscriptionPlanShouldAutoApplyLicensesChoices.CHOICES, required=False, label="Should auto apply licenses", - help_text="Whether licenses from this Subscription Plan should be auto applied." + help_text=( + """ + Whether licenses from this Subscription Plan should be auto applied. + It it possible and acceptable for more than one plan in a single + customer agreement to have this field enabled. + """ + ) ) # Extra form field to specify the number of licenses to be associated with the subscription plan @@ -292,8 +298,17 @@ def populate_subscription_for_auto_applied_licenses_choices(self, instance): choices=choices, required=False, initial=empty_choice if not current_plan else (current_plan.uuid, current_plan.title), - help_text="The subscription plan to be associated with auto apply licenses. Selecting a license" - " will automatically enable the \"Should auto apply licenses\" field on the subscription plan" + help_text=( + """ + The subscription plan from which licenses will be auto-applied, if any. + If you do not manually modify this field, it will be automatically set, chosen as the + most recently started plan that is active, current, and has 'should_auto_apply_licenses' + set to true. Manually selecting/modifying the plan for this field will have two effects: + It will automatically enable the \"Should auto apply licenses\" field on the selected plan, + and it will automatically *disable* that field on all other plans + associated with this customer agreement. + """ + ), ) self.fields['subscription_for_auto_applied_licenses'] = choice_field diff --git a/license_manager/apps/subscriptions/models.py b/license_manager/apps/subscriptions/models.py index 5c0c4877..3945abbc 100644 --- a/license_manager/apps/subscriptions/models.py +++ b/license_manager/apps/subscriptions/models.py @@ -237,7 +237,7 @@ def auto_applicable_subscription(self): is_active=True, start_date__lte=now, expiration_date__gte=now - ).first() + ).order_by('-start_date').first() return plan diff --git a/license_manager/apps/subscriptions/tests/test_models.py b/license_manager/apps/subscriptions/tests/test_models.py index fe65ec00..29f8325b 100644 --- a/license_manager/apps/subscriptions/tests/test_models.py +++ b/license_manager/apps/subscriptions/tests/test_models.py @@ -117,6 +117,55 @@ def test_is_locked_for_renewal_processing(self, is_locked_for_renewal_processing renewed_subscription_plan.is_locked_for_renewal_processing, is_locked_for_renewal_processing, ) + def test_auto_applicable_subscription(self): + """ + Tests that we pick the most recent auto-applicable plan for a CustomerAgreement. + """ + agreement = CustomerAgreementFactory.create() + SubscriptionPlanFactory.create( + customer_agreement=agreement, + start_date=localized_datetime(2020, 1, 1), + should_auto_apply_licenses=True, + ) + SubscriptionPlanFactory.create( + customer_agreement=agreement, + start_date=localized_datetime(2020, 4, 1), + should_auto_apply_licenses=True, + ) + plan_3 = SubscriptionPlanFactory.create( + customer_agreement=agreement, + start_date=localized_datetime(2020, 12, 1), + should_auto_apply_licenses=True, + ) + # make one plan that hasn't started yet + SubscriptionPlanFactory.create( + customer_agreement=agreement, + start_date=localized_utcnow() + timedelta(days=1), + should_auto_apply_licenses=True, + ) + self.assertEqual(agreement.auto_applicable_subscription, plan_3) + + def test_auto_applicable_subscription_none_available(self): + """ + Tests that when no current, auto-applicable plan is available, + CustomerAgreement.auto_applicable_subscription evaluates to null. + """ + agreement = CustomerAgreementFactory.create() + # make a plan that's expired + SubscriptionPlanFactory.create( + customer_agreement=agreement, + start_date=localized_datetime(2020, 1, 1), + expiration_date=localized_utcnow() + timedelta(days=-1), + should_auto_apply_licenses=True, + ) + # make one plan that hasn't started yet + SubscriptionPlanFactory.create( + customer_agreement=agreement, + start_date=localized_utcnow() + timedelta(days=1), + should_auto_apply_licenses=True, + ) + self.assertIsNone(agreement.auto_applicable_subscription) + def test_auto_apply_licenses_turned_on_at(self): """ Tests that auto_apply_licenses_turned_on_at returns the correct time. diff --git a/requirements/base.txt b/requirements/base.txt index 5edd533a..33685205 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -12,7 +12,7 @@ asgiref==3.8.1 # via # django # django-cors-headers -attrs==24.2.0 +attrs==24.3.0 # via # jsonschema # referencing @@ -24,9 +24,9 @@ billiard==4.2.1 # via celery bleach[css]==6.2.0 # via -r requirements/base.in -boto3==1.35.63 +boto3==1.35.97 # via django-ses -botocore==1.35.63 +botocore==1.35.97 # via # boto3 # s3transfer @@ -35,15 +35,15 @@ celery==5.4.0 # -r requirements/base.in # django-celery-results # edx-celeryutils -certifi==2024.8.30 +certifi==2024.12.14 # via requests cffi==1.17.1 # via # cryptography # pynacl -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via requests -click==8.1.7 +click==8.1.8 # via # celery # click-didyoumean @@ -57,9 +57,9 @@ click-plugins==1.1.1 # via celery click-repl==0.3.0 # via celery -code-annotations==1.8.1 +code-annotations==2.1.0 # via edx-toggles -cryptography==43.0.3 +cryptography==44.0.0 # via # pyjwt # social-auth-core @@ -67,7 +67,7 @@ defusedxml==0.8.0rc2 # via # python3-openid # social-auth-core -django==4.2.16 +django==4.2.17 # via # -c requirements/common_constraints.txt # -r requirements/base.in @@ -119,7 +119,7 @@ django-model-utils==5.0.0 # -r requirements/base.in # edx-celeryutils # edx-rbac -django-ses==4.2.0 +django-ses==4.3.1 # via -r requirements/base.in django-simple-history==3.7.0 # via -r requirements/base.in @@ -147,7 +147,7 @@ drf-jwt==1.19.2 # via edx-drf-extensions drf-nested-routers==0.94.1 # via -r requirements/base.in -drf-spectacular==0.27.2 +drf-spectacular==0.28.0 # via -r requirements/base.in edx-auth-backends==4.4.0 # via -r requirements/base.in @@ -178,7 +178,7 @@ idna==3.10 # via requests inflection==0.5.1 # via drf-spectacular -jinja2==3.1.4 +jinja2==3.1.5 # via code-annotations jmespath==1.0.1 # via @@ -196,9 +196,9 @@ markupsafe==3.0.2 # via jinja2 monotonic==1.6 # via analytics-python -mysqlclient==2.2.6 +mysqlclient==2.2.7 # via -r requirements/base.in -newrelic==10.2.0 +newrelic==10.4.0 # via edx-django-utils oauthlib==3.2.2 # via @@ -210,11 +210,11 @@ ply==3.11 # via djangoql prompt-toolkit==3.0.48 # via click-repl -psutil==6.1.0 +psutil==6.1.1 # via edx-django-utils pycparser==2.22 # via cffi -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # drf-jwt # edx-auth-backends @@ -240,7 +240,7 @@ pyyaml==6.0.2 # via # code-annotations # drf-spectacular -redis==5.2.0 +redis==5.2.1 # via -r requirements/base.in referencing==0.35.1 # via @@ -255,19 +255,19 @@ requests==2.32.3 # social-auth-core requests-oauthlib==2.0.0 # via social-auth-core -rpds-py==0.21.0 +rpds-py==0.22.3 # via # jsonschema # referencing rules==3.5 # via -r requirements/base.in -s3transfer==0.10.3 +s3transfer==0.10.4 # via boto3 semantic-version==2.10.0 # via edx-drf-extensions simplejson==3.19.3 # via -r requirements/base.in -six==1.16.0 +six==1.17.0 # via # analytics-python # edx-auth-backends @@ -279,9 +279,9 @@ social-auth-core==4.5.4 # via # edx-auth-backends # social-auth-app-django -sqlparse==0.5.2 +sqlparse==0.5.3 # via django -stevedore==5.3.0 +stevedore==5.4.0 # via # code-annotations # edx-django-utils @@ -300,6 +300,7 @@ uritemplate==4.1.1 # via drf-spectacular urllib3==2.2.3 # via + # -c requirements/common_constraints.txt # botocore # requests vine==5.1.0 diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt index 048bed57..259a9fd9 100644 --- a/requirements/common_constraints.txt +++ b/requirements/common_constraints.txt @@ -30,3 +30,7 @@ elasticsearch<7.14.0 # Cause: https://github.com/openedx/edx-lint/issues/458 # This can be unpinned once https://github.com/openedx/edx-lint/issues/459 has been resolved. pip<24.3 + +# Cause: https://github.com/openedx/edx-lint/issues/475 +# This can be unpinned once https://github.com/openedx/edx-lint/issues/476 has been resolved. +urllib3<2.3.0 diff --git a/requirements/dev.txt b/requirements/dev.txt index ec3e3819..ed5bb111 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -15,12 +15,12 @@ asgiref==3.8.1 # -r requirements/validation.txt # django # django-cors-headers -astroid==3.3.5 +astroid==3.3.8 # via # -r requirements/validation.txt # pylint # pylint-celery -attrs==24.2.0 +attrs==24.3.0 # via # -r requirements/validation.txt # jsonschema @@ -35,11 +35,11 @@ billiard==4.2.1 # celery bleach[css]==6.2.0 # via -r requirements/validation.txt -boto3==1.35.63 +boto3==1.35.97 # via # -r requirements/validation.txt # django-ses -botocore==1.35.63 +botocore==1.35.97 # via # -r requirements/validation.txt # boto3 @@ -53,7 +53,7 @@ celery==5.4.0 # -r requirements/validation.txt # django-celery-results # edx-celeryutils -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/validation.txt # requests @@ -62,11 +62,11 @@ cffi==1.17.1 # -r requirements/validation.txt # cryptography # pynacl -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # -r requirements/validation.txt # requests -click==8.1.7 +click==8.1.8 # via # -r requirements/pip-tools.txt # -r requirements/validation.txt @@ -95,16 +95,16 @@ click-repl==0.3.0 # via # -r requirements/validation.txt # celery -code-annotations==1.8.1 +code-annotations==2.1.0 # via # -r requirements/validation.txt # edx-lint # edx-toggles -coverage[toml]==7.6.7 +coverage[toml]==7.6.10 # via # -r requirements/validation.txt # pytest-cov -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/validation.txt # pyjwt @@ -126,7 +126,7 @@ dill==0.3.9 # via # -r requirements/validation.txt # pylint -django==4.2.16 +django==4.2.17 # via # -c requirements/common_constraints.txt # -r requirements/validation.txt @@ -187,7 +187,7 @@ django-model-utils==5.0.0 # -r requirements/validation.txt # edx-celeryutils # edx-rbac -django-ses==4.2.0 +django-ses==4.3.1 # via -r requirements/validation.txt django-simple-history==3.7.0 # via -r requirements/validation.txt @@ -219,7 +219,7 @@ drf-jwt==1.19.2 # edx-drf-extensions drf-nested-routers==0.94.1 # via -r requirements/validation.txt -drf-spectacular==0.27.2 +drf-spectacular==0.28.0 # via -r requirements/validation.txt edx-auth-backends==4.4.0 # via -r requirements/validation.txt @@ -254,7 +254,7 @@ edx-toggles==5.2.0 # via -r requirements/validation.txt factory-boy==3.3.1 # via -r requirements/validation.txt -faker==33.0.0 +faker==33.3.1 # via # -r requirements/validation.txt # factory-boy @@ -266,7 +266,7 @@ idna==3.10 # via # -r requirements/validation.txt # requests -inflect==7.4.0 +inflect==7.5.0 # via # -r requirements/dev.in # jinja2-pluralize @@ -282,7 +282,7 @@ isort==5.13.2 # via # -r requirements/validation.txt # pylint -jinja2==3.1.4 +jinja2==3.1.5 # via # -r requirements/validation.txt # code-annotations @@ -334,9 +334,9 @@ monotonic==1.6 # analytics-python more-itertools==10.5.0 # via inflect -mysqlclient==2.2.6 +mysqlclient==2.2.7 # via -r requirements/validation.txt -newrelic==10.2.0 +newrelic==10.4.0 # via # -r requirements/validation.txt # edx-django-utils @@ -386,7 +386,7 @@ prompt-toolkit==3.0.48 # via # -r requirements/validation.txt # click-repl -psutil==6.1.0 +psutil==6.1.1 # via # -r requirements/validation.txt # edx-django-utils @@ -398,9 +398,9 @@ pycparser==2.22 # cffi pydocstyle==6.3.0 # via -r requirements/validation.txt -pygments==2.18.0 +pygments==2.19.1 # via diff-cover -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # -r requirements/validation.txt # drf-jwt @@ -408,7 +408,7 @@ pyjwt[crypto]==2.10.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==3.3.1 +pylint==3.3.3 # via # -r requirements/validation.txt # edx-lint @@ -441,7 +441,7 @@ pyproject-hooks==1.2.0 # -r requirements/pip-tools.txt # build # pip-tools -pytest==8.3.3 +pytest==8.3.4 # via # -r requirements/validation.txt # pytest-cov @@ -476,7 +476,7 @@ pyyaml==6.0.2 # code-annotations # drf-spectacular # edx-i18n-tools -redis==5.2.0 +redis==5.2.1 # via -r requirements/validation.txt referencing==0.35.1 # via @@ -495,14 +495,14 @@ requests-oauthlib==2.0.0 # via # -r requirements/validation.txt # social-auth-core -rpds-py==0.21.0 +rpds-py==0.22.3 # via # -r requirements/validation.txt # jsonschema # referencing rules==3.5 # via -r requirements/validation.txt -s3transfer==0.10.3 +s3transfer==0.10.4 # via # -r requirements/validation.txt # boto3 @@ -512,7 +512,7 @@ semantic-version==2.10.0 # edx-drf-extensions simplejson==3.19.3 # via -r requirements/validation.txt -six==1.16.0 +six==1.17.0 # via # -r requirements/validation.txt # analytics-python @@ -534,12 +534,12 @@ social-auth-core==4.5.4 # -r requirements/validation.txt # edx-auth-backends # social-auth-app-django -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r requirements/validation.txt # django # django-debug-toolbar -stevedore==5.3.0 +stevedore==5.4.0 # via # -r requirements/validation.txt # code-annotations @@ -576,6 +576,7 @@ uritemplate==4.1.1 # drf-spectacular urllib3==2.2.3 # via + # -c requirements/common_constraints.txt # -r requirements/validation.txt # botocore # requests @@ -594,7 +595,7 @@ webencodings==0.5.1 # -r requirements/validation.txt # bleach # tinycss2 -wheel==0.45.0 +wheel==0.45.1 # via # -r requirements/pip-tools.txt # pip-tools diff --git a/requirements/doc.txt b/requirements/doc.txt index 8eb9982d..42ab831d 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -19,12 +19,12 @@ asgiref==3.8.1 # -r requirements/test.txt # django # django-cors-headers -astroid==3.3.5 +astroid==3.3.8 # via # -r requirements/test.txt # pylint # pylint-celery -attrs==24.2.0 +attrs==24.3.0 # via # -r requirements/test.txt # jsonschema @@ -45,11 +45,11 @@ billiard==4.2.1 # celery bleach[css]==6.2.0 # via -r requirements/test.txt -boto3==1.35.63 +boto3==1.35.97 # via # -r requirements/test.txt # django-ses -botocore==1.35.63 +botocore==1.35.97 # via # -r requirements/test.txt # boto3 @@ -59,7 +59,7 @@ celery==5.4.0 # -r requirements/test.txt # django-celery-results # edx-celeryutils -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/test.txt # requests @@ -68,11 +68,11 @@ cffi==1.17.1 # -r requirements/test.txt # cryptography # pynacl -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # -r requirements/test.txt # requests -click==8.1.7 +click==8.1.8 # via # -r requirements/test.txt # celery @@ -99,16 +99,16 @@ click-repl==0.3.0 # via # -r requirements/test.txt # celery -code-annotations==1.8.1 +code-annotations==2.1.0 # via # -r requirements/test.txt # edx-lint # edx-toggles -coverage[toml]==7.6.7 +coverage[toml]==7.6.10 # via # -r requirements/test.txt # pytest-cov -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/test.txt # pyjwt @@ -124,7 +124,7 @@ dill==0.3.9 # via # -r requirements/test.txt # pylint -django==4.2.16 +django==4.2.17 # via # -c requirements/common_constraints.txt # -r requirements/test.txt @@ -179,7 +179,7 @@ django-model-utils==5.0.0 # -r requirements/test.txt # edx-celeryutils # edx-rbac -django-ses==4.2.0 +django-ses==4.3.1 # via -r requirements/test.txt django-simple-history==3.7.0 # via -r requirements/test.txt @@ -220,7 +220,7 @@ drf-jwt==1.19.2 # edx-drf-extensions drf-nested-routers==0.94.1 # via -r requirements/test.txt -drf-spectacular==0.27.2 +drf-spectacular==0.28.0 # via -r requirements/test.txt edx-auth-backends==4.4.0 # via -r requirements/test.txt @@ -253,7 +253,7 @@ edx-toggles==5.2.0 # via -r requirements/test.txt factory-boy==3.3.1 # via -r requirements/test.txt -faker==33.0.0 +faker==33.3.1 # via # -r requirements/test.txt # factory-boy @@ -277,7 +277,7 @@ isort==5.13.2 # via # -r requirements/test.txt # pylint -jinja2==3.1.4 +jinja2==3.1.5 # via # -r requirements/test.txt # code-annotations @@ -315,13 +315,13 @@ monotonic==1.6 # via # -r requirements/test.txt # analytics-python -mysqlclient==2.2.6 +mysqlclient==2.2.7 # via -r requirements/test.txt -newrelic==10.2.0 +newrelic==10.4.0 # via # -r requirements/test.txt # edx-django-utils -nh3==0.2.18 +nh3==0.2.20 # via readme-renderer oauthlib==3.2.2 # via @@ -353,7 +353,7 @@ prompt-toolkit==3.0.48 # via # -r requirements/test.txt # click-repl -psutil==6.1.0 +psutil==6.1.1 # via # -r requirements/test.txt # edx-django-utils @@ -361,16 +361,16 @@ pycparser==2.22 # via # -r requirements/test.txt # cffi -pydata-sphinx-theme==0.16.0 +pydata-sphinx-theme==0.16.1 # via sphinx-book-theme -pygments==2.18.0 +pygments==2.19.1 # via # accessible-pygments # doc8 # pydata-sphinx-theme # readme-renderer # sphinx -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # -r requirements/test.txt # drf-jwt @@ -378,7 +378,7 @@ pyjwt[crypto]==2.10.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==3.3.1 +pylint==3.3.3 # via # -r requirements/test.txt # edx-lint @@ -406,7 +406,7 @@ pynacl==1.5.0 # via # -r requirements/test.txt # edx-django-utils -pytest==8.3.3 +pytest==8.3.4 # via # -r requirements/test.txt # pytest-cov @@ -440,7 +440,7 @@ pyyaml==6.0.2 # drf-spectacular readme-renderer==44.0 # via -r requirements/doc.in -redis==5.2.0 +redis==5.2.1 # via -r requirements/test.txt referencing==0.35.1 # via @@ -462,14 +462,14 @@ requests-oauthlib==2.0.0 # social-auth-core restructuredtext-lint==1.4.0 # via doc8 -rpds-py==0.21.0 +rpds-py==0.22.3 # via # -r requirements/test.txt # jsonschema # referencing rules==3.5 # via -r requirements/test.txt -s3transfer==0.10.3 +s3transfer==0.10.4 # via # -r requirements/test.txt # boto3 @@ -479,7 +479,7 @@ semantic-version==2.10.0 # edx-drf-extensions simplejson==3.19.3 # via -r requirements/test.txt -six==1.16.0 +six==1.17.0 # via # -r requirements/test.txt # analytics-python @@ -519,11 +519,11 @@ sphinxcontrib-qthelp==2.0.0 # via sphinx sphinxcontrib-serializinghtml==2.0.0 # via sphinx -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r requirements/test.txt # django -stevedore==5.3.0 +stevedore==5.4.0 # via # -r requirements/test.txt # code-annotations @@ -559,6 +559,7 @@ uritemplate==4.1.1 # drf-spectacular urllib3==2.2.3 # via + # -c requirements/common_constraints.txt # -r requirements/test.txt # botocore # requests diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 04137192..31d211cc 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -6,7 +6,7 @@ # build==1.2.2.post1 # via pip-tools -click==8.1.7 +click==8.1.8 # via pip-tools packaging==24.2 # via build @@ -16,7 +16,7 @@ pyproject-hooks==1.2.0 # via # build # pip-tools -wheel==0.45.0 +wheel==0.45.1 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/pip.txt b/requirements/pip.txt index aff5760c..86460b28 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -4,7 +4,7 @@ # # make upgrade # -wheel==0.45.0 +wheel==0.45.1 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: @@ -12,5 +12,5 @@ pip==24.2 # via # -c /home/runner/work/license-manager/license-manager/requirements/common_constraints.txt # -r requirements/pip.in -setuptools==75.5.0 +setuptools==75.8.0 # via -r requirements/pip.in diff --git a/requirements/production.txt b/requirements/production.txt index 78a10ba4..ff6b801e 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -15,7 +15,7 @@ asgiref==3.8.1 # -r requirements/base.txt # django # django-cors-headers -attrs==24.2.0 +attrs==24.3.0 # via # -r requirements/base.txt # jsonschema @@ -30,11 +30,11 @@ billiard==4.2.1 # celery bleach[css]==6.2.0 # via -r requirements/base.txt -boto3==1.35.63 +boto3==1.35.97 # via # -r requirements/base.txt # django-ses -botocore==1.35.63 +botocore==1.35.97 # via # -r requirements/base.txt # boto3 @@ -44,7 +44,7 @@ celery==5.4.0 # -r requirements/base.txt # django-celery-results # edx-celeryutils -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/base.txt # requests @@ -53,11 +53,11 @@ cffi==1.17.1 # -r requirements/base.txt # cryptography # pynacl -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # -r requirements/base.txt # requests -click==8.1.7 +click==8.1.8 # via # -r requirements/base.txt # celery @@ -78,11 +78,11 @@ click-repl==0.3.0 # via # -r requirements/base.txt # celery -code-annotations==1.8.1 +code-annotations==2.1.0 # via # -r requirements/base.txt # edx-toggles -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/base.txt # pyjwt @@ -92,7 +92,7 @@ defusedxml==0.8.0rc2 # -r requirements/base.txt # python3-openid # social-auth-core -django==4.2.16 +django==4.2.17 # via # -c requirements/common_constraints.txt # -r requirements/base.txt @@ -145,7 +145,7 @@ django-model-utils==5.0.0 # -r requirements/base.txt # edx-celeryutils # edx-rbac -django-ses==4.2.0 +django-ses==4.3.1 # via -r requirements/base.txt django-simple-history==3.7.0 # via -r requirements/base.txt @@ -177,7 +177,7 @@ drf-jwt==1.19.2 # edx-drf-extensions drf-nested-routers==0.94.1 # via -r requirements/base.txt -drf-spectacular==0.27.2 +drf-spectacular==0.28.0 # via -r requirements/base.txt edx-auth-backends==4.4.0 # via -r requirements/base.txt @@ -220,7 +220,7 @@ inflection==0.5.1 # via # -r requirements/base.txt # drf-spectacular -jinja2==3.1.4 +jinja2==3.1.5 # via # -r requirements/base.txt # code-annotations @@ -253,9 +253,9 @@ monotonic==1.6 # via # -r requirements/base.txt # analytics-python -mysqlclient==2.2.6 +mysqlclient==2.2.7 # via -r requirements/base.txt -newrelic==10.2.0 +newrelic==10.4.0 # via # -r requirements/base.txt # edx-django-utils @@ -278,7 +278,7 @@ prompt-toolkit==3.0.48 # via # -r requirements/base.txt # click-repl -psutil==6.1.0 +psutil==6.1.1 # via # -r requirements/base.txt # edx-django-utils @@ -286,7 +286,7 @@ pycparser==2.22 # via # -r requirements/base.txt # cffi -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # -r requirements/base.txt # drf-jwt @@ -328,7 +328,7 @@ pyyaml==6.0.2 # -r requirements/production.in # code-annotations # drf-spectacular -redis==5.2.0 +redis==5.2.1 # via -r requirements/base.txt referencing==0.35.1 # via @@ -347,14 +347,14 @@ requests-oauthlib==2.0.0 # via # -r requirements/base.txt # social-auth-core -rpds-py==0.21.0 +rpds-py==0.22.3 # via # -r requirements/base.txt # jsonschema # referencing rules==3.5 # via -r requirements/base.txt -s3transfer==0.10.3 +s3transfer==0.10.4 # via # -r requirements/base.txt # boto3 @@ -364,7 +364,7 @@ semantic-version==2.10.0 # edx-drf-extensions simplejson==3.19.3 # via -r requirements/base.txt -six==1.16.0 +six==1.17.0 # via # -r requirements/base.txt # analytics-python @@ -380,11 +380,11 @@ social-auth-core==4.5.4 # -r requirements/base.txt # edx-auth-backends # social-auth-app-django -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r requirements/base.txt # django -stevedore==5.3.0 +stevedore==5.4.0 # via # -r requirements/base.txt # code-annotations @@ -413,6 +413,7 @@ uritemplate==4.1.1 # drf-spectacular urllib3==2.2.3 # via + # -c requirements/common_constraints.txt # -r requirements/base.txt # botocore # requests @@ -435,7 +436,7 @@ zipp==3.21.0 # via -r requirements/base.txt zope-event==5.0 # via gevent -zope-interface==7.1.1 +zope-interface==7.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 3ccb83f0..a2f5cc77 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -15,11 +15,11 @@ asgiref==3.8.1 # -r requirements/base.txt # django # django-cors-headers -astroid==3.3.5 +astroid==3.3.8 # via # pylint # pylint-celery -attrs==24.2.0 +attrs==24.3.0 # via # -r requirements/base.txt # jsonschema @@ -34,11 +34,11 @@ billiard==4.2.1 # celery bleach[css]==6.2.0 # via -r requirements/base.txt -boto3==1.35.63 +boto3==1.35.97 # via # -r requirements/base.txt # django-ses -botocore==1.35.63 +botocore==1.35.97 # via # -r requirements/base.txt # boto3 @@ -48,7 +48,7 @@ celery==5.4.0 # -r requirements/base.txt # django-celery-results # edx-celeryutils -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/base.txt # requests @@ -57,11 +57,11 @@ cffi==1.17.1 # -r requirements/base.txt # cryptography # pynacl -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # -r requirements/base.txt # requests -click==8.1.7 +click==8.1.8 # via # -r requirements/base.txt # celery @@ -86,12 +86,12 @@ click-repl==0.3.0 # via # -r requirements/base.txt # celery -code-annotations==1.8.1 +code-annotations==2.1.0 # via # -r requirements/base.txt # edx-lint # edx-toggles -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/base.txt # pyjwt @@ -103,7 +103,7 @@ defusedxml==0.8.0rc2 # social-auth-core dill==0.3.9 # via pylint -django==4.2.16 +django==4.2.17 # via # -c requirements/common_constraints.txt # -r requirements/base.txt @@ -156,7 +156,7 @@ django-model-utils==5.0.0 # -r requirements/base.txt # edx-celeryutils # edx-rbac -django-ses==4.2.0 +django-ses==4.3.1 # via -r requirements/base.txt django-simple-history==3.7.0 # via -r requirements/base.txt @@ -188,7 +188,7 @@ drf-jwt==1.19.2 # edx-drf-extensions drf-nested-routers==0.94.1 # via -r requirements/base.txt -drf-spectacular==0.27.2 +drf-spectacular==0.28.0 # via -r requirements/base.txt edx-auth-backends==4.4.0 # via -r requirements/base.txt @@ -231,7 +231,7 @@ isort==5.13.2 # via # -r requirements/quality.in # pylint -jinja2==3.1.4 +jinja2==3.1.5 # via # -r requirements/base.txt # code-annotations @@ -266,9 +266,9 @@ monotonic==1.6 # via # -r requirements/base.txt # analytics-python -mysqlclient==2.2.6 +mysqlclient==2.2.7 # via -r requirements/base.txt -newrelic==10.2.0 +newrelic==10.4.0 # via # -r requirements/base.txt # edx-django-utils @@ -291,7 +291,7 @@ prompt-toolkit==3.0.48 # via # -r requirements/base.txt # click-repl -psutil==6.1.0 +psutil==6.1.1 # via # -r requirements/base.txt # edx-django-utils @@ -303,7 +303,7 @@ pycparser==2.22 # cffi pydocstyle==6.3.0 # via -r requirements/quality.in -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # -r requirements/base.txt # drf-jwt @@ -311,7 +311,7 @@ pyjwt[crypto]==2.10.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==3.3.1 +pylint==3.3.3 # via # edx-lint # pylint-celery @@ -354,7 +354,7 @@ pyyaml==6.0.2 # -r requirements/base.txt # code-annotations # drf-spectacular -redis==5.2.0 +redis==5.2.1 # via -r requirements/base.txt referencing==0.35.1 # via @@ -373,14 +373,14 @@ requests-oauthlib==2.0.0 # via # -r requirements/base.txt # social-auth-core -rpds-py==0.21.0 +rpds-py==0.22.3 # via # -r requirements/base.txt # jsonschema # referencing rules==3.5 # via -r requirements/base.txt -s3transfer==0.10.3 +s3transfer==0.10.4 # via # -r requirements/base.txt # boto3 @@ -390,7 +390,7 @@ semantic-version==2.10.0 # edx-drf-extensions simplejson==3.19.3 # via -r requirements/base.txt -six==1.16.0 +six==1.17.0 # via # -r requirements/base.txt # analytics-python @@ -409,11 +409,11 @@ social-auth-core==4.5.4 # -r requirements/base.txt # edx-auth-backends # social-auth-app-django -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r requirements/base.txt # django -stevedore==5.3.0 +stevedore==5.4.0 # via # -r requirements/base.txt # code-annotations @@ -444,6 +444,7 @@ uritemplate==4.1.1 # drf-spectacular urllib3==2.2.3 # via + # -c requirements/common_constraints.txt # -r requirements/base.txt # botocore # requests diff --git a/requirements/test.txt b/requirements/test.txt index fdc5e165..3622ed1e 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -15,11 +15,11 @@ asgiref==3.8.1 # -r requirements/base.txt # django # django-cors-headers -astroid==3.3.5 +astroid==3.3.8 # via # pylint # pylint-celery -attrs==24.2.0 +attrs==24.3.0 # via # -r requirements/base.txt # jsonschema @@ -34,11 +34,11 @@ billiard==4.2.1 # celery bleach[css]==6.2.0 # via -r requirements/base.txt -boto3==1.35.63 +boto3==1.35.97 # via # -r requirements/base.txt # django-ses -botocore==1.35.63 +botocore==1.35.97 # via # -r requirements/base.txt # boto3 @@ -48,7 +48,7 @@ celery==5.4.0 # -r requirements/base.txt # django-celery-results # edx-celeryutils -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/base.txt # requests @@ -57,11 +57,11 @@ cffi==1.17.1 # -r requirements/base.txt # cryptography # pynacl -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # -r requirements/base.txt # requests -click==8.1.7 +click==8.1.8 # via # -r requirements/base.txt # celery @@ -86,17 +86,17 @@ click-repl==0.3.0 # via # -r requirements/base.txt # celery -code-annotations==1.8.1 +code-annotations==2.1.0 # via # -r requirements/base.txt # -r requirements/test.in # edx-lint # edx-toggles -coverage[toml]==7.6.7 +coverage[toml]==7.6.10 # via # -r requirements/test.in # pytest-cov -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/base.txt # pyjwt @@ -110,7 +110,7 @@ defusedxml==0.8.0rc2 # social-auth-core dill==0.3.9 # via pylint -django==4.2.16 +django==4.2.17 # via # -c requirements/common_constraints.txt # -r requirements/base.txt @@ -165,7 +165,7 @@ django-model-utils==5.0.0 # -r requirements/base.txt # edx-celeryutils # edx-rbac -django-ses==4.2.0 +django-ses==4.3.1 # via -r requirements/base.txt django-simple-history==3.7.0 # via -r requirements/base.txt @@ -197,7 +197,7 @@ drf-jwt==1.19.2 # edx-drf-extensions drf-nested-routers==0.94.1 # via -r requirements/base.txt -drf-spectacular==0.27.2 +drf-spectacular==0.28.0 # via -r requirements/base.txt edx-auth-backends==4.4.0 # via -r requirements/base.txt @@ -230,7 +230,7 @@ edx-toggles==5.2.0 # via -r requirements/base.txt factory-boy==3.3.1 # via -r requirements/test.in -faker==33.0.0 +faker==33.3.1 # via factory-boy freezegun==1.5.1 # via -r requirements/test.in @@ -246,7 +246,7 @@ iniconfig==2.0.0 # via pytest isort==5.13.2 # via pylint -jinja2==3.1.4 +jinja2==3.1.5 # via # -r requirements/base.txt # code-annotations @@ -281,9 +281,9 @@ monotonic==1.6 # via # -r requirements/base.txt # analytics-python -mysqlclient==2.2.6 +mysqlclient==2.2.7 # via -r requirements/base.txt -newrelic==10.2.0 +newrelic==10.4.0 # via # -r requirements/base.txt # edx-django-utils @@ -310,7 +310,7 @@ prompt-toolkit==3.0.48 # via # -r requirements/base.txt # click-repl -psutil==6.1.0 +psutil==6.1.1 # via # -r requirements/base.txt # edx-django-utils @@ -318,7 +318,7 @@ pycparser==2.22 # via # -r requirements/base.txt # cffi -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # -r requirements/base.txt # drf-jwt @@ -326,7 +326,7 @@ pyjwt[crypto]==2.10.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==3.3.1 +pylint==3.3.3 # via # edx-lint # pylint-celery @@ -348,7 +348,7 @@ pynacl==1.5.0 # via # -r requirements/base.txt # edx-django-utils -pytest==8.3.3 +pytest==8.3.4 # via # pytest-cov # pytest-django @@ -379,7 +379,7 @@ pyyaml==6.0.2 # -r requirements/base.txt # code-annotations # drf-spectacular -redis==5.2.0 +redis==5.2.1 # via -r requirements/base.txt referencing==0.35.1 # via @@ -398,14 +398,14 @@ requests-oauthlib==2.0.0 # via # -r requirements/base.txt # social-auth-core -rpds-py==0.21.0 +rpds-py==0.22.3 # via # -r requirements/base.txt # jsonschema # referencing rules==3.5 # via -r requirements/base.txt -s3transfer==0.10.3 +s3transfer==0.10.4 # via # -r requirements/base.txt # boto3 @@ -415,7 +415,7 @@ semantic-version==2.10.0 # edx-drf-extensions simplejson==3.19.3 # via -r requirements/base.txt -six==1.16.0 +six==1.17.0 # via # -r requirements/base.txt # analytics-python @@ -432,11 +432,11 @@ social-auth-core==4.5.4 # -r requirements/base.txt # edx-auth-backends # social-auth-app-django -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r requirements/base.txt # django -stevedore==5.3.0 +stevedore==5.4.0 # via # -r requirements/base.txt # code-annotations @@ -468,6 +468,7 @@ uritemplate==4.1.1 # drf-spectacular urllib3==2.2.3 # via + # -c requirements/common_constraints.txt # -r requirements/base.txt # botocore # requests diff --git a/requirements/validation.txt b/requirements/validation.txt index 81e987ee..c4ed3a35 100644 --- a/requirements/validation.txt +++ b/requirements/validation.txt @@ -19,13 +19,13 @@ asgiref==3.8.1 # -r requirements/test.txt # django # django-cors-headers -astroid==3.3.5 +astroid==3.3.8 # via # -r requirements/quality.txt # -r requirements/test.txt # pylint # pylint-celery -attrs==24.2.0 +attrs==24.3.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -45,12 +45,12 @@ bleach[css]==6.2.0 # via # -r requirements/quality.txt # -r requirements/test.txt -boto3==1.35.63 +boto3==1.35.97 # via # -r requirements/quality.txt # -r requirements/test.txt # django-ses -botocore==1.35.63 +botocore==1.35.97 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -62,7 +62,7 @@ celery==5.4.0 # -r requirements/test.txt # django-celery-results # edx-celeryutils -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -73,12 +73,12 @@ cffi==1.17.1 # -r requirements/test.txt # cryptography # pynacl -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # -r requirements/quality.txt # -r requirements/test.txt # requests -click==8.1.7 +click==8.1.8 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -110,17 +110,17 @@ click-repl==0.3.0 # -r requirements/quality.txt # -r requirements/test.txt # celery -code-annotations==1.8.1 +code-annotations==2.1.0 # via # -r requirements/quality.txt # -r requirements/test.txt # edx-lint # edx-toggles -coverage[toml]==7.6.7 +coverage[toml]==7.6.10 # via # -r requirements/test.txt # pytest-cov -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -139,7 +139,7 @@ dill==0.3.9 # -r requirements/quality.txt # -r requirements/test.txt # pylint -django==4.2.16 +django==4.2.17 # via # -c requirements/common_constraints.txt # -r requirements/quality.txt @@ -212,7 +212,7 @@ django-model-utils==5.0.0 # -r requirements/test.txt # edx-celeryutils # edx-rbac -django-ses==4.2.0 +django-ses==4.3.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -258,7 +258,7 @@ drf-nested-routers==0.94.1 # via # -r requirements/quality.txt # -r requirements/test.txt -drf-spectacular==0.27.2 +drf-spectacular==0.28.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -312,7 +312,7 @@ edx-toggles==5.2.0 # -r requirements/test.txt factory-boy==3.3.1 # via -r requirements/test.txt -faker==33.0.0 +faker==33.3.1 # via # -r requirements/test.txt # factory-boy @@ -337,7 +337,7 @@ isort==5.13.2 # -r requirements/quality.txt # -r requirements/test.txt # pylint -jinja2==3.1.4 +jinja2==3.1.5 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -389,11 +389,11 @@ monotonic==1.6 # -r requirements/quality.txt # -r requirements/test.txt # analytics-python -mysqlclient==2.2.6 +mysqlclient==2.2.7 # via # -r requirements/quality.txt # -r requirements/test.txt -newrelic==10.2.0 +newrelic==10.4.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -440,7 +440,7 @@ prompt-toolkit==3.0.48 # -r requirements/quality.txt # -r requirements/test.txt # click-repl -psutil==6.1.0 +psutil==6.1.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -454,7 +454,7 @@ pycparser==2.22 # cffi pydocstyle==6.3.0 # via -r requirements/quality.txt -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -463,7 +463,7 @@ pyjwt[crypto]==2.10.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==3.3.1 +pylint==3.3.3 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -497,7 +497,7 @@ pynacl==1.5.0 # -r requirements/quality.txt # -r requirements/test.txt # edx-django-utils -pytest==8.3.3 +pytest==8.3.4 # via # -r requirements/test.txt # pytest-cov @@ -536,7 +536,7 @@ pyyaml==6.0.2 # code-annotations # drf-spectacular # edx-i18n-tools -redis==5.2.0 +redis==5.2.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -560,7 +560,7 @@ requests-oauthlib==2.0.0 # -r requirements/quality.txt # -r requirements/test.txt # social-auth-core -rpds-py==0.21.0 +rpds-py==0.22.3 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -570,7 +570,7 @@ rules==3.5 # via # -r requirements/quality.txt # -r requirements/test.txt -s3transfer==0.10.3 +s3transfer==0.10.4 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -584,7 +584,7 @@ simplejson==3.19.3 # via # -r requirements/quality.txt # -r requirements/test.txt -six==1.16.0 +six==1.17.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -609,12 +609,12 @@ social-auth-core==4.5.4 # -r requirements/test.txt # edx-auth-backends # social-auth-app-django -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r requirements/quality.txt # -r requirements/test.txt # django -stevedore==5.3.0 +stevedore==5.4.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -655,6 +655,7 @@ uritemplate==4.1.1 # drf-spectacular urllib3==2.2.3 # via + # -c requirements/common_constraints.txt # -r requirements/quality.txt # -r requirements/test.txt # botocore