diff --git a/.github/workflows/mysql8-migrations.yml b/.github/workflows/mysql8-migrations.yml index 383bad37..4cdd4eaa 100644 --- a/.github/workflows/mysql8-migrations.yml +++ b/.github/workflows/mysql8-migrations.yml @@ -34,7 +34,7 @@ jobs: echo "::set-output name=dir::$(pip cache dir)" - name: Cache pip dependencies id: cache-dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ${{ steps.pip-cache-dir.outputs.dir }} key: ${{ runner.os }}-pip-${{ hashFiles('requirements/pip_tools.txt') }} diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5fd98bbc..fa4937e9 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -16,6 +16,23 @@ Unreleased ========================= +[10.7.1] - 2025-01-07 +--------------------- + * feat: add group_membership table + * feat: add APIs to support LPR filtering for enterprise groups + +[10.7.0] - 2024-12-24 +--------------------- + * feat: Added user's first and last name in the enterprise enrollments API and related DB table. + +[10.6.1] - 2024-12-10 +--------------------- + * feat: add course_title in top courses in enrollments csv + +[10.6.0] - 2024-12-09 +--------------------- + * chore: upgrade python requirements + [10.5.1] - 2024-11-14 --------------------- * chore: upgrade python requirements diff --git a/enterprise_data/__init__.py b/enterprise_data/__init__.py index 781dc527..850ab32a 100644 --- a/enterprise_data/__init__.py +++ b/enterprise_data/__init__.py @@ -2,4 +2,4 @@ Enterprise data api application. This Django app exposes API endpoints used by enterprises. """ -__version__ = "10.5.1" +__version__ = "10.7.1" diff --git a/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py b/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py index faef8e26..8374ad0e 100644 --- a/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +++ b/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py @@ -124,6 +124,7 @@ def get_top_courses_by_enrollments_query(record_count=10): SELECT d.course_key, + MAX(d.course_title) AS course_title, d.enroll_type, COUNT(*) AS enrollment_count FROM filtered_data d diff --git a/enterprise_data/api/v1/serializers.py b/enterprise_data/api/v1/serializers.py index 9f14db90..66e2ed39 100644 --- a/enterprise_data/api/v1/serializers.py +++ b/enterprise_data/api/v1/serializers.py @@ -10,6 +10,7 @@ EnterpriseAdminLearnerProgress, EnterpriseAdminSummarizeInsights, EnterpriseExecEdLCModulePerformance, + EnterpriseGroupMembership, EnterpriseLearner, EnterpriseLearnerEnrollment, EnterpriseOffer, @@ -41,9 +42,9 @@ class Meta: 'course_primary_program', 'primary_program_type', 'course_primary_subject', 'has_passed', 'last_activity_date', 'progress_status', 'passed_date', 'current_grade', 'letter_grade', 'enterprise_user_id', 'user_email', 'user_account_creation_date', - 'user_country_code', 'user_username', 'enterprise_name', 'enterprise_customer_uuid', - 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours', 'is_subsidy', - 'course_product_line', 'budget_id', 'enterprise_group_name', 'enterprise_group_uuid', + 'user_country_code', 'user_username', 'user_first_name', 'user_last_name', 'enterprise_name', + 'enterprise_customer_uuid', 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours', + 'is_subsidy', 'course_product_line', 'budget_id', 'enterprise_group_name', 'enterprise_group_uuid', ) def get_course_api_url(self, obj): @@ -253,6 +254,19 @@ class Meta: ) +class EnterpriseGroupMembershipSerializer(serializers.ModelSerializer): + """ + Serializer for EnterpriseGroupMembership model. + """ + + class Meta: + model = EnterpriseGroupMembership + fields = ( + 'enterprise_group_uuid', + 'enterprise_group_name', + ) + + class AdvanceAnalyticsQueryParamSerializer(serializers.Serializer): # pylint: disable=abstract-method """Serializer for validating query params""" RESPONSE_TYPES = [ diff --git a/enterprise_data/api/v1/urls.py b/enterprise_data/api/v1/urls.py index 12767169..e198efbf 100644 --- a/enterprise_data/api/v1/urls.py +++ b/enterprise_data/api/v1/urls.py @@ -101,6 +101,11 @@ enterprise_admin_views.EnterpriseBudgetView.as_view(), name='enterprise-budgets' ), + re_path( + fr'^enterprise/(?P{UUID4_REGEX})/groups', + enterprise_admin_views.EnterpriseGroupMembershipView.as_view(), + name='enterprise-groups' + ), ] urlpatterns += router.urls diff --git a/enterprise_data/api/v1/views/enterprise_admin.py b/enterprise_data/api/v1/views/enterprise_admin.py index 7cb5c6ad..ce0c44e6 100644 --- a/enterprise_data/api/v1/views/enterprise_admin.py +++ b/enterprise_data/api/v1/views/enterprise_admin.py @@ -21,6 +21,7 @@ EnterpriseAdminLearnerProgress, EnterpriseAdminSummarizeInsights, EnterpriseExecEdLCModulePerformance, + EnterpriseGroupMembership, EnterpriseSubsidyBudget, ) from enterprise_data.utils import timer @@ -230,3 +231,24 @@ def get(self, request, enterprise_uuid): serializer = serializers.EnterpriseBudgetSerializer(budgets, many=True) return Response(serializer.data) + + +class EnterpriseGroupMembershipView(APIView): + """ + View for getting Group Memberships information for an enterprise. + """ + authentication_classes = (JwtAuthentication,) + http_method_names = ["get"] + + @permission_required("can_access_enterprise", fn=lambda request, enterprise_uuid: enterprise_uuid) + def get(self, request, enterprise_uuid): + """ + Returns the groups and budgets for an enterprise. + """ + groups = EnterpriseGroupMembership.objects.filter( + enterprise_customer_id=enterprise_uuid, + group_type='flex', + ) + + serializer = serializers.EnterpriseGroupMembershipSerializer(groups, many=True) + return Response(serializer.data) diff --git a/enterprise_data/api/v1/views/enterprise_learner.py b/enterprise_data/api/v1/views/enterprise_learner.py index d36ec7af..dc055b8d 100644 --- a/enterprise_data/api/v1/views/enterprise_learner.py +++ b/enterprise_data/api/v1/views/enterprise_learner.py @@ -12,7 +12,7 @@ from django.conf import settings from django.core.paginator import Paginator -from django.db.models import Count, Max, OuterRef, Prefetch, Q, Subquery, Value +from django.db.models import Count, Exists, Max, OuterRef, Prefetch, Q, Subquery, Value from django.db.models.fields import IntegerField from django.db.models.functions import Coalesce from django.http import StreamingHttpResponse @@ -20,7 +20,7 @@ from enterprise_data.admin_analytics.database.utils import LOGGER from enterprise_data.api.v1 import serializers -from enterprise_data.models import EnterpriseLearner, EnterpriseLearnerEnrollment +from enterprise_data.models import EnterpriseGroupMembership, EnterpriseLearner, EnterpriseLearnerEnrollment from enterprise_data.paginators import EnterpriseEnrollmentsPagination from enterprise_data.renderers import EnrollmentsCSVRenderer from enterprise_data.utils import subtract_one_month @@ -59,9 +59,9 @@ class EnterpriseLearnerEnrollmentViewSet(EnterpriseViewSetMixin, viewsets.ReadOn 'course_primary_program', 'primary_program_type', 'course_primary_subject', 'has_passed', 'last_activity_date', 'progress_status', 'passed_date', 'current_grade', 'letter_grade', 'enterprise_user_id', 'user_email', 'user_account_creation_date', - 'user_country_code', 'user_username', 'enterprise_name', 'enterprise_customer_uuid', - 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours', 'is_subsidy', - 'course_product_line', 'budget_id' + 'user_country_code', 'user_username', 'user_first_name', 'user_last_name', 'enterprise_name', + 'enterprise_customer_uuid', 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours', + 'is_subsidy', 'course_product_line', 'budget_id', ] # TODO: Remove after we release the streaming csv changes @@ -174,6 +174,15 @@ def apply_filters(self, queryset): if is_subsidy: queryset = queryset.filter(is_subsidy=is_subsidy) + group_uuid = query_filters.get('group_uuid') + if group_uuid: + flex_group_exists = EnterpriseGroupMembership.objects.filter( + enterprise_customer_user_id=OuterRef('enterprise_user_id'), + enterprise_group_uuid=group_uuid, + group_type='flex' + ) + queryset = queryset.filter(Exists(flex_group_exists)) + return queryset def filter_by_offer_id(self, queryset, offer_id): diff --git a/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py b/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py index c9744377..a5642876 100644 --- a/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +++ b/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py @@ -39,6 +39,8 @@ def test_create_enterprise_learner_enrollment_lpr_v1_with_dsc_disabled(self): assert enterprise_learner_enrollment[0].letter_grade is None assert enterprise_learner_enrollment[0].enterprise_user_id is None assert enterprise_learner_enrollment[0].user_username is None + assert enterprise_learner_enrollment[0].user_first_name is None + assert enterprise_learner_enrollment[0].user_last_name is None assert enterprise_learner_enrollment[0].user_email is None assert enterprise_learner_enrollment[0].enterprise_user is None @@ -62,6 +64,8 @@ def test_create_enterprise_learner_enrollment_lpr_v1_with_dsc_enabled(self): assert enterprise_learner_enrollment[0].progress_status is not None assert enterprise_learner_enrollment[0].enterprise_user_id is not None assert enterprise_learner_enrollment[0].user_username is not None + assert enterprise_learner_enrollment[0].user_first_name is not None + assert enterprise_learner_enrollment[0].user_last_name is not None assert enterprise_learner_enrollment[0].enterprise_user is not None assert enterprise_learner_enrollment[0].user_email is not None assert EnterpriseLearner.objects.count() == 1 diff --git a/enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py b/enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py new file mode 100644 index 00000000..b5f5fc59 --- /dev/null +++ b/enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.15 on 2024-12-23 12:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('enterprise_data', '0044_enterpriseexecedlcmoduleperformance'), + ] + + operations = [ + migrations.AlterModelOptions( + name='enterpriseexecedlcmoduleperformance', + options={'verbose_name': 'Exec Ed LC Module Performance', 'verbose_name_plural': 'Exec Ed LC Module Performance'}, + ), + migrations.AddField( + model_name='enterpriselearnerenrollment', + name='user_first_name', + field=models.CharField(max_length=255, null=True), + ), + migrations.AddField( + model_name='enterpriselearnerenrollment', + name='user_last_name', + field=models.CharField(max_length=255, null=True), + ), + ] diff --git a/enterprise_data/migrations/0046_enterprisegroupmembership.py b/enterprise_data/migrations/0046_enterprisegroupmembership.py new file mode 100644 index 00000000..725bc5c8 --- /dev/null +++ b/enterprise_data/migrations/0046_enterprisegroupmembership.py @@ -0,0 +1,36 @@ +# Generated by Django 4.2.16 on 2025-01-08 07:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('enterprise_data', '0045_alter_enterpriseexecedlcmoduleperformance_options_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='EnterpriseGroupMembership', + fields=[ + ('group_membership_unique_id', models.CharField(max_length=64, primary_key=True, serialize=False)), + ('is_applies_to_all_contexts', models.BooleanField(default=False)), + ('enterprise_customer_id', models.UUIDField(db_index=True, null=True)), + ('enterprise_group_name', models.CharField(max_length=255, null=True)), + ('enterprise_group_uuid', models.UUIDField(null=True)), + ('group_is_removed', models.BooleanField(default=False)), + ('group_type', models.CharField(max_length=128, null=True)), + ('activated_at', models.DateTimeField(null=True)), + ('enterprise_customer_user_id', models.PositiveIntegerField(null=True)), + ('membership_is_removed', models.BooleanField(default=False)), + ('membership_status', models.CharField(max_length=128, null=True)), + ('enterprise_group_membership_uuid', models.UUIDField(null=True)), + ], + options={ + 'verbose_name': 'Group Membership', + 'verbose_name_plural': 'Group Memberships', + 'db_table': 'group_membership', + 'indexes': [models.Index(fields=['enterprise_group_uuid', 'group_type', 'enterprise_customer_user_id'], name='group_membe_enterpr_796f48_idx')], + }, + ), + ] diff --git a/enterprise_data/models.py b/enterprise_data/models.py index 72e9d0b6..164d0345 100644 --- a/enterprise_data/models.py +++ b/enterprise_data/models.py @@ -128,6 +128,8 @@ class Meta: user_account_creation_date = models.DateTimeField(null=True) user_country_code = models.CharField(max_length=2, null=True) user_username = models.CharField(max_length=255, null=True) + user_first_name = models.CharField(max_length=255, null=True) + user_last_name = models.CharField(max_length=255, null=True) enterprise_name = models.CharField(max_length=255, db_index=True, null=False) enterprise_customer_uuid = models.UUIDField(db_index=True, null=False) enterprise_sso_uid = models.CharField(max_length=255, null=True) @@ -396,6 +398,50 @@ def __repr__(self): return self.__str__() +class EnterpriseGroupMembership(models.Model): + """ + Details of group memberships in enterprise reports. + """ + + objects = EnterpriseReportingModelManager() + + class Meta: + app_label = 'enterprise_data' + db_table = 'group_membership' + verbose_name = _("Group Membership") + verbose_name_plural = _("Group Memberships") + indexes = [ + models.Index(fields=['enterprise_group_uuid', 'group_type', 'enterprise_customer_user_id']), + ] + + group_membership_unique_id = models.CharField(max_length=64, primary_key=True) + is_applies_to_all_contexts = models.BooleanField(default=False) + enterprise_customer_id = models.UUIDField(db_index=True, null=True) + enterprise_group_name = models.CharField(max_length=255, null=True) + enterprise_group_uuid = models.UUIDField(null=True) + group_is_removed = models.BooleanField(default=False) + group_type = models.CharField(max_length=128, null=True) + activated_at = models.DateTimeField(null=True) + enterprise_customer_user_id = models.PositiveIntegerField(null=True) + membership_is_removed = models.BooleanField(default=False) + membership_status = models.CharField(max_length=128, null=True) + enterprise_group_membership_uuid = models.UUIDField(null=True) + + def __str__(self): + """ + Return a human-readable string representation of the object. + """ + return (f'') + + def __repr__(self): + """ + Return uniquely identifying string representation. + """ + return self.__str__() + + class EnterpriseUser(models.Model): """Information includes a mix of the user's meta data. diff --git a/enterprise_data/renderers.py b/enterprise_data/renderers.py index 56ef1d01..6ba0ba89 100644 --- a/enterprise_data/renderers.py +++ b/enterprise_data/renderers.py @@ -25,9 +25,9 @@ class EnrollmentsCSVRenderer(CSVStreamingRenderer): 'course_primary_program', 'primary_program_type', 'course_primary_subject', 'has_passed', 'last_activity_date', 'progress_status', 'passed_date', 'current_grade', 'letter_grade', 'enterprise_user_id', 'user_email', 'user_account_creation_date', - 'user_country_code', 'user_username', 'enterprise_name', 'enterprise_customer_uuid', - 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours', 'is_subsidy', - 'course_product_line', 'budget_id', 'enterprise_group_name', 'enterprise_group_uuid', + 'user_country_code', 'user_username', 'user_first_name', 'user_last_name', 'enterprise_name', + 'enterprise_customer_uuid', 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours', + 'is_subsidy', 'course_product_line', 'budget_id', 'enterprise_group_name', 'enterprise_group_uuid', ] diff --git a/enterprise_data/tests/test_models.py b/enterprise_data/tests/test_models.py index 4e809f4e..8c5c5a4e 100644 --- a/enterprise_data/tests/test_models.py +++ b/enterprise_data/tests/test_models.py @@ -10,6 +10,7 @@ from enterprise_data.tests.test_utils import ( EnterpriseEnrollmentFactory, + EnterpriseGroupMembershipFactory, EnterpriseOfferFactory, EnterpriseSubsidyBudgetFactory, EnterpriseUserFactory, @@ -91,6 +92,32 @@ def test_string_conversion(self, method): assert expected_str == method(self.enterprise_subsidy_budget) +@mark.django_db +@ddt.ddt +class TestEnterpriseGroupMembership(unittest.TestCase): + """ + Tests for Enterprise Group Membership model + """ + + def setUp(self): + self.enterprise_group_membership = EnterpriseGroupMembershipFactory( + enterprise_customer_id='ee5e6b3a-069a-4947-bb8d-d2dbc323396c', + enterprise_group_name='Test Group', + enterprise_group_uuid='ee5e6b3a-069a-4947-bb8d-d2dbc323396d', + ) + super().setUp() + + @ddt.data(str, repr) + def test_string_conversion(self, method): + """ + Test conversion to string. + """ + expected_str = ('') + assert expected_str == method(self.enterprise_group_membership) + + @mark.django_db @ddt.ddt class TestEnterpriseUser(unittest.TestCase): diff --git a/enterprise_data/tests/test_utils.py b/enterprise_data/tests/test_utils.py index 2c1b41aa..e79f471a 100644 --- a/enterprise_data/tests/test_utils.py +++ b/enterprise_data/tests/test_utils.py @@ -14,6 +14,7 @@ from enterprise_data.models import ( EnterpriseEnrollment, + EnterpriseGroupMembership, EnterpriseLearner, EnterpriseLearnerEnrollment, EnterpriseOffer, @@ -180,6 +181,8 @@ class Meta: enterprise_user_id = factory.Sequence(lambda n: n) user_email = factory.lazy_attribute(lambda x: FAKER.email()) # pylint: disable=no-member user_username = factory.Sequence('robot{}'.format) + user_first_name = factory.Sequence('Robot First {}'.format) + user_last_name = factory.Sequence('Robot Last {}'.format) user_account_creation_date = factory.lazy_attribute(lambda x: '2018-01-01') user_country_code = factory.lazy_attribute(lambda x: FAKER.country_code()) is_subsidy = factory.lazy_attribute(lambda x: FAKER.boolean()) # pylint: disable=no-member @@ -230,6 +233,8 @@ def set_fields_according_to_consent( 'user_account_creation_date', 'user_country_code', 'user_username', + 'user_first_name', + 'user_last_name', ] if create and not obj.is_consent_granted: for field in dsc_dependent_fields: @@ -284,6 +289,27 @@ class Meta: ) +class EnterpriseGroupMembershipFactory(factory.django.DjangoModelFactory): + """ + EnterpriseGroupMembership model Factory. + """ + class Meta: + model = EnterpriseGroupMembership + + enterprise_customer_id = factory.LazyAttribute(lambda _: FAKER.uuid4()) + enterprise_group_name = factory.LazyAttribute(lambda _: ' '.join(FAKER.words(nb=2)).title()) + enterprise_group_uuid = factory.LazyAttribute(lambda _: FAKER.uuid4()) + group_is_removed = factory.LazyAttribute(lambda _: FAKER.boolean()) + group_type = factory.LazyAttribute(lambda _: 'budget') + activated_at = factory.LazyAttribute(lambda _: FAKER.date_time_this_decade(tzinfo=pytz.UTC)) + enterprise_customer_user_id = factory.LazyAttribute(lambda _: FAKER.random_int(min=1, max=10000)) + membership_is_removed = factory.LazyAttribute(lambda _: FAKER.boolean()) + membership_status = factory.LazyAttribute(lambda _: FAKER.word()) + enterprise_group_membership_uuid = factory.LazyAttribute(lambda _: FAKER.uuid4()) + + is_applies_to_all_contexts = factory.LazyAttribute(lambda _: FAKER.boolean()) + + class EnterpriseOfferFactory(factory.django.DjangoModelFactory): """ EnterpriseLearner model Factory. diff --git a/requirements/base.txt b/requirements/base.txt index 9d9f11a0..8e655dc0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -10,22 +10,22 @@ asgiref==3.8.1 # via django asn1crypto==1.5.1 # via snowflake-connector-python -awscli==1.36.4 +awscli==1.36.38 # via -r requirements/reporting.in -bcrypt==4.2.0 +bcrypt==4.2.1 # via paramiko billiard==4.2.1 # via celery -boto3==1.35.63 +boto3==1.35.97 # via -r requirements/reporting.in -botocore==1.35.63 +botocore==1.35.97 # via # awscli # boto3 # s3transfer celery==5.3.6 # via -r requirements/reporting.in -certifi==2024.8.30 +certifi==2024.12.14 # via # py2neo # requests @@ -35,11 +35,11 @@ cffi==1.17.1 # cryptography # pynacl # snowflake-connector-python -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # requests # snowflake-connector-python -click==8.1.7 +click==8.1.8 # via # celery # click-didyoumean @@ -54,7 +54,7 @@ click-repl==0.3.0 # via celery colorama==0.4.6 # via awscli -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/reporting.in # django-fernet-fields-v2 @@ -63,7 +63,7 @@ cryptography==43.0.3 # pyjwt # pyopenssl # snowflake-connector-python -django==4.2.16 +django==4.2.17 # via # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # -r requirements/base.in @@ -106,7 +106,7 @@ docutils==0.16 # via awscli drf-jwt==1.19.2 # via edx-drf-extensions -edx-django-utils==7.0.0 +edx-django-utils==7.1.0 # via # -r requirements/base.in # edx-drf-extensions @@ -125,7 +125,7 @@ edx-rest-api-client==6.0.0 # via -r requirements/base.in factory-boy==3.3.1 # via -r requirements/base.in -faker==33.0.0 +faker==33.3.1 # via factory-boy filelock==3.16.1 # via snowflake-connector-python @@ -145,9 +145,9 @@ monotonic==1.6 # via py2neo mysql-connector-python==9.1.0 # via -r requirements/base.in -newrelic==10.2.0 +newrelic==10.4.0 # via edx-django-utils -numpy==2.1.3 +numpy==2.2.1 # via # -r requirements/base.in # pandas @@ -165,13 +165,13 @@ pbr==6.1.0 # via stevedore pgpy==0.6.0 # via -r requirements/reporting.in -pillow==11.0.0 +pillow==11.1.0 # via pansi platformdirs==4.3.6 # via snowflake-connector-python prompt-toolkit==3.0.48 # via click-repl -psutil==6.1.0 +psutil==6.1.1 # via edx-django-utils py2neo @ https://github.com/overhangio/py2neo/releases/download/2021.2.3/py2neo-2021.2.3.tar.gz # via -r requirements/reporting.in @@ -181,9 +181,9 @@ pyasn1==0.6.1 # rsa pycparser==2.22 # via cffi -pygments==2.18.0 +pygments==2.19.1 # via py2neo -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # drf-jwt # edx-drf-extensions @@ -197,7 +197,7 @@ pynacl==1.5.0 # via # edx-django-utils # paramiko -pyopenssl==24.2.1 +pyopenssl==24.3.0 # via snowflake-connector-python python-dateutil==2.9.0.post0 # via @@ -223,26 +223,26 @@ rsa==4.7.2 # via awscli rules==3.5 # via -r requirements/base.in -s3transfer==0.10.3 +s3transfer==0.10.4 # via # awscli # boto3 semantic-version==2.10.0 # via edx-drf-extensions -six==1.16.0 +six==1.17.0 # via # edx-rbac # interchange # py2neo # python-dateutil # vertica-python -snowflake-connector-python==3.12.3 +snowflake-connector-python==3.12.4 # via -r requirements/reporting.in sortedcontainers==2.4.0 # via snowflake-connector-python -sqlparse==0.5.2 +sqlparse==0.5.3 # via django -stevedore==5.3.0 +stevedore==5.4.0 # via # edx-django-utils # edx-opaque-keys @@ -262,6 +262,7 @@ unicodecsv==0.14.1 # via -r requirements/reporting.in urllib3==2.2.3 # via + # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # botocore # py2neo # requests diff --git a/requirements/ci.txt b/requirements/ci.txt index 98ea421f..610b0494 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -10,7 +10,7 @@ chardet==5.2.0 # via tox colorama==0.4.6 # via tox -coverage==7.6.7 +coverage==7.6.10 # via -r requirements/ci.in distlib==0.3.9 # via virtualenv @@ -32,5 +32,5 @@ pyproject-api==1.8.0 # via tox tox==4.23.2 # via -r requirements/ci.in -virtualenv==20.27.1 +virtualenv==20.28.1 # via tox diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt index fdbf6ee4..3c7d3e92 100644 --- a/requirements/common_constraints.txt +++ b/requirements/common_constraints.txt @@ -26,3 +26,7 @@ django-simple-history==3.0.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 45c97751..a7c5108d 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -10,19 +10,19 @@ asgiref==3.8.1 # via django asn1crypto==1.5.1 # via snowflake-connector-python -astroid==3.3.5 +astroid==3.3.8 # via # pylint # pylint-celery -awscli==1.36.4 +awscli==1.36.38 # via -r requirements/reporting.in -bcrypt==4.2.0 +bcrypt==4.2.1 # via paramiko billiard==4.2.1 # via celery -boto3==1.35.63 +boto3==1.35.97 # via -r requirements/reporting.in -botocore==1.35.63 +botocore==1.35.97 # via # awscli # boto3 @@ -33,7 +33,7 @@ cachetools==5.5.0 # via tox celery==5.3.6 # via -r requirements/reporting.in -certifi==2024.8.30 +certifi==2024.12.14 # via # py2neo # requests @@ -47,11 +47,11 @@ chardet==5.2.0 # via # diff-cover # tox -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # requests # snowflake-connector-python -click==8.1.7 +click==8.1.8 # via # celery # click-didyoumean @@ -70,13 +70,13 @@ 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-lint colorama==0.4.6 # via # awscli # tox -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/reporting.in # django-fernet-fields-v2 @@ -86,13 +86,13 @@ cryptography==43.0.3 # pyopenssl # secretstorage # snowflake-connector-python -diff-cover==9.2.0 +diff-cover==9.2.1 # via -r requirements/dev-enterprise_data.in dill==0.3.9 # via pylint distlib==0.3.9 # via virtualenv -django==4.2.16 +django==4.2.17 # via # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # -r requirements/base.in @@ -138,7 +138,7 @@ docutils==0.16 # readme-renderer drf-jwt==1.19.2 # via edx-drf-extensions -edx-django-utils==7.0.0 +edx-django-utils==7.1.0 # via # -r requirements/base.in # edx-drf-extensions @@ -163,7 +163,7 @@ edx-rest-api-client==6.0.0 # via -r requirements/base.in factory-boy==3.3.1 # via -r requirements/base.in -faker==33.0.0 +faker==33.3.1 # via factory-boy filelock==3.16.1 # via @@ -174,8 +174,6 @@ idna==3.10 # via # requests # snowflake-connector-python -importlib-metadata==8.5.0 - # via twine interchange==2021.0.4 # via py2neo isort==5.13.2 @@ -192,7 +190,7 @@ jeepney==0.8.0 # via # keyring # secretstorage -jinja2==3.1.4 +jinja2==3.1.5 # via # code-annotations # diff-cover @@ -200,7 +198,7 @@ jmespath==1.0.1 # via # boto3 # botocore -keyring==25.5.0 +keyring==25.6.0 # via twine kombu==5.4.2 # via celery @@ -226,11 +224,11 @@ more-itertools==10.5.0 # jaraco-functools mysql-connector-python==9.1.0 # via -r requirements/base.in -newrelic==10.2.0 +newrelic==10.4.0 # via edx-django-utils -nh3==0.2.18 +nh3==0.2.20 # via readme-renderer -numpy==2.1.3 +numpy==2.2.1 # via # -r requirements/base.in # pandas @@ -241,6 +239,7 @@ packaging==24.2 # pyproject-api # snowflake-connector-python # tox + # twine pandas==2.2.3 # via -r requirements/base.in pansi==2024.11.0 @@ -253,11 +252,11 @@ pbr==6.1.0 # via stevedore pgpy==0.6.0 # via -r requirements/reporting.in -pillow==11.0.0 +pillow==11.1.0 # via pansi pip-tools==7.4.1 # via -r requirements/dev-enterprise_data.in -pkginfo==1.10.0 +pkginfo==1.12.0 # via twine platformdirs==4.3.6 # via @@ -273,7 +272,7 @@ polib==1.2.0 # via edx-i18n-tools prompt-toolkit==3.0.48 # via click-repl -psutil==6.1.0 +psutil==6.1.1 # via edx-django-utils py2neo @ https://github.com/overhangio/py2neo/releases/download/2021.2.3/py2neo-2021.2.3.tar.gz # via -r requirements/reporting.in @@ -287,19 +286,19 @@ pycparser==2.22 # via cffi pydocstyle==6.3.0 # via -r requirements/quality.in -pygments==2.18.0 +pygments==2.19.1 # via # diff-cover # py2neo # readme-renderer # rich -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # drf-jwt # edx-drf-extensions # edx-rest-api-client # snowflake-connector-python -pylint==3.3.1 +pylint==3.3.3 # via # edx-lint # pylint-celery @@ -321,7 +320,7 @@ pynacl==1.5.0 # via # edx-django-utils # paramiko -pyopenssl==24.2.1 +pyopenssl==24.3.0 # via snowflake-connector-python pyproject-api==1.8.0 # via tox @@ -368,7 +367,7 @@ rsa==4.7.2 # via awscli rules==3.5 # via -r requirements/base.in -s3transfer==0.10.3 +s3transfer==0.10.4 # via # awscli # boto3 @@ -376,7 +375,7 @@ secretstorage==3.3.3 # via keyring semantic-version==2.10.0 # via edx-drf-extensions -six==1.16.0 +six==1.17.0 # via # edx-lint # edx-rbac @@ -386,13 +385,13 @@ six==1.16.0 # vertica-python snowballstemmer==2.2.0 # via pydocstyle -snowflake-connector-python==3.12.3 +snowflake-connector-python==3.12.4 # via -r requirements/reporting.in sortedcontainers==2.4.0 # via snowflake-connector-python -sqlparse==0.5.2 +sqlparse==0.5.3 # via django -stevedore==5.3.0 +stevedore==5.4.0 # via # code-annotations # edx-django-utils @@ -407,7 +406,7 @@ tomlkit==0.13.2 # snowflake-connector-python tox==4.23.2 # via -r requirements/dev-enterprise_data.in -twine==5.1.1 +twine==6.0.1 # via -r requirements/dev-enterprise_data.in typing-extensions==4.12.2 # via @@ -423,6 +422,7 @@ unicodecsv==0.14.1 # via -r requirements/reporting.in urllib3==2.2.3 # via + # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # botocore # py2neo # requests @@ -434,16 +434,14 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.27.1 +virtualenv==20.28.1 # via tox wcwidth==0.2.13 # via prompt-toolkit -wheel==0.45.0 +wheel==0.45.1 # via # -r requirements/dev-enterprise_data.in # pip-tools -zipp==3.21.0 - # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/django.txt b/requirements/django.txt index 64aaf996..ebf97308 100644 --- a/requirements/django.txt +++ b/requirements/django.txt @@ -1 +1 @@ -django==4.2.16 +django==4.2.17 diff --git a/requirements/pip.txt b/requirements/pip.txt index 9d04752b..bc08ee06 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/edx-enterprise-data/edx-enterprise-data/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/pip_tools.txt b/requirements/pip_tools.txt index a87f3c6b..3971d0f1 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/quality.txt b/requirements/quality.txt index 1525e6e6..bec7f4a1 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -10,19 +10,19 @@ asgiref==3.8.1 # via django asn1crypto==1.5.1 # via snowflake-connector-python -astroid==3.3.5 +astroid==3.3.8 # via # pylint # pylint-celery -awscli==1.36.4 +awscli==1.36.38 # via -r requirements/reporting.in -bcrypt==4.2.0 +bcrypt==4.2.1 # via paramiko billiard==4.2.1 # via celery -boto3==1.35.63 +boto3==1.35.97 # via -r requirements/reporting.in -botocore==1.35.63 +botocore==1.35.97 # via # awscli # boto3 @@ -33,7 +33,7 @@ cachetools==5.5.0 # via tox celery==5.3.6 # via -r requirements/reporting.in -certifi==2024.8.30 +certifi==2024.12.14 # via # py2neo # requests @@ -47,11 +47,11 @@ chardet==5.2.0 # via # diff-cover # tox -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # requests # snowflake-connector-python -click==8.1.7 +click==8.1.8 # via # celery # click-didyoumean @@ -70,15 +70,15 @@ 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-lint colorama==0.4.6 # via # awscli # tox -coverage[toml]==7.6.7 +coverage[toml]==7.6.10 # via pytest-cov -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/reporting.in # django-fernet-fields-v2 @@ -90,13 +90,13 @@ cryptography==43.0.3 # snowflake-connector-python ddt==1.7.2 # via -r requirements/test.in -diff-cover==9.2.0 +diff-cover==9.2.1 # via -r requirements/dev-enterprise_data.in dill==0.3.9 # via pylint distlib==0.3.9 # via virtualenv -django==4.2.16 +django==4.2.17 # via # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # -r requirements/base.in @@ -143,7 +143,7 @@ docutils==0.16 # readme-renderer drf-jwt==1.19.2 # via edx-drf-extensions -edx-django-utils==7.0.0 +edx-django-utils==7.1.0 # via # -r requirements/base.in # edx-drf-extensions @@ -170,7 +170,7 @@ factory-boy==3.3.1 # via # -r requirements/base.in # -r requirements/test.in -faker==33.0.0 +faker==33.3.1 # via factory-boy filelock==3.16.1 # via @@ -185,8 +185,6 @@ idna==3.10 # via # requests # snowflake-connector-python -importlib-metadata==8.5.0 - # via twine iniconfig==2.0.0 # via pytest interchange==2021.0.4 @@ -205,7 +203,7 @@ jeepney==0.8.0 # via # keyring # secretstorage -jinja2==3.1.4 +jinja2==3.1.5 # via # code-annotations # diff-cover @@ -213,7 +211,7 @@ jmespath==1.0.1 # via # boto3 # botocore -keyring==25.5.0 +keyring==25.6.0 # via twine kombu==5.4.2 # via celery @@ -241,11 +239,11 @@ more-itertools==10.5.0 # jaraco-functools mysql-connector-python==9.1.0 # via -r requirements/base.in -newrelic==10.2.0 +newrelic==10.4.0 # via edx-django-utils -nh3==0.2.18 +nh3==0.2.20 # via readme-renderer -numpy==2.1.3 +numpy==2.2.1 # via # -r requirements/base.in # pandas @@ -257,6 +255,7 @@ packaging==24.2 # pytest # snowflake-connector-python # tox + # twine pandas==2.2.3 # via -r requirements/base.in pansi==2024.11.0 @@ -269,11 +268,11 @@ pbr==6.1.0 # via stevedore pgpy==0.6.0 # via -r requirements/reporting.in -pillow==11.0.0 +pillow==11.1.0 # via pansi pip-tools==7.4.1 # via -r requirements/dev-enterprise_data.in -pkginfo==1.10.0 +pkginfo==1.12.0 # via twine platformdirs==4.3.6 # via @@ -290,7 +289,7 @@ polib==1.2.0 # via edx-i18n-tools prompt-toolkit==3.0.48 # via click-repl -psutil==6.1.0 +psutil==6.1.1 # via edx-django-utils py2neo @ https://github.com/overhangio/py2neo/releases/download/2021.2.3/py2neo-2021.2.3.tar.gz # via -r requirements/reporting.in @@ -304,19 +303,19 @@ pycparser==2.22 # via cffi pydocstyle==6.3.0 # via -r requirements/quality.in -pygments==2.18.0 +pygments==2.19.1 # via # diff-cover # py2neo # readme-renderer # rich -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # drf-jwt # edx-drf-extensions # edx-rest-api-client # snowflake-connector-python -pylint==3.3.1 +pylint==3.3.3 # via # edx-lint # pylint-celery @@ -338,7 +337,7 @@ pynacl==1.5.0 # via # edx-django-utils # paramiko -pyopenssl==24.2.1 +pyopenssl==24.3.0 # via snowflake-connector-python pyproject-api==1.8.0 # via tox @@ -346,7 +345,7 @@ pyproject-hooks==1.2.0 # via # build # pip-tools -pytest==8.3.3 +pytest==8.3.4 # via # pytest-cov # pytest-django @@ -388,7 +387,7 @@ requests==2.32.3 # twine requests-toolbelt==1.0.0 # via twine -responses==0.25.3 +responses==0.25.5 # via -r requirements/test.in rfc3986==2.0.0 # via twine @@ -398,7 +397,7 @@ rsa==4.7.2 # via awscli rules==3.5 # via -r requirements/base.in -s3transfer==0.10.3 +s3transfer==0.10.4 # via # awscli # boto3 @@ -406,7 +405,7 @@ secretstorage==3.3.3 # via keyring semantic-version==2.10.0 # via edx-drf-extensions -six==1.16.0 +six==1.17.0 # via # edx-lint # edx-rbac @@ -416,13 +415,13 @@ six==1.16.0 # vertica-python snowballstemmer==2.2.0 # via pydocstyle -snowflake-connector-python==3.12.3 +snowflake-connector-python==3.12.4 # via -r requirements/reporting.in sortedcontainers==2.4.0 # via snowflake-connector-python -sqlparse==0.5.2 +sqlparse==0.5.3 # via django -stevedore==5.3.0 +stevedore==5.4.0 # via # code-annotations # edx-django-utils @@ -439,7 +438,7 @@ tomlkit==0.13.2 # snowflake-connector-python tox==4.23.2 # via -r requirements/dev-enterprise_data.in -twine==5.1.1 +twine==6.0.1 # via -r requirements/dev-enterprise_data.in typing-extensions==4.12.2 # via @@ -455,6 +454,7 @@ unicodecsv==0.14.1 # via -r requirements/reporting.in urllib3==2.2.3 # via + # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # botocore # py2neo # requests @@ -467,16 +467,14 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.27.1 +virtualenv==20.28.1 # via tox wcwidth==0.2.13 # via prompt-toolkit -wheel==0.45.0 +wheel==0.45.1 # via # -r requirements/dev-enterprise_data.in # pip-tools -zipp==3.21.0 - # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/test-master.txt b/requirements/test-master.txt index 0fc1b192..66a3fa57 100644 --- a/requirements/test-master.txt +++ b/requirements/test-master.txt @@ -10,22 +10,22 @@ asgiref==3.8.1 # via django asn1crypto==1.5.1 # via snowflake-connector-python -awscli==1.36.4 +awscli==1.36.38 # via -r requirements/reporting.in -bcrypt==4.2.0 +bcrypt==4.2.1 # via paramiko billiard==4.2.1 # via celery -boto3==1.35.63 +boto3==1.35.97 # via -r requirements/reporting.in -botocore==1.35.63 +botocore==1.35.97 # via # awscli # boto3 # s3transfer celery==5.3.6 # via -r requirements/reporting.in -certifi==2024.8.30 +certifi==2024.12.14 # via # py2neo # requests @@ -35,11 +35,11 @@ cffi==1.17.1 # cryptography # pynacl # snowflake-connector-python -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # requests # snowflake-connector-python -click==8.1.7 +click==8.1.8 # via # celery # click-didyoumean @@ -54,9 +54,9 @@ click-repl==0.3.0 # via celery colorama==0.4.6 # via awscli -coverage[toml]==7.6.7 +coverage[toml]==7.6.10 # via pytest-cov -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/reporting.in # django-fernet-fields-v2 @@ -112,7 +112,7 @@ docutils==0.16 # via awscli drf-jwt==1.19.2 # via edx-drf-extensions -edx-django-utils==7.0.0 +edx-django-utils==7.1.0 # via # -r requirements/base.in # edx-drf-extensions @@ -134,7 +134,7 @@ factory-boy==3.3.1 # via # -r requirements/base.in # -r requirements/test.in -faker==33.0.0 +faker==33.3.1 # via factory-boy filelock==3.16.1 # via snowflake-connector-python @@ -162,9 +162,9 @@ monotonic==1.6 # via py2neo mysql-connector-python==9.1.0 # via -r requirements/base.in -newrelic==10.2.0 +newrelic==10.4.0 # via edx-django-utils -numpy==2.1.3 +numpy==2.2.1 # via # -r requirements/base.in # pandas @@ -183,7 +183,7 @@ pbr==6.1.0 # via stevedore pgpy==0.6.0 # via -r requirements/reporting.in -pillow==11.0.0 +pillow==11.1.0 # via pansi platformdirs==4.3.6 # via snowflake-connector-python @@ -191,7 +191,7 @@ pluggy==1.5.0 # via pytest prompt-toolkit==3.0.48 # via click-repl -psutil==6.1.0 +psutil==6.1.1 # via edx-django-utils py2neo @ https://github.com/overhangio/py2neo/releases/download/2021.2.3/py2neo-2021.2.3.tar.gz # via -r requirements/reporting.in @@ -201,9 +201,9 @@ pyasn1==0.6.1 # rsa pycparser==2.22 # via cffi -pygments==2.18.0 +pygments==2.19.1 # via py2neo -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # drf-jwt # edx-drf-extensions @@ -217,9 +217,9 @@ pynacl==1.5.0 # via # edx-django-utils # paramiko -pyopenssl==24.2.1 +pyopenssl==24.3.0 # via snowflake-connector-python -pytest==8.3.3 +pytest==8.3.4 # via # pytest-cov # pytest-django @@ -251,32 +251,32 @@ requests==2.32.3 # edx-rest-api-client # responses # snowflake-connector-python -responses==0.25.3 +responses==0.25.5 # via -r requirements/test.in rsa==4.7.2 # via awscli rules==3.5 # via -r requirements/base.in -s3transfer==0.10.3 +s3transfer==0.10.4 # via # awscli # boto3 semantic-version==2.10.0 # via edx-drf-extensions -six==1.16.0 +six==1.17.0 # via # edx-rbac # interchange # py2neo # python-dateutil # vertica-python -snowflake-connector-python==3.12.3 +snowflake-connector-python==3.12.4 # via -r requirements/reporting.in sortedcontainers==2.4.0 # via snowflake-connector-python -sqlparse==0.5.2 +sqlparse==0.5.3 # via django -stevedore==5.3.0 +stevedore==5.4.0 # via # edx-django-utils # edx-opaque-keys @@ -298,6 +298,7 @@ unicodecsv==0.14.1 # via -r requirements/reporting.in urllib3==2.2.3 # via + # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # botocore # py2neo # requests diff --git a/requirements/test-reporting.txt b/requirements/test-reporting.txt index 0e7e1a92..4ba8d04b 100644 --- a/requirements/test-reporting.txt +++ b/requirements/test-reporting.txt @@ -8,15 +8,15 @@ amqp==5.3.1 # via kombu asn1crypto==1.5.1 # via snowflake-connector-python -awscli==1.36.4 +awscli==1.36.38 # via -r /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/reporting.in -bcrypt==4.2.0 +bcrypt==4.2.1 # via paramiko billiard==4.2.1 # via celery -boto3==1.35.63 +boto3==1.35.97 # via -r /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/reporting.in -botocore==1.35.63 +botocore==1.35.97 # via # awscli # boto3 @@ -25,7 +25,7 @@ cachetools==5.5.0 # via tox celery==5.3.6 # via -r /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/reporting.in -certifi==2024.8.30 +certifi==2024.12.14 # via # py2neo # requests @@ -37,11 +37,11 @@ cffi==1.17.1 # snowflake-connector-python chardet==5.2.0 # via tox -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # requests # snowflake-connector-python -click==8.1.7 +click==8.1.8 # via # celery # click-didyoumean @@ -57,9 +57,9 @@ colorama==0.4.6 # via # awscli # tox -coverage[toml]==7.6.7 +coverage[toml]==7.6.10 # via pytest-cov -cryptography==43.0.3 +cryptography==44.0.0 # via # -r /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/reporting.in # paramiko @@ -110,7 +110,7 @@ pbr==6.1.0 # via mock pgpy==0.6.0 # via -r /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/reporting.in -pillow==11.0.0 +pillow==11.1.0 # via pansi platformdirs==4.3.6 # via @@ -131,15 +131,15 @@ pyasn1==0.6.1 # rsa pycparser==2.22 # via cffi -pygments==2.18.0 +pygments==2.19.1 # via py2neo -pyjwt==2.10.0 +pyjwt==2.10.1 # via snowflake-connector-python pyminizip==0.2.6 # via -r /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/reporting.in pynacl==1.5.0 # via paramiko -pyopenssl==24.2.1 +pyopenssl==24.3.0 # via snowflake-connector-python pyproject-api==1.8.0 # via tox @@ -166,22 +166,22 @@ requests==2.32.3 # via # responses # snowflake-connector-python -responses==0.25.3 +responses==0.25.5 # via -r requirements/test-reporting.in rsa==4.7.2 # via awscli -s3transfer==0.10.3 +s3transfer==0.10.4 # via # awscli # boto3 -six==1.16.0 +six==1.17.0 # via # interchange # mock # py2neo # python-dateutil # vertica-python -snowflake-connector-python==3.12.3 +snowflake-connector-python==3.12.4 # via -r /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/reporting.in sortedcontainers==2.4.0 # via snowflake-connector-python @@ -199,6 +199,7 @@ unicodecsv==0.14.1 # via -r /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/reporting.in urllib3==2.2.3 # via + # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # botocore # py2neo # requests @@ -210,7 +211,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.27.1 +virtualenv==20.28.1 # via tox wcwidth==0.2.13 # via prompt-toolkit diff --git a/requirements/test.txt b/requirements/test.txt index 1cb9d6a1..623dd5da 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -10,22 +10,22 @@ asgiref==3.8.1 # via django asn1crypto==1.5.1 # via snowflake-connector-python -awscli==1.36.4 +awscli==1.36.38 # via -r requirements/reporting.in -bcrypt==4.2.0 +bcrypt==4.2.1 # via paramiko billiard==4.2.1 # via celery -boto3==1.35.63 +boto3==1.35.97 # via -r requirements/reporting.in -botocore==1.35.63 +botocore==1.35.97 # via # awscli # boto3 # s3transfer celery==5.3.6 # via -r requirements/reporting.in -certifi==2024.8.30 +certifi==2024.12.14 # via # py2neo # requests @@ -35,11 +35,11 @@ cffi==1.17.1 # cryptography # pynacl # snowflake-connector-python -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # requests # snowflake-connector-python -click==8.1.7 +click==8.1.8 # via # celery # click-didyoumean @@ -54,9 +54,9 @@ click-repl==0.3.0 # via celery colorama==0.4.6 # via awscli -coverage[toml]==7.6.7 +coverage[toml]==7.6.10 # via pytest-cov -cryptography==43.0.3 +cryptography==44.0.0 # via # -r requirements/reporting.in # django-fernet-fields-v2 @@ -67,7 +67,7 @@ cryptography==43.0.3 # snowflake-connector-python ddt==1.7.2 # via -r requirements/test.in -django==4.2.16 +django==4.2.17 # via # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # -r requirements/base.in @@ -111,7 +111,7 @@ docutils==0.16 # via awscli drf-jwt==1.19.2 # via edx-drf-extensions -edx-django-utils==7.0.0 +edx-django-utils==7.1.0 # via # -r requirements/base.in # edx-drf-extensions @@ -132,7 +132,7 @@ factory-boy==3.3.1 # via # -r requirements/base.in # -r requirements/test.in -faker==33.0.0 +faker==33.3.1 # via factory-boy filelock==3.16.1 # via snowflake-connector-python @@ -160,9 +160,9 @@ monotonic==1.6 # via py2neo mysql-connector-python==9.1.0 # via -r requirements/base.in -newrelic==10.2.0 +newrelic==10.4.0 # via edx-django-utils -numpy==2.1.3 +numpy==2.2.1 # via # -r requirements/base.in # pandas @@ -181,7 +181,7 @@ pbr==6.1.0 # via stevedore pgpy==0.6.0 # via -r requirements/reporting.in -pillow==11.0.0 +pillow==11.1.0 # via pansi platformdirs==4.3.6 # via snowflake-connector-python @@ -189,7 +189,7 @@ pluggy==1.5.0 # via pytest prompt-toolkit==3.0.48 # via click-repl -psutil==6.1.0 +psutil==6.1.1 # via edx-django-utils py2neo @ https://github.com/overhangio/py2neo/releases/download/2021.2.3/py2neo-2021.2.3.tar.gz # via -r requirements/reporting.in @@ -199,9 +199,9 @@ pyasn1==0.6.1 # rsa pycparser==2.22 # via cffi -pygments==2.18.0 +pygments==2.19.1 # via py2neo -pyjwt[crypto]==2.10.0 +pyjwt[crypto]==2.10.1 # via # drf-jwt # edx-drf-extensions @@ -215,9 +215,9 @@ pynacl==1.5.0 # via # edx-django-utils # paramiko -pyopenssl==24.2.1 +pyopenssl==24.3.0 # via snowflake-connector-python -pytest==8.3.3 +pytest==8.3.4 # via # pytest-cov # pytest-django @@ -249,32 +249,32 @@ requests==2.32.3 # edx-rest-api-client # responses # snowflake-connector-python -responses==0.25.3 +responses==0.25.5 # via -r requirements/test.in rsa==4.7.2 # via awscli rules==3.5 # via -r requirements/base.in -s3transfer==0.10.3 +s3transfer==0.10.4 # via # awscli # boto3 semantic-version==2.10.0 # via edx-drf-extensions -six==1.16.0 +six==1.17.0 # via # edx-rbac # interchange # py2neo # python-dateutil # vertica-python -snowflake-connector-python==3.12.3 +snowflake-connector-python==3.12.4 # via -r requirements/reporting.in sortedcontainers==2.4.0 # via snowflake-connector-python -sqlparse==0.5.2 +sqlparse==0.5.3 # via django -stevedore==5.3.0 +stevedore==5.4.0 # via # edx-django-utils # edx-opaque-keys @@ -296,6 +296,7 @@ unicodecsv==0.14.1 # via -r requirements/reporting.in urllib3==2.2.3 # via + # -c /home/runner/work/edx-enterprise-data/edx-enterprise-data/requirements/common_constraints.txt # botocore # py2neo # requests