From 7a9626b7569d5d70a2c1524afcf9af100d8a63e9 Mon Sep 17 00:00:00 2001 From: Hunia Fatima Date: Mon, 29 Jul 2024 13:13:13 +0500 Subject: [PATCH] chore: deprecate edx-sphinx-theme --- .github/workflows/ci.yml | 4 +- .../workflows/upgrade-python-requirements.yml | 1 + Dockerfile | 33 +++- docs/conf.py | 14 +- edx_exams/apps/api/v1/tests/test_views.py | 65 ++++++- edx_exams/apps/api/v1/urls.py | 5 + edx_exams/apps/api/v1/views.py | 57 ++++-- edx_exams/apps/core/api.py | 7 +- edx_exams/apps/core/constants.py | 2 + .../commands/bulk_add_course_staff.py | 53 +++--- .../test/test_bulk_add_course_staff.py | 62 ++++++- .../migrations/0028_admin_optional_fields.py | 63 +++++++ edx_exams/apps/core/models.py | 36 +++- edx_exams/apps/core/signals/handlers.py | 5 +- edx_exams/apps/core/tests/test_api.py | 15 ++ edx_exams/apps/core/tests/test_handlers.py | 26 +++ edx_exams/apps/core/tests/test_models.py | 18 ++ edx_exams/settings/local.py | 6 + requirements/base.txt | 81 ++++---- requirements/ci.txt | 20 +- requirements/common_constraints.txt | 9 - requirements/dev.txt | 174 +++++++----------- requirements/django.txt | 2 +- requirements/doc.in | 2 +- requirements/doc.txt | 113 ++++++------ requirements/pip-tools.txt | 16 +- requirements/pip.txt | 8 +- requirements/production.txt | 92 ++++----- requirements/quality.txt | 159 ++++++---------- requirements/test.txt | 120 +++++------- requirements/validation.txt | 161 ++++++---------- tox.ini | 2 +- 32 files changed, 767 insertions(+), 664 deletions(-) create mode 100644 edx_exams/apps/core/migrations/0028_admin_optional_fields.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 665cf17e..5e30a228 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-20.04] - python-version: ['3.8'] + python-version: ['3.12'] toxenv: [django42, quality, pii_check] steps: @@ -38,7 +38,7 @@ jobs: run: tox - name: Run coverage - if: matrix.python-version == '3.8' && matrix.toxenv == 'django42' + if: matrix.python-version == '3.12' && matrix.toxenv == 'django42' uses: py-cov-action/python-coverage-comment-action@v3 with: GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/upgrade-python-requirements.yml b/.github/workflows/upgrade-python-requirements.yml index 9672e1a7..3411ad48 100644 --- a/.github/workflows/upgrade-python-requirements.yml +++ b/.github/workflows/upgrade-python-requirements.yml @@ -15,6 +15,7 @@ jobs: uses: openedx/.github/.github/workflows/upgrade-python-requirements.yml@master with: branch: ${{ github.event.inputs.branch || 'main' }} + python_version: "3.12" # optional parameters below; fill in if you'd like github or email notifications # user_reviewers: "" # team_reviewers: "" diff --git a/Dockerfile b/Dockerfile index 3a002419..8d2bdc03 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,25 +24,50 @@ MAINTAINER sre@edx.org # make; necessary to provision the container +# ENV variables for Python 3.12 support +ARG PYTHON_VERSION=3.12 +ENV TZ=UTC +ENV TERM=xterm-256color +ENV DEBIAN_FRONTEND=noninteractive + +# software-properties-common is needed to setup Python 3.12 env +RUN apt-get update && \ + apt-get install -y software-properties-common && \ + apt-add-repository -y ppa:deadsnakes/ppa + # If you add a package here please include a comment above describing what it is used for RUN apt-get update && apt-get -qy install --no-install-recommends \ + build-essential \ language-pack-en \ locales \ - python3.8 \ - python3-pip \ libmysqlclient-dev \ pkg-config \ libssl-dev \ - python3-dev \ gcc \ make \ - git + git \ + curl \ + python3-pip \ + python${PYTHON_VERSION} \ + python${PYTHON_VERSION}-dev \ + python${PYTHON_VERSION}-distutils +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN pip install --upgrade pip setuptools # delete apt package lists because we do not need them inflating our image RUN rm -rf /var/lib/apt/lists/* +# need to use virtualenv pypi package with Python 3.12 +RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION} +RUN pip install virtualenv + +# Create virtual environment with Python 3.12 +ENV VIRTUAL_ENV=/edx/venvs/edx-exams +RUN virtualenv -p python${PYTHON_VERSION} $VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +# python is python3 RUN ln -s /usr/bin/python3 /usr/bin/python RUN locale-gen en_US.UTF-8 diff --git a/docs/conf.py b/docs/conf.py index e9ec72fd..d5bb3ea3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -15,8 +15,9 @@ import re import sys from subprocess import check_call +import datetime -import edx_theme +import sphinx_book_theme def get_version(*file_paths): @@ -59,7 +60,7 @@ def get_version(*file_paths): # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'edx_theme', + 'sphinx_book_theme', 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', @@ -90,8 +91,8 @@ def get_version(*file_paths): # General information about the project. project = 'edx_exams' -copyright = edx_theme.COPYRIGHT # pylint: disable=redefined-builtin -author = edx_theme.AUTHOR +copyright = '{year}, edX Inc.'.format(year=datetime.datetime.now().year) # pylint: disable=redefined-builtin +author = 'edx-org' project_title = 'edx_exams' documentation_title = f"{project_title}" @@ -172,7 +173,7 @@ def get_version(*file_paths): # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'edx_theme' +html_theme = 'sphinx_book_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -180,9 +181,6 @@ def get_version(*file_paths): # # html_theme_options = {} -# Add any paths that contain custom themes here, relative to this directory. -html_theme_path = [edx_theme.get_html_theme_path()] - # The name for this set of Sphinx documents. # " v documentation" by default. # diff --git a/edx_exams/apps/api/v1/tests/test_views.py b/edx_exams/apps/api/v1/tests/test_views.py index e683fa28..462dceb2 100644 --- a/edx_exams/apps/api/v1/tests/test_views.py +++ b/edx_exams/apps/api/v1/tests/test_views.py @@ -1789,16 +1789,18 @@ def setUp(self): course_id=self.course_id, ) - def request_api(self, method, user, course_id, data=None): + def request_api(self, method, user, course_id, data=None, allowance_id=None): """ Helper function to make API request """ - assert method in ['get', 'post'] + assert method in ['get', 'post', 'delete'] headers = self.build_jwt_headers(user) url = reverse( 'api:v1:course-allowances', kwargs={'course_id': course_id} ) + if allowance_id: + url = f'{url}/{allowance_id}' if data: return getattr(self.client, method)(url, json.dumps(data), **headers, content_type='application/json') @@ -1878,6 +1880,38 @@ def test_get_empty_response(self): self.assertEqual(response.status_code, 200) self.assertEqual(response.data, []) + def test_delete(self): + """ + Test that the endpoint deletes an allowance + """ + allowance = StudentAllowanceFactory.create( + exam=self.exam, + user=self.user, + ) + + response = self.request_api('delete', self.user, self.exam.course_id, allowance_id=allowance.id) + self.assertEqual(response.status_code, 204) + self.assertFalse(StudentAllowance.objects.filter(id=allowance.id).exists()) + + def test_delete_not_found(self): + """ + Test that 404 is returned if allowance does not exist + """ + response = self.request_api('delete', self.user, self.exam.course_id, allowance_id=19) + self.assertEqual(response.status_code, 404) + + def test_delete_not_allowed(self): + """ + Test that 404 is returned if the allowance is not for the authorized course + """ + other_course_id = 'course-v1:edx+another+course' + allowance = StudentAllowanceFactory.create( + exam=ExamFactory.create(course_id=other_course_id), + user=self.user, + ) + response = self.request_api('delete', self.user, self.exam.course_id, allowance_id=allowance.id) + self.assertEqual(response.status_code, 404) + def test_post_allowances(self): """ Test that the endpoint creates allowances for the given request data @@ -1927,7 +1961,7 @@ def test_post_invalid_field_value(self): response = self.request_api('post', self.user, self.exam.course_id, data=request_data) self.assertEqual(response.status_code, 400) - def test_post_invalid_missing_user(self): + def test_post_missing_user(self): """ Test that 400 response is returned if serializer is invalid due to missing required field """ @@ -1936,3 +1970,28 @@ def test_post_invalid_missing_user(self): ] response = self.request_api('post', self.user, self.exam.course_id, data=request_data) self.assertEqual(response.status_code, 400) + + def test_post_invalid_user(self): + """ + Test that 400 response is returned if a username/email does not exist + """ + request_data = [ + {'exam_id': self.exam.id, 'username': 'junk', 'extra_time_mins': 45}, + ] + response = self.request_api('post', self.user, self.exam.course_id, data=request_data) + self.assertEqual(response.status_code, 400) + + def test_post_unauthorized_course(self): + """ + Test that an error is returned when atttempting to create an allowance for + an exam in a different course. + """ + other_course_id = 'course-v1:edx+another+course' + other_course_exam = ExamFactory.create(course_id=other_course_id) + + request_data = [ + {'exam_id': self.exam.id, 'username': self.user.username, 'extra_time_mins': 45}, + {'exam_id': other_course_exam.id, 'username': self.user.username, 'extra_time_mins': 45}, + ] + response = self.request_api('post', self.user, self.exam.course_id, data=request_data) + self.assertEqual(response.status_code, 400) diff --git a/edx_exams/apps/api/v1/urls.py b/edx_exams/apps/api/v1/urls.py index e5720f18..73db0061 100644 --- a/edx_exams/apps/api/v1/urls.py +++ b/edx_exams/apps/api/v1/urls.py @@ -19,6 +19,11 @@ app_name = 'v1' urlpatterns = [ + re_path( + fr'exams/course_id/{COURSE_ID_PATTERN}/allowances/(?P\d+)', + AllowanceView.as_view(), + name='course-allowance' + ), re_path( fr'exams/course_id/{COURSE_ID_PATTERN}/allowances', AllowanceView.as_view(), diff --git a/edx_exams/apps/api/v1/views.py b/edx_exams/apps/api/v1/views.py index 8f40e044..9a07dff8 100644 --- a/edx_exams/apps/api/v1/views.py +++ b/edx_exams/apps/api/v1/views.py @@ -828,7 +828,21 @@ def get(self, request, course_id): allowances = StudentAllowance.get_allowances_for_course(course_id) return Response(AllowanceSerializer(allowances, many=True).data) - def post(self, request, course_id): # pylint: disable=unused-argument + def delete(self, request, course_id, allowance_id): + """ + HTTP DELETE handler. Deletes all allowances for a course. + """ + try: + StudentAllowance.objects.get(id=allowance_id, exam__course_id=course_id).delete() + except StudentAllowance.DoesNotExist: + return Response( + status=status.HTTP_404_NOT_FOUND, + data={'detail': f'Allowance with id={allowance_id} does not exist.'} + ) + + return Response(status=status.HTTP_204_NO_CONTENT) + + def post(self, request, course_id): """ HTTP POST handler. Creates allowances based on the given list. """ @@ -840,24 +854,31 @@ def post(self, request, course_id): # pylint: disable=unused-argument # We expect the number of allowances in each request to be small. Should they increase, # we should not query within the loop, and instead refactor this to optimize # the DB calls. - allowance_objects = [ - StudentAllowance( - user=( - User.objects.get(username=allowance['username']) - if allowance.get('username') - else User.objects.get(email=allowance['email']) - ), - exam=Exam.objects.get(id=allowance['exam_id']), - extra_time_mins=allowance['extra_time_mins'] + try: + allowance_objects = [ + StudentAllowance( + user=( + User.objects.get(username=allowance['username']) + if allowance.get('username') + else User.objects.get(email=allowance['email']) + ), + exam=Exam.objects.get(id=allowance['exam_id'], course_id=course_id), + extra_time_mins=allowance['extra_time_mins'] + ) + for allowance in allowances + ] + except Exam.DoesNotExist: + return Response( + status=status.HTTP_400_BAD_REQUEST, + data={'detail': 'Exam does not exist'} ) - for allowance in allowances - ] - StudentAllowance.objects.bulk_create( - allowance_objects, - update_conflicts=True, - unique_fields=['user', 'exam'], - update_fields=['extra_time_mins'] - ) + except User.DoesNotExist: + return Response( + status=status.HTTP_400_BAD_REQUEST, + data={'detail': 'Learner with username/email not found'} + ) + + StudentAllowance.bulk_create_or_update(allowance_objects) return Response(status=status.HTTP_200_OK) else: diff --git a/edx_exams/apps/core/api.py b/edx_exams/apps/core/api.py index d5c98791..11aac2ab 100644 --- a/edx_exams/apps/core/api.py +++ b/edx_exams/apps/core/api.py @@ -99,8 +99,11 @@ def update_attempt_status(attempt_id, to_status): if not allowed_to_start: raise ExamIllegalStatusTransition(error_msg) - attempt_obj.start_time = datetime.now(pytz.UTC) - attempt_obj.allowed_time_limit_mins = _calculate_allowed_mins(attempt_obj.user, attempt_obj.exam) + # Once start time, and end time by extension, has been set further transitions to started + # must not update this value + if not attempt_obj.start_time: + attempt_obj.start_time = datetime.now(pytz.UTC) + attempt_obj.allowed_time_limit_mins = _calculate_allowed_mins(attempt_obj.user, attempt_obj.exam) course_key = CourseKey.from_string(attempt_obj.exam.course_id) usage_key = UsageKey.from_string(attempt_obj.exam.content_id) diff --git a/edx_exams/apps/core/constants.py b/edx_exams/apps/core/constants.py index 8159d000..894f12be 100644 --- a/edx_exams/apps/core/constants.py +++ b/edx_exams/apps/core/constants.py @@ -18,3 +18,5 @@ class Status: USAGE_KEY_PATTERN = r'(?P(?:i4x://?[^/]+/[^/]+/[^/]+/[^@]+(?:@[^/]+)?)|(?:[^/]+))' EXAM_ID_PATTERN = r'(?P\d+)' + +ATTEMPT_ID_PATTERN = r'(?P\d+)' diff --git a/edx_exams/apps/core/management/commands/bulk_add_course_staff.py b/edx_exams/apps/core/management/commands/bulk_add_course_staff.py index 23204ea0..f6960832 100644 --- a/edx_exams/apps/core/management/commands/bulk_add_course_staff.py +++ b/edx_exams/apps/core/management/commands/bulk_add_course_staff.py @@ -4,7 +4,7 @@ import time from django.core.management.base import BaseCommand -from django.db import transaction +from django.db import IntegrityError, transaction from edx_exams.apps.core.models import CourseStaffRole, User @@ -63,32 +63,31 @@ def add_course_staff_from_csv(self, csv_file, batch_size, batch_delay): Add the given set of course staff provided in csv """ reader = list(csv.DictReader(csv_file)) - users_to_create = [] - users_existing = {u.username for u in User.objects.filter(username__in=[r.get('username') for r in reader])} - for row in reader: - if row.get('username') not in users_existing: - users_to_create.append(row) - users_existing.add(row.get('username')) + users = {} - # bulk create users - for i in range(0, len(users_to_create), batch_size): - User.objects.bulk_create( - User( - username=user.get('username'), - email=user.get('email'), - ) - for user in users_to_create[i:i + batch_size] - ) - time.sleep(batch_delay) - - # bulk create course staff for i in range(0, len(reader), batch_size): - CourseStaffRole.objects.bulk_create( - CourseStaffRole( - user=User.objects.get(username=row.get('username')), - course_id=row.get('course_id'), - role=row.get('role'), - ) - for row in reader[i:i + batch_size] - ) + users_list = [] + for row in reader[i:i + batch_size]: + username = row.get('username') + email = row.get('email') + try: + users_list.append(User.objects.get_or_create(username=row.get('username'), email=row.get('email'))) + except IntegrityError: + logger.warning( + f'User with username={username} and email={email} was not created due to an existing duplicate ' + f'user with username.' + ) + continue + users_dict = {(u.username, u) for (u, c) in users_list} + users.update(users_dict) time.sleep(batch_delay) + + CourseStaffRole.objects.bulk_create( + (CourseStaffRole( + user=users.get(row.get('username')), + course_id=row.get('course_id'), + role=row.get('role'), + ) for row in reader), + ignore_conflicts=True, + batch_size=batch_size, + ) diff --git a/edx_exams/apps/core/management/commands/test/test_bulk_add_course_staff.py b/edx_exams/apps/core/management/commands/test/test_bulk_add_course_staff.py index 0b6e80e7..edf3b8b5 100644 --- a/edx_exams/apps/core/management/commands/test/test_bulk_add_course_staff.py +++ b/edx_exams/apps/core/management/commands/test/test_bulk_add_course_staff.py @@ -5,7 +5,7 @@ from django.test import TestCase from edx_exams.apps.core.models import CourseStaffRole, User -from edx_exams.apps.core.test_utils.factories import UserFactory +from edx_exams.apps.core.test_utils.factories import CourseStaffRoleFactory, UserFactory class TestBulkAddCourseStaff(TestCase): @@ -90,9 +90,28 @@ def test_add_course_staff_with_not_default_batch_size(self): 'sam,sam@pond.com,staff,course-v1:edx+test+f20\n'] with NamedTemporaryFile() as csv: csv = self._write_test_csv(csv, lines) - with self.assertNumQueries(9): + with self.assertNumQueries(12): call_command(self.command, f'--csv_path={csv.name}', '--batch_size=1') + def test_add_course_staff_with_batch_size_larger_than_list(self): + """ Assert that the number of queries is correct given batch size larger than lines """ + lines = ['pam,pam@pond.com,staff,course-v1:edx+test+f20\n', + 'sam,sam@pond.com,staff,course-v1:edx+test+f20\n'] + with NamedTemporaryFile() as csv: + csv = self._write_test_csv(csv, lines) + with self.assertNumQueries(11): + call_command(self.command, f'--csv_path={csv.name}', '--batch_size=3') + + def test_add_course_staff_with_batch_size_smaller_than_list(self): + """ Assert that the number of queries is correct given batch size smaller than lines """ + lines = ['pam,pam@pond.com,staff,course-v1:edx+test+f20\n', + 'sam,sam@pond.com,staff,course-v1:edx+test+f20\n' + 'tam,tam@pond.com,staff,course-v1:edx+test+f20\n'] + with NamedTemporaryFile() as csv: + csv = self._write_test_csv(csv, lines) + with self.assertNumQueries(16): + call_command(self.command, f'--csv_path={csv.name}', '--batch_size=2') + def test_add_course_staff_with_not_default_batch_delay(self): username, email = 'pam', 'pam@pond.com' username2, email2 = 'cam', 'cam@pond.com' @@ -106,16 +125,16 @@ def test_add_course_staff_with_not_default_batch_delay(self): def test_num_queries_correct(self): """ - Assert the number of queries to be 5 + 1 * number of lines: - 2 for savepoint/release savepoint, 1 to get existing usernames, - 1 to bulk create users, 1 to bulk create course role - 1 for each user (to get user) + Assert the number of queries to be 2 + 1 * number of lines: + 2 for savepoint/release savepoint + 1 to bulk create course role + 4 for each user (to get user, and savepoints) """ num_lines = 20 lines = [f'pam{i},pam{i}@pond.com,staff,course-v1:edx+test+f20\n' for i in range(num_lines)] with NamedTemporaryFile() as csv: csv = self._write_test_csv(csv, lines) - with self.assertNumQueries(5 + num_lines): + with self.assertNumQueries(3 + 4 * num_lines): call_command(self.command, f'--csv_path={csv.name}') def test_dupe_user_csv(self): @@ -130,3 +149,32 @@ def test_dupe_user_csv(self): call_command(self.command, f'--csv_path={csv.name}') self._assert_user_and_role(username, email, self.course_role, self.course_id) self._assert_user_and_role(username, email, self.course_role, course_id_2) + + def test_existing_course_staff_csv(self): + """ Assert that the course staff role are correctly created given already existing course staff roles in csv """ + course_existing = 'course-v1:edx+test+f24' + CourseStaffRoleFactory.create( + user=self.user, + course_id=course_existing, + role=self.course_role, + ) + lines = [f'{self.user.username},{self.user.email},{self.course_role},{course_existing}\n'] + with NamedTemporaryFile() as csv: + csv = self._write_test_csv(csv, lines) + call_command(self.command, f'--csv_path={csv.name}') + self._assert_user_and_role(self.user.username, self.user.email, self.course_role, course_existing) + + def test_dupe_course_staff_csv(self): + """ Assert that the course staff role are correctly created given dupe course staff roles in csv """ + course_existing = 'course-v1:edx+test+f24' + CourseStaffRoleFactory.create( + user=self.user, + course_id=course_existing, + role=self.course_role, + ) + lines = [f'{self.user.username},{self.user.email},{self.course_role},{course_existing}\n', + f'{self.user.username},{self.user.email},{self.course_role},{course_existing}\n'] + with NamedTemporaryFile() as csv: + csv = self._write_test_csv(csv, lines) + call_command(self.command, f'--csv_path={csv.name}') + self._assert_user_and_role(self.user.username, self.user.email, self.course_role, course_existing) diff --git a/edx_exams/apps/core/migrations/0028_admin_optional_fields.py b/edx_exams/apps/core/migrations/0028_admin_optional_fields.py new file mode 100644 index 00000000..d3995b8c --- /dev/null +++ b/edx_exams/apps/core/migrations/0028_admin_optional_fields.py @@ -0,0 +1,63 @@ +# Generated by Django 4.2.13 on 2024-08-21 13:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0027_coursestaffrole_unique_course_staff_role'), + ] + + operations = [ + migrations.AlterField( + model_name='exam', + name='due_date', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='examattempt', + name='end_time', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='examattempt', + name='start_time', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='historicalexam', + name='due_date', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='historicalexamattempt', + name='end_time', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='historicalexamattempt', + name='start_time', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='proctoringprovider', + name='org_key', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AlterField( + model_name='proctoringprovider', + name='tech_support_email', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AlterField( + model_name='proctoringprovider', + name='tech_support_phone', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AlterField( + model_name='proctoringprovider', + name='tech_support_url', + field=models.URLField(blank=True, max_length=255, null=True), + ), + ] diff --git a/edx_exams/apps/core/models.py b/edx_exams/apps/core/models.py index dd8d805d..6c25079d 100644 --- a/edx_exams/apps/core/models.py +++ b/edx_exams/apps/core/models.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import AbstractUser from django.core.exceptions import ObjectDoesNotExist -from django.db import models, transaction +from django.db import connection, models, transaction from django.db.models import Q from django.utils.translation import gettext_lazy as _ from model_utils.models import TimeStampedModel @@ -92,13 +92,13 @@ class ProctoringProvider(TimeStampedModel): lti_configuration_id = models.CharField(max_length=255, db_index=True) - org_key = models.CharField(max_length=255, null=True) + org_key = models.CharField(max_length=255, null=True, blank=True) - tech_support_phone = models.CharField(max_length=255, null=True) + tech_support_phone = models.CharField(max_length=255, null=True, blank=True) - tech_support_email = models.CharField(max_length=255, null=True) + tech_support_email = models.CharField(max_length=255, null=True, blank=True) - tech_support_url = models.URLField(max_length=255, null=True) + tech_support_url = models.URLField(max_length=255, null=True, blank=True) class Meta: """ Meta class for this Django model """ @@ -140,7 +140,7 @@ class Exam(TimeStampedModel): time_limit_mins = models.PositiveIntegerField() # Due date is a deadline to finish the exam - due_date = models.DateTimeField(null=True) + due_date = models.DateTimeField(null=True, blank=True) # Whether to hide this exam after the due date hide_after_due = models.BooleanField(default=False) @@ -208,9 +208,9 @@ class ExamAttempt(TimeStampedModel): status = models.CharField(max_length=64, choices=[(status, status) for status in STATUS_CHOICES]) - start_time = models.DateTimeField(null=True) + start_time = models.DateTimeField(null=True, blank=True) - end_time = models.DateTimeField(null=True) + end_time = models.DateTimeField(null=True, blank=True) allowed_time_limit_mins = models.IntegerField(null=True) @@ -454,6 +454,26 @@ class Meta: verbose_name = 'student allowance' unique_together = ('user', 'exam') + @classmethod + def bulk_create_or_update(cls, allowances): + """ + Create or update multiple allowances. + + SQLite and Postgres have an additional requirement for bulk_create + when using update_conflicts=True. This app expects to run on MySQL + however our tests run on SQLite where 'unique_fields' is needed. + """ + unique_fields = None + if connection.features.supports_update_conflicts_with_target: + unique_fields = ['user', 'exam'] + + cls.objects.bulk_create( + allowances, + update_conflicts=True, + unique_fields=unique_fields, + update_fields=['extra_time_mins'], + ) + @classmethod def get_allowances_for_course(cls, course_id): """ diff --git a/edx_exams/apps/core/signals/handlers.py b/edx_exams/apps/core/signals/handlers.py index 8d5e0345..b4af85b1 100644 --- a/edx_exams/apps/core/signals/handlers.py +++ b/edx_exams/apps/core/signals/handlers.py @@ -23,10 +23,7 @@ def listen_for_course_access_role_added(sender, signal, **kwargs): # pylint: di if role not in COURSE_STAFF_ROLES: return - user, _ = User.objects.get_or_create( - username=user_data.pii.username, - email=user_data.pii.email, - ) + user, _ = User.objects.get_or_create(username=user_data.pii.username) CourseStaffRole.objects.get_or_create( user=user, course_id=course_key, diff --git a/edx_exams/apps/core/tests/test_api.py b/edx_exams/apps/core/tests/test_api.py index 718247ea..299697f7 100644 --- a/edx_exams/apps/core/tests/test_api.py +++ b/edx_exams/apps/core/tests/test_api.py @@ -407,6 +407,21 @@ def test_cannot_start_if_other_attempts_active(self): update_attempt_status(self.exam_attempt.id, ExamAttemptStatus.started) self.assertIn('another exam attempt is currently active!', str(exc.exception)) + def test_ready_to_submit_to_started(self): + """ + Test transition to started after initial start time has been set. This should not + alter the existing start time. + """ + with freeze_time(timezone.now()): + self.exam_attempt.status = ExamAttemptStatus.ready_to_submit + self.exam_attempt.start_time = timezone.now()-timedelta(minutes=10) + self.exam_attempt.allowed_time_limit_mins = 30 + self.exam_attempt.save() + + update_attempt_status(self.exam_attempt.id, ExamAttemptStatus.started) + self.exam_attempt.refresh_from_db() + self.assertEqual(self.exam_attempt.start_time, timezone.now()-timedelta(minutes=10)) + class TestGetAttemptById(ExamsAPITestCase): """ diff --git a/edx_exams/apps/core/tests/test_handlers.py b/edx_exams/apps/core/tests/test_handlers.py index 9d81adb5..e1925fd0 100644 --- a/edx_exams/apps/core/tests/test_handlers.py +++ b/edx_exams/apps/core/tests/test_handlers.py @@ -155,3 +155,29 @@ def test_course_access_role_remove_single_role(self): roles, ['instructor'] ) + + def test_course_access_role_email_change(self): + """ + Test that if a user updates their email, additional course staff roles are able to be added. + """ + role_event_data = self._get_event_data(self.course_id, self.existing_user.username, 'staff') + event_metadata = self._get_event_metadata(COURSE_ACCESS_ROLE_ADDED) + event_kwargs = { + 'course_access_role_data': role_event_data, + 'metadata': event_metadata, + } + listen_for_course_access_role_added(None, COURSE_ACCESS_ROLE_ADDED, **event_kwargs) + + self.existing_user.email = 'updated_email@example.com' + self.existing_user.save() + + other_course = 'course-v1:another-course-2024' + role_event_data = self._get_event_data(other_course, self.existing_user.username, 'staff') + event_metadata = self._get_event_metadata(COURSE_ACCESS_ROLE_ADDED) + event_kwargs = { + 'course_access_role_data': role_event_data, + 'metadata': event_metadata, + } + listen_for_course_access_role_added(None, COURSE_ACCESS_ROLE_ADDED, **event_kwargs) + + self.assertEqual(len(CourseStaffRole.objects.filter(user=self.existing_user)), 2) diff --git a/edx_exams/apps/core/tests/test_models.py b/edx_exams/apps/core/tests/test_models.py index 9836f2cc..342963b8 100644 --- a/edx_exams/apps/core/tests/test_models.py +++ b/edx_exams/apps/core/tests/test_models.py @@ -148,6 +148,24 @@ def setUp(self): self.course_id = 'course-v1:edX+Test+Test_Course' self.exam = ExamFactory(course_id=self.course_id) + def test_bulk_create_or_update(self): + """ + Test bulk_create_or_update can create new allowances and update existing ones. + """ + conflict_user = UserFactory() + conflict_allowance = StudentAllowanceFactory(user=conflict_user, exam=self.exam, extra_time_mins=66) + allowances = [ + StudentAllowance(user=conflict_user, exam=self.exam, extra_time_mins=19), + StudentAllowance(user=UserFactory(), exam=self.exam, extra_time_mins=29), + StudentAllowance(user=UserFactory(), exam=self.exam, extra_time_mins=39), + ] + + self.assertEqual(StudentAllowance.objects.count(), 1) + StudentAllowance.bulk_create_or_update(allowances) + self.assertEqual(StudentAllowance.objects.count(), 3) + conflict_allowance.refresh_from_db() + self.assertEqual(conflict_allowance.extra_time_mins, 19) + def test_get_allowance_for_user(self): user = UserFactory() user_2 = UserFactory() diff --git a/edx_exams/settings/local.py b/edx_exams/settings/local.py index 61150a15..a5ed0f94 100644 --- a/edx_exams/settings/local.py +++ b/edx_exams/settings/local.py @@ -130,6 +130,12 @@ EXAMS_DASHBOARD_MFE_URL, ) +CSRF_TRUSTED_ORIGINS = ( + 'http://localhost:2001', + LEARNING_MICROFRONTEND_URL, + EXAMS_DASHBOARD_MFE_URL, +) + ALLOWED_HOSTS = ['*'] ##################################################################### diff --git a/requirements/base.txt b/requirements/base.txt index 2aef705f..dcbf9bb7 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -10,28 +10,22 @@ asgiref==3.8.1 # via # django # django-cors-headers -async-timeout==4.0.3 - # via redis -attrs==23.2.0 +attrs==24.2.0 # via # -r requirements/base.in # lti-consumer-xblock # openedx-events -backports-zoneinfo==0.2.1 - # via - # django - # djangorestframework bleach==6.1.0 # via lti-consumer-xblock -boto3==1.34.149 +boto3==1.35.22 # via fs-s3fs -botocore==1.34.149 +botocore==1.35.22 # via # boto3 # s3transfer -certifi==2024.7.4 +certifi==2024.8.30 # via requests -cffi==1.16.0 +cffi==1.17.1 # via # cryptography # pynacl @@ -49,7 +43,7 @@ coreapi==2.3.3 # openapi-codec coreschema==0.0.4 # via coreapi -cryptography==43.0.0 +cryptography==43.0.1 # via # pyjwt # social-auth-core @@ -57,7 +51,7 @@ defusedxml==0.8.0rc2 # via # python3-openid # social-auth-core -django==4.2.14 +django==4.2.16 # via # -c requirements/common_constraints.txt # -r requirements/base.in @@ -101,9 +95,9 @@ django-crum==0.7.9 # edx-toggles django-extensions==3.2.3 # via -r requirements/base.in -django-filter==24.2 +django-filter==24.3 # via lti-consumer-xblock -django-model-utils==4.5.1 +django-model-utils==5.0.0 # via -r requirements/base.in django-rest-swagger==2.2.0 # via -r requirements/base.in @@ -132,9 +126,9 @@ drf-jwt==1.19.2 # via edx-drf-extensions drf-yasg==1.21.7 # via edx-api-doc-tools -edx-api-doc-tools==1.8.0 +edx-api-doc-tools==2.0.0 # via -r requirements/base.in -edx-auth-backends==4.3.0 +edx-auth-backends==4.4.0 # via -r requirements/base.in edx-ccx-keys==1.3.0 # via @@ -142,7 +136,7 @@ edx-ccx-keys==1.3.0 # openedx-events edx-django-release-util==1.4.0 # via -r requirements/base.in -edx-django-utils==5.14.2 +edx-django-utils==5.15.0 # via # -r requirements/base.in # django-config-models @@ -152,20 +146,20 @@ edx-django-utils==5.14.2 # edx-rest-api-client # edx-toggles # openedx-events -edx-drf-extensions==10.3.0 +edx-drf-extensions==10.4.0 # via -r requirements/base.in -edx-event-bus-kafka==5.7.0 +edx-event-bus-kafka==5.8.1 # via -r requirements/base.in edx-event-bus-redis==0.5.0 # via -r requirements/base.in -edx-opaque-keys[django]==2.10.0 +edx-opaque-keys[django]==2.11.0 # via # -r requirements/base.in # edx-ccx-keys # edx-drf-extensions # lti-consumer-xblock # openedx-events -edx-rest-api-client==5.7.1 +edx-rest-api-client==6.0.0 # via -r requirements/base.in edx-toggles==5.2.0 # via @@ -173,7 +167,7 @@ edx-toggles==5.2.0 # edx-event-bus-redis edx-token-utils==0.2.1 # via -r requirements/base.in -fastavro==1.9.5 +fastavro==1.9.7 # via openedx-events fs==2.4.16 # via @@ -184,7 +178,7 @@ fs-s3fs==1.1.1 # via openedx-django-pyfs future==1.0.0 # via pyjwkest -idna==3.7 +idna==3.10 # via requests inflection==0.5.1 # via drf-yasg @@ -204,7 +198,7 @@ lazy==1.6 # via lti-consumer-xblock lti-consumer-xblock==9.11.3 # via -r requirements/base.in -lxml==5.2.2 +lxml==5.3.0 # via # lti-consumer-xblock # xblock @@ -219,7 +213,7 @@ markupsafe==2.1.5 # xblock mysqlclient==2.2.4 # via -r requirements/base.in -newrelic==9.12.0 +newrelic==9.13.0 # via edx-django-utils oauthlib==3.2.2 # via @@ -228,9 +222,9 @@ oauthlib==3.2.2 # social-auth-core openapi-codec==1.3.2 # via django-rest-swagger -openedx-django-pyfs==3.6.0 +openedx-django-pyfs==3.7.0 # via lti-consumer-xblock -openedx-events==9.11.0 +openedx-events==9.14.1 # via # -r requirements/base.in # edx-event-bus-kafka @@ -239,7 +233,7 @@ openedx-filters==1.9.0 # via lti-consumer-xblock packaging==24.1 # via drf-yasg -pbr==6.0.0 +pbr==6.1.0 # via stevedore psutil==6.0.0 # via edx-django-utils @@ -253,7 +247,7 @@ pyjwkest==1.4.2 # via # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # drf-jwt # edx-auth-backends @@ -262,7 +256,7 @@ pyjwt[crypto]==2.8.0 # social-auth-core pymemcache==4.0.0 # via -r requirements/base.in -pymongo==4.8.0 +pymongo==4.9.1 # via edx-opaque-keys pynacl==1.5.0 # via edx-django-utils @@ -274,18 +268,18 @@ python-slugify==8.0.4 # via code-annotations python3-openid==3.2.0 # via social-auth-core -pytz==2024.1 +pytz==2024.2 # via # -r requirements/base.in # drf-yasg # xblock -pyyaml==6.0.1 +pyyaml==6.0.2 # via # code-annotations # drf-yasg # edx-django-release-util # xblock -redis==5.0.7 +redis==5.0.8 # via walrus requests==2.32.3 # via @@ -294,7 +288,6 @@ requests==2.32.3 # edx-rest-api-client # pyjwkest # requests-oauthlib - # slumber # social-auth-core requests-oauthlib==2.0.0 # via social-auth-core @@ -302,7 +295,7 @@ s3transfer==0.10.2 # via boto3 semantic-version==2.10.0 # via edx-drf-extensions -simplejson==3.19.2 +simplejson==3.19.3 # via # django-rest-swagger # xblock @@ -316,8 +309,6 @@ six==1.16.0 # fs-s3fs # pyjwkest # python-dateutil -slumber==0.7.1 - # via edx-rest-api-client social-auth-app-django==5.4.2 # via edx-auth-backends social-auth-core==4.5.4 @@ -326,7 +317,7 @@ social-auth-core==4.5.4 # social-auth-app-django sqlparse==0.5.1 # via django -stevedore==5.2.0 +stevedore==5.3.0 # via # code-annotations # edx-django-utils @@ -334,14 +325,12 @@ stevedore==5.2.0 text-unidecode==1.3 # via python-slugify typing-extensions==4.12.2 - # via - # asgiref - # edx-opaque-keys + # via edx-opaque-keys uritemplate==4.1.1 # via # coreapi # drf-yasg -urllib3==1.26.19 +urllib3==2.2.3 # via # botocore # requests @@ -351,9 +340,9 @@ web-fragments==2.2.0 # via xblock webencodings==0.5.1 # via bleach -webob==1.8.7 +webob==1.8.8 # via xblock -xblock==5.0.0 +xblock==5.1.0 # via lti-consumer-xblock # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/ci.txt b/requirements/ci.txt index 4757e860..dd7ec7e0 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -1,20 +1,20 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -cachetools==5.4.0 +cachetools==5.5.0 # via tox chardet==5.2.0 # via tox colorama==0.4.6 # via tox -coverage==7.6.0 +coverage==7.6.1 # via -r requirements/ci.in distlib==0.3.8 # via virtualenv -filelock==3.15.4 +filelock==3.16.1 # via # tox # virtualenv @@ -22,19 +22,15 @@ packaging==24.1 # via # pyproject-api # tox -platformdirs==4.2.2 +platformdirs==4.3.6 # via # tox # virtualenv pluggy==1.5.0 # via tox -pyproject-api==1.7.1 +pyproject-api==1.8.0 # via tox -tomli==2.0.1 - # via - # pyproject-api - # tox -tox==4.16.0 +tox==4.20.0 # via -r requirements/ci.in -virtualenv==20.26.3 +virtualenv==20.26.5 # via tox diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt index 16b6bd8a..fc95227a 100644 --- a/requirements/common_constraints.txt +++ b/requirements/common_constraints.txt @@ -24,15 +24,6 @@ elasticsearch<7.14.0 # django-simple-history>3.0.0 adds indexing and causes a lot of migrations to be affected -# opentelemetry requires version 6.x at the moment: -# https://github.com/open-telemetry/opentelemetry-python/issues/3570 -# Normally this could be added as a constraint in edx-django-utils, where we're -# adding the opentelemetry dependency. However, when we compile pip-tools.txt, -# that uses version 7.x, and then there's no undoing that when compiling base.txt. -# So we need to pin it globally, for now. -# Ticket for unpinning: https://github.com/openedx/edx-lint/issues/407 -importlib-metadata<7 - # Cause: https://github.com/openedx/event-tracking/pull/290 # event-tracking 2.4.1 upgrades to pymongo 4.4.0 which is not supported on edx-platform. # We will pin event-tracking to do not break existing installations diff --git a/requirements/dev.txt b/requirements/dev.txt index a7655a7e..29237289 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -18,50 +18,37 @@ astroid==3.2.4 # -r requirements/validation.txt # pylint # pylint-celery -async-timeout==4.0.3 - # via - # -r requirements/validation.txt - # redis -attrs==23.2.0 +attrs==24.2.0 # via # -r requirements/validation.txt # lti-consumer-xblock # openedx-events -backports-tarfile==1.2.0 - # via - # -r requirements/validation.txt - # jaraco-context -backports-zoneinfo==0.2.1 - # via - # -r requirements/validation.txt - # django - # djangorestframework bleach==6.1.0 # via # -r requirements/validation.txt # lti-consumer-xblock -boto3==1.34.149 +boto3==1.35.22 # via # -r requirements/validation.txt # fs-s3fs -botocore==1.34.149 +botocore==1.35.22 # via # -r requirements/validation.txt # boto3 # s3transfer -build==1.2.1 +build==1.2.2 # via # -r requirements/pip-tools.txt # pip-tools -cachetools==5.4.0 +cachetools==5.5.0 # via # -r requirements/validation.txt # tox -certifi==2024.7.4 +certifi==2024.8.30 # via # -r requirements/validation.txt # requests -cffi==1.16.0 +cffi==1.17.1 # via # -r requirements/validation.txt # cryptography @@ -106,11 +93,11 @@ coreschema==0.0.4 # via # -r requirements/validation.txt # coreapi -coverage[toml]==7.6.0 +coverage[toml]==7.6.1 # via # -r requirements/validation.txt # pytest-cov -cryptography==43.0.0 +cryptography==43.0.1 # via # -r requirements/validation.txt # pyjwt @@ -122,7 +109,7 @@ defusedxml==0.8.0rc2 # -r requirements/validation.txt # python3-openid # social-auth-core -diff-cover==9.1.1 +diff-cover==9.2.0 # via -r requirements/dev.in dill==0.3.8 # via @@ -132,7 +119,7 @@ distlib==0.3.8 # via # -r requirements/validation.txt # virtualenv -django==4.2.14 +django==4.2.16 # via # -r requirements/validation.txt # django-appconf @@ -186,11 +173,11 @@ django-dynamic-fixture==4.0.1 # via -r requirements/validation.txt django-extensions==3.2.3 # via -r requirements/validation.txt -django-filter==24.2 +django-filter==24.3 # via # -r requirements/validation.txt # lti-consumer-xblock -django-model-utils==4.5.1 +django-model-utils==5.0.0 # via -r requirements/validation.txt django-rest-swagger==2.2.0 # via -r requirements/validation.txt @@ -219,7 +206,7 @@ dnspython==2.6.1 # via # -r requirements/validation.txt # pymongo -docutils==0.20.1 +docutils==0.21.2 # via # -r requirements/validation.txt # readme-renderer @@ -231,9 +218,9 @@ drf-yasg==1.21.7 # via # -r requirements/validation.txt # edx-api-doc-tools -edx-api-doc-tools==1.8.0 +edx-api-doc-tools==2.0.0 # via -r requirements/validation.txt -edx-auth-backends==4.3.0 +edx-auth-backends==4.4.0 # via -r requirements/validation.txt edx-ccx-keys==1.3.0 # via @@ -242,7 +229,7 @@ edx-ccx-keys==1.3.0 # openedx-events edx-django-release-util==1.4.0 # via -r requirements/validation.txt -edx-django-utils==5.14.2 +edx-django-utils==5.15.0 # via # -r requirements/validation.txt # django-config-models @@ -252,24 +239,24 @@ edx-django-utils==5.14.2 # edx-rest-api-client # edx-toggles # openedx-events -edx-drf-extensions==10.3.0 +edx-drf-extensions==10.4.0 # via -r requirements/validation.txt -edx-event-bus-kafka==5.7.0 +edx-event-bus-kafka==5.8.1 # via -r requirements/validation.txt edx-event-bus-redis==0.5.0 # via -r requirements/validation.txt -edx-i18n-tools==1.6.0 +edx-i18n-tools==1.6.3 # via -r requirements/dev.in -edx-lint==5.3.7 +edx-lint==5.4.0 # via -r requirements/validation.txt -edx-opaque-keys[django]==2.10.0 +edx-opaque-keys[django]==2.11.0 # via # -r requirements/validation.txt # edx-ccx-keys # edx-drf-extensions # lti-consumer-xblock # openedx-events -edx-rest-api-client==5.7.1 +edx-rest-api-client==6.0.0 # via -r requirements/validation.txt edx-toggles==5.2.0 # via @@ -278,21 +265,17 @@ edx-toggles==5.2.0 # edx-event-bus-redis edx-token-utils==0.2.1 # via -r requirements/validation.txt -exceptiongroup==1.2.2 - # via - # -r requirements/validation.txt - # pytest -factory-boy==3.3.0 +factory-boy==3.3.1 # via -r requirements/validation.txt -faker==26.0.0 +faker==28.4.1 # via # -r requirements/validation.txt # factory-boy -fastavro==1.9.5 +fastavro==1.9.7 # via # -r requirements/validation.txt # openedx-events -filelock==3.15.4 +filelock==3.16.1 # via # -r requirements/validation.txt # tox @@ -313,21 +296,14 @@ future==1.0.0 # via # -r requirements/validation.txt # pyjwkest -idna==3.7 +idna==3.10 # via # -r requirements/validation.txt # requests -importlib-metadata==6.11.0 +importlib-metadata==8.5.0 # via - # -r requirements/pip-tools.txt # -r requirements/validation.txt - # build - # keyring # twine -importlib-resources==6.4.0 - # via - # -r requirements/validation.txt - # keyring inflection==0.5.1 # via # -r requirements/validation.txt @@ -348,11 +324,11 @@ jaraco-classes==3.4.0 # via # -r requirements/validation.txt # keyring -jaraco-context==5.3.0 +jaraco-context==6.0.1 # via # -r requirements/validation.txt # keyring -jaraco-functools==4.0.1 +jaraco-functools==4.0.2 # via # -r requirements/validation.txt # keyring @@ -371,7 +347,7 @@ jsonfield==3.1.0 # via # -r requirements/validation.txt # lti-consumer-xblock -keyring==25.2.1 +keyring==25.4.0 # via # -r requirements/validation.txt # twine @@ -381,14 +357,14 @@ lazy==1.6 # lti-consumer-xblock lti-consumer-xblock==9.11.3 # via -r requirements/validation.txt -lxml[html-clean]==5.2.2 +lxml[html-clean]==5.3.0 # via # -r requirements/validation.txt # edx-i18n-tools # lti-consumer-xblock # lxml-html-clean # xblock -lxml-html-clean==0.1.1 +lxml-html-clean==0.2.2 # via lxml mako==1.3.5 # via @@ -415,14 +391,14 @@ mdurl==0.1.2 # markdown-it-py mock==5.1.0 # via -r requirements/validation.txt -more-itertools==10.3.0 +more-itertools==10.5.0 # via # -r requirements/validation.txt # jaraco-classes # jaraco-functools mysqlclient==2.2.4 # via -r requirements/validation.txt -newrelic==9.12.0 +newrelic==9.13.0 # via # -r requirements/validation.txt # edx-django-utils @@ -440,11 +416,11 @@ openapi-codec==1.3.2 # via # -r requirements/validation.txt # django-rest-swagger -openedx-django-pyfs==3.6.0 +openedx-django-pyfs==3.7.0 # via # -r requirements/validation.txt # lti-consumer-xblock -openedx-events==9.11.0 +openedx-events==9.14.1 # via # -r requirements/validation.txt # edx-event-bus-kafka @@ -462,9 +438,9 @@ packaging==24.1 # pyproject-api # pytest # tox -path==16.14.0 +path==16.16.0 # via edx-i18n-tools -pbr==6.0.0 +pbr==6.1.0 # via # -r requirements/validation.txt # stevedore @@ -474,7 +450,7 @@ pkginfo==1.10.0 # via # -r requirements/validation.txt # twine -platformdirs==4.2.2 +platformdirs==4.3.6 # via # -r requirements/validation.txt # pylint @@ -492,7 +468,7 @@ psutil==6.0.0 # via # -r requirements/validation.txt # edx-django-utils -pycodestyle==2.12.0 +pycodestyle==2.12.1 # via -r requirements/validation.txt pycparser==2.22 # via @@ -516,7 +492,7 @@ pyjwkest==1.4.2 # -r requirements/validation.txt # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/validation.txt # drf-jwt @@ -524,7 +500,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==3.2.6 +pylint==3.2.7 # via # -r requirements/validation.txt # edx-lint @@ -546,7 +522,7 @@ pylint-plugin-utils==0.8.2 # pylint-django pymemcache==4.0.0 # via -r requirements/validation.txt -pymongo==4.8.0 +pymongo==4.9.1 # via # -r requirements/validation.txt # edx-opaque-keys @@ -554,7 +530,7 @@ pynacl==1.5.0 # via # -r requirements/validation.txt # edx-django-utils -pyproject-api==1.7.1 +pyproject-api==1.8.0 # via # -r requirements/validation.txt # tox @@ -563,14 +539,14 @@ pyproject-hooks==1.1.0 # -r requirements/pip-tools.txt # build # pip-tools -pytest==8.3.2 +pytest==8.3.3 # via # -r requirements/validation.txt # pytest-cov # pytest-django pytest-cov==5.0.0 # via -r requirements/validation.txt -pytest-django==4.8.0 +pytest-django==4.9.0 # via -r requirements/validation.txt python-dateutil==2.9.0.post0 # via @@ -587,12 +563,12 @@ python3-openid==3.2.0 # via # -r requirements/validation.txt # social-auth-core -pytz==2024.1 +pytz==2024.2 # via # -r requirements/validation.txt # drf-yasg # xblock -pyyaml==6.0.1 +pyyaml==6.0.2 # via # -r requirements/validation.txt # code-annotations @@ -601,11 +577,11 @@ pyyaml==6.0.1 # edx-i18n-tools # responses # xblock -readme-renderer==43.0 +readme-renderer==44.0 # via # -r requirements/validation.txt # twine -redis==5.0.7 +redis==5.0.8 # via # -r requirements/validation.txt # walrus @@ -619,7 +595,6 @@ requests==2.32.3 # requests-oauthlib # requests-toolbelt # responses - # slumber # social-auth-core # twine requests-oauthlib==2.0.0 @@ -636,7 +611,7 @@ rfc3986==2.0.0 # via # -r requirements/validation.txt # twine -rich==13.7.1 +rich==13.8.1 # via # -r requirements/validation.txt # twine @@ -648,7 +623,7 @@ semantic-version==2.10.0 # via # -r requirements/validation.txt # edx-drf-extensions -simplejson==3.19.2 +simplejson==3.19.3 # via # -r requirements/validation.txt # django-rest-swagger @@ -665,10 +640,6 @@ six==1.16.0 # fs-s3fs # pyjwkest # python-dateutil -slumber==0.7.1 - # via - # -r requirements/validation.txt - # edx-rest-api-client snowballstemmer==2.2.0 # via # -r requirements/validation.txt @@ -687,7 +658,7 @@ sqlparse==0.5.1 # -r requirements/validation.txt # django # django-debug-toolbar -stevedore==5.2.0 +stevedore==5.3.0 # via # -r requirements/validation.txt # code-annotations @@ -697,46 +668,31 @@ text-unidecode==1.3 # via # -r requirements/validation.txt # python-slugify -tomli==2.0.1 - # via - # -r requirements/pip-tools.txt - # -r requirements/validation.txt - # build - # coverage - # pip-tools - # pylint - # pyproject-api - # pytest - # tox -tomlkit==0.13.0 +tomlkit==0.13.2 # via # -r requirements/validation.txt # pylint -tox==4.16.0 +tox==4.20.0 # via -r requirements/validation.txt twine==5.1.1 # via -r requirements/validation.txt typing-extensions==4.12.2 # via # -r requirements/validation.txt - # asgiref - # astroid # edx-opaque-keys - # pylint - # rich uritemplate==4.1.1 # via # -r requirements/validation.txt # coreapi # drf-yasg -urllib3==1.26.19 +urllib3==2.2.3 # via # -r requirements/validation.txt # botocore # requests # responses # twine -virtualenv==20.26.3 +virtualenv==20.26.5 # via # -r requirements/validation.txt # tox @@ -752,24 +708,22 @@ webencodings==0.5.1 # via # -r requirements/validation.txt # bleach -webob==1.8.7 +webob==1.8.8 # via # -r requirements/validation.txt # xblock -wheel==0.43.0 +wheel==0.44.0 # via # -r requirements/pip-tools.txt # pip-tools -xblock==5.0.0 +xblock==5.1.0 # via # -r requirements/validation.txt # lti-consumer-xblock -zipp==3.19.2 +zipp==3.20.2 # via - # -r requirements/pip-tools.txt # -r requirements/validation.txt # importlib-metadata - # importlib-resources # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/django.txt b/requirements/django.txt index 549c1f8b..64aaf996 100644 --- a/requirements/django.txt +++ b/requirements/django.txt @@ -1 +1 @@ -django==4.2.14 +django==4.2.16 diff --git a/requirements/doc.in b/requirements/doc.in index 68f4cb27..80155527 100644 --- a/requirements/doc.in +++ b/requirements/doc.in @@ -4,7 +4,7 @@ -r test.txt # Core and testing dependencies for this package doc8 # reStructuredText style checker -edx_sphinx_theme # edX theme for Sphinx output +sphinx_book_theme # sphinx book theme twine # Validates README.rst for usage on PyPI build # Needed to build the wheel for twine check Sphinx # Documentation builder diff --git a/requirements/doc.txt b/requirements/doc.txt index 866452a2..c627c57b 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -4,6 +4,9 @@ # # make upgrade # +alabaster==0.7.16 +accessible-pygments==0.0.5 + # via pydata-sphinx-theme alabaster==0.7.13 # via sphinx appdirs==1.4.4 @@ -24,36 +27,31 @@ async-timeout==4.0.3 # via # -r requirements/test.txt # redis -attrs==23.2.0 +attrs==24.2.0 # via # -r requirements/test.txt # lti-consumer-xblock # openedx-events -babel==2.15.0 +babel==2.16.0 # via sphinx backports-tarfile==1.2.0 # via jaraco-context -backports-zoneinfo==0.2.1 - # via - # -r requirements/test.txt - # django - # djangorestframework bleach==6.1.0 # via # -r requirements/test.txt # lti-consumer-xblock -boto3==1.34.149 +boto3==1.35.9 # via # -r requirements/test.txt # fs-s3fs -botocore==1.34.149 +botocore==1.35.9 # via # -r requirements/test.txt # boto3 # s3transfer build==1.2.1 # via -r requirements/doc.in -cachetools==5.4.0 +cachetools==5.5.0 # via # -r requirements/test.txt # tox @@ -61,7 +59,7 @@ certifi==2024.7.4 # via # -r requirements/test.txt # requests -cffi==1.16.0 +cffi==1.17.0 # via # -r requirements/test.txt # cryptography @@ -103,7 +101,7 @@ coreschema==0.0.4 # via # -r requirements/test.txt # coreapi -coverage[toml]==7.6.0 +coverage[toml]==7.6.1 # via # -r requirements/test.txt # pytest-cov @@ -111,6 +109,7 @@ cryptography==43.0.0 # via # -r requirements/test.txt # pyjwt + # secretstorage # social-auth-core ddt==1.7.2 # via -r requirements/test.txt @@ -127,7 +126,7 @@ distlib==0.3.8 # via # -r requirements/test.txt # virtualenv -django==4.2.14 +django==4.2.15 # via # -c requirements/common_constraints.txt # -r requirements/test.txt @@ -178,7 +177,7 @@ django-dynamic-fixture==4.0.1 # via -r requirements/test.txt django-extensions==3.2.3 # via -r requirements/test.txt -django-filter==24.2 +django-filter==24.3 # via # -r requirements/test.txt # lti-consumer-xblock @@ -238,7 +237,7 @@ edx-ccx-keys==1.3.0 # openedx-events edx-django-release-util==1.4.0 # via -r requirements/test.txt -edx-django-utils==5.14.2 +edx-django-utils==5.15.0 # via # -r requirements/test.txt # django-config-models @@ -250,11 +249,11 @@ edx-django-utils==5.14.2 # openedx-events edx-drf-extensions==10.3.0 # via -r requirements/test.txt -edx-event-bus-kafka==5.7.0 +edx-event-bus-kafka==5.8.1 # via -r requirements/test.txt edx-event-bus-redis==0.5.0 # via -r requirements/test.txt -edx-lint==5.3.7 +edx-lint==5.4.0 # via -r requirements/test.txt edx-opaque-keys[django]==2.10.0 # via @@ -278,9 +277,9 @@ exceptiongroup==1.2.2 # via # -r requirements/test.txt # pytest -factory-boy==3.3.0 +factory-boy==3.3.1 # via -r requirements/test.txt -faker==26.0.0 +faker==28.0.0 # via # -r requirements/test.txt # factory-boy @@ -309,21 +308,19 @@ future==1.0.0 # via # -r requirements/test.txt # pyjwkest -idna==3.7 +idna==3.8 # via # -r requirements/test.txt # requests imagesize==1.4.1 # via sphinx -importlib-metadata==6.11.0 +importlib-metadata==8.4.0 # via # -c requirements/common_constraints.txt # build # keyring # sphinx # twine -importlib-resources==6.4.0 - # via keyring inflection==0.5.1 # via # -r requirements/test.txt @@ -342,9 +339,9 @@ itypes==1.2.0 # coreapi jaraco-classes==3.4.0 # via keyring -jaraco-context==5.3.0 +jaraco-context==6.0.1 # via keyring -jaraco-functools==4.0.1 +jaraco-functools==4.0.2 # via keyring jinja2==3.1.4 # via @@ -361,7 +358,7 @@ jsonfield==3.1.0 # via # -r requirements/test.txt # lti-consumer-xblock -keyring==25.2.1 +keyring==25.3.0 # via twine lazy==1.6 # via @@ -369,7 +366,7 @@ lazy==1.6 # lti-consumer-xblock lti-consumer-xblock==9.11.3 # via -r requirements/test.txt -lxml==5.2.2 +lxml==5.3.0 # via # -r requirements/test.txt # lti-consumer-xblock @@ -395,13 +392,13 @@ mdurl==0.1.2 # via markdown-it-py mock==5.1.0 # via -r requirements/test.txt -more-itertools==10.3.0 +more-itertools==10.4.0 # via # jaraco-classes # jaraco-functools mysqlclient==2.2.4 # via -r requirements/test.txt -newrelic==9.12.0 +newrelic==9.13.0 # via # -r requirements/test.txt # edx-django-utils @@ -417,11 +414,11 @@ openapi-codec==1.3.2 # via # -r requirements/test.txt # django-rest-swagger -openedx-django-pyfs==3.6.0 +openedx-django-pyfs==3.7.0 # via # -r requirements/test.txt # lti-consumer-xblock -openedx-events==9.11.0 +openedx-events==9.12.0 # via # -r requirements/test.txt # edx-event-bus-kafka @@ -435,11 +432,12 @@ packaging==24.1 # -r requirements/test.txt # build # drf-yasg + # pydata-sphinx-theme # pyproject-api # pytest # sphinx # tox -pbr==6.0.0 +pbr==6.1.0 # via # -r requirements/test.txt # stevedore @@ -469,9 +467,13 @@ pycryptodomex==3.20.0 # -r requirements/test.txt # lti-consumer-xblock # pyjwkest +pydata-sphinx-theme==0.15.4 + # via sphinx-book-theme pygments==2.18.0 # via + # accessible-pygments # doc8 + # pydata-sphinx-theme # readme-renderer # rich # sphinx @@ -480,7 +482,7 @@ pyjwkest==1.4.2 # -r requirements/test.txt # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/test.txt # drf-jwt @@ -551,10 +553,9 @@ python3-openid==3.2.0 pytz==2024.1 # via # -r requirements/test.txt - # babel # drf-yasg # xblock -pyyaml==6.0.1 +pyyaml==6.0.2 # via # -r requirements/test.txt # code-annotations @@ -564,7 +565,7 @@ pyyaml==6.0.1 # xblock readme-renderer==43.0 # via twine -redis==5.0.7 +redis==5.0.8 # via # -r requirements/test.txt # walrus @@ -594,7 +595,7 @@ restructuredtext-lint==1.4.0 # via doc8 rfc3986==2.0.0 # via twine -rich==13.7.1 +rich==13.8.0 # via twine s3transfer==0.10.2 # via @@ -604,7 +605,7 @@ semantic-version==2.10.0 # via # -r requirements/test.txt # edx-drf-extensions -simplejson==3.19.2 +simplejson==3.19.3 # via # -r requirements/test.txt # django-rest-swagger @@ -617,7 +618,6 @@ six==1.16.0 # edx-ccx-keys # edx-django-release-util # edx-lint - # edx-sphinx-theme # fs # fs-s3fs # pyjwkest @@ -637,27 +637,32 @@ social-auth-core==4.5.4 # -r requirements/test.txt # edx-auth-backends # social-auth-app-django +soupsieve==2.5 + # via beautifulsoup4 sphinx==5.3.0 # via # -r requirements/doc.in - # edx-sphinx-theme + # pydata-sphinx-theme + # sphinx-book-theme +sphinx-book-theme==1.1.3 + # via -r requirements/doc.in sphinxcontrib-applehelp==1.0.4 # via sphinx -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx sqlparse==0.5.1 # via # -r requirements/test.txt # django -stevedore==5.2.0 +stevedore==5.3.0 # via # -r requirements/test.txt # code-annotations @@ -678,11 +683,11 @@ tomli==2.0.1 # pyproject-api # pytest # tox -tomlkit==0.13.0 +tomlkit==0.13.2 # via # -r requirements/test.txt # pylint -tox==4.16.0 +tox==4.18.0 # via -r requirements/test.txt twine==5.1.1 # via -r requirements/doc.in @@ -692,14 +697,14 @@ typing-extensions==4.12.2 # asgiref # astroid # edx-opaque-keys + # pydata-sphinx-theme # pylint - # rich uritemplate==4.1.1 # via # -r requirements/test.txt # coreapi # drf-yasg -urllib3==1.26.19 +urllib3==1.26.20 # via # -r requirements/test.txt # botocore @@ -722,18 +727,16 @@ webencodings==0.5.1 # via # -r requirements/test.txt # bleach -webob==1.8.7 +webob==1.8.8 # via # -r requirements/test.txt # xblock -xblock==5.0.0 +xblock==5.1.0 # via # -r requirements/test.txt # lti-consumer-xblock -zipp==3.19.2 - # via - # importlib-metadata - # importlib-resources +zipp==3.20.1 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index f577da4d..e6268ff6 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -1,17 +1,13 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -build==1.2.1 +build==1.2.2 # via pip-tools click==8.1.7 # via pip-tools -importlib-metadata==6.11.0 - # via - # -c requirements/common_constraints.txt - # build packaging==24.1 # via build pip-tools==7.4.1 @@ -20,14 +16,8 @@ pyproject-hooks==1.1.0 # via # build # pip-tools -tomli==2.0.1 - # via - # build - # pip-tools -wheel==0.43.0 +wheel==0.44.0 # via pip-tools -zipp==3.19.2 - # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/pip.txt b/requirements/pip.txt index ebe14bbe..488d41f8 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -1,14 +1,14 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -wheel==0.43.0 +wheel==0.44.0 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==24.1.2 +pip==24.2 # via -r requirements/pip.in -setuptools==71.1.0 +setuptools==75.1.0 # via -r requirements/pip.in diff --git a/requirements/production.txt b/requirements/production.txt index cc4dcd07..bee48746 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -13,39 +13,30 @@ asgiref==3.8.1 # -r requirements/base.txt # django # django-cors-headers -async-timeout==4.0.3 - # via - # -r requirements/base.txt - # redis -attrs==23.2.0 +attrs==24.2.0 # via # -r requirements/base.txt # lti-consumer-xblock # openedx-events -backports-zoneinfo==0.2.1 - # via - # -r requirements/base.txt - # django - # djangorestframework bleach==6.1.0 # via # -r requirements/base.txt # lti-consumer-xblock -boto3==1.34.149 +boto3==1.35.22 # via # -r requirements/base.txt # django-ses # fs-s3fs -botocore==1.34.149 +botocore==1.35.22 # via # -r requirements/base.txt # boto3 # s3transfer -certifi==2024.7.4 +certifi==2024.8.30 # via # -r requirements/base.txt # requests -cffi==1.16.0 +cffi==1.17.1 # via # -r requirements/base.txt # cryptography @@ -72,7 +63,7 @@ coreschema==0.0.4 # via # -r requirements/base.txt # coreapi -cryptography==43.0.0 +cryptography==43.0.1 # via # -r requirements/base.txt # pyjwt @@ -82,7 +73,7 @@ defusedxml==0.8.0rc2 # -r requirements/base.txt # python3-openid # social-auth-core -django==4.2.14 +django==4.2.16 # via # -r requirements/base.txt # django-appconf @@ -131,15 +122,15 @@ django-crum==0.7.9 # edx-toggles django-extensions==3.2.3 # via -r requirements/base.txt -django-filter==24.2 +django-filter==24.3 # via # -r requirements/base.txt # lti-consumer-xblock -django-model-utils==4.5.1 +django-model-utils==5.0.0 # via -r requirements/base.txt django-rest-swagger==2.2.0 # via -r requirements/base.txt -django-ses==4.1.0 +django-ses==4.1.1 # via -r requirements/production.in django-simple-history==3.7.0 # via -r requirements/base.txt @@ -174,9 +165,9 @@ drf-yasg==1.21.7 # via # -r requirements/base.txt # edx-api-doc-tools -edx-api-doc-tools==1.8.0 +edx-api-doc-tools==2.0.0 # via -r requirements/base.txt -edx-auth-backends==4.3.0 +edx-auth-backends==4.4.0 # via -r requirements/base.txt edx-ccx-keys==1.3.0 # via @@ -185,7 +176,7 @@ edx-ccx-keys==1.3.0 # openedx-events edx-django-release-util==1.4.0 # via -r requirements/base.txt -edx-django-utils==5.14.2 +edx-django-utils==5.15.0 # via # -r requirements/base.txt # django-config-models @@ -195,20 +186,20 @@ edx-django-utils==5.14.2 # edx-rest-api-client # edx-toggles # openedx-events -edx-drf-extensions==10.3.0 +edx-drf-extensions==10.4.0 # via -r requirements/base.txt -edx-event-bus-kafka==5.7.0 +edx-event-bus-kafka==5.8.1 # via -r requirements/base.txt edx-event-bus-redis==0.5.0 # via -r requirements/base.txt -edx-opaque-keys[django]==2.10.0 +edx-opaque-keys[django]==2.11.0 # via # -r requirements/base.txt # edx-ccx-keys # edx-drf-extensions # lti-consumer-xblock # openedx-events -edx-rest-api-client==5.7.1 +edx-rest-api-client==6.0.0 # via -r requirements/base.txt edx-toggles==5.2.0 # via @@ -217,7 +208,7 @@ edx-toggles==5.2.0 # edx-event-bus-redis edx-token-utils==0.2.1 # via -r requirements/base.txt -fastavro==1.9.5 +fastavro==1.9.7 # via # -r requirements/base.txt # openedx-events @@ -237,11 +228,11 @@ future==1.0.0 # pyjwkest gevent==24.2.1 # via -r requirements/production.in -greenlet==3.0.3 +greenlet==3.1.0 # via gevent -gunicorn==22.0.0 +gunicorn==23.0.0 # via -r requirements/production.in -idna==3.7 +idna==3.10 # via # -r requirements/base.txt # requests @@ -273,7 +264,7 @@ lazy==1.6 # lti-consumer-xblock lti-consumer-xblock==9.11.3 # via -r requirements/base.txt -lxml==5.2.2 +lxml==5.3.0 # via # -r requirements/base.txt # lti-consumer-xblock @@ -293,7 +284,7 @@ mysqlclient==2.2.4 # via # -r requirements/base.txt # -r requirements/production.in -newrelic==9.12.0 +newrelic==9.13.0 # via # -r requirements/base.txt # edx-django-utils @@ -307,11 +298,11 @@ openapi-codec==1.3.2 # via # -r requirements/base.txt # django-rest-swagger -openedx-django-pyfs==3.6.0 +openedx-django-pyfs==3.7.0 # via # -r requirements/base.txt # lti-consumer-xblock -openedx-events==9.11.0 +openedx-events==9.14.1 # via # -r requirements/base.txt # edx-event-bus-kafka @@ -325,7 +316,7 @@ packaging==24.1 # -r requirements/base.txt # drf-yasg # gunicorn -pbr==6.0.0 +pbr==6.1.0 # via # -r requirements/base.txt # stevedore @@ -347,7 +338,7 @@ pyjwkest==1.4.2 # -r requirements/base.txt # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/base.txt # drf-jwt @@ -357,7 +348,7 @@ pyjwt[crypto]==2.8.0 # social-auth-core pymemcache==4.0.0 # via -r requirements/base.txt -pymongo==4.8.0 +pymongo==4.9.1 # via # -r requirements/base.txt # edx-opaque-keys @@ -380,13 +371,12 @@ python3-openid==3.2.0 # via # -r requirements/base.txt # social-auth-core -pytz==2024.1 +pytz==2024.2 # via # -r requirements/base.txt - # django-ses # drf-yasg # xblock -pyyaml==6.0.1 +pyyaml==6.0.2 # via # -r requirements/base.txt # -r requirements/production.in @@ -394,7 +384,7 @@ pyyaml==6.0.1 # drf-yasg # edx-django-release-util # xblock -redis==5.0.7 +redis==5.0.8 # via # -r requirements/base.txt # walrus @@ -406,7 +396,6 @@ requests==2.32.3 # edx-rest-api-client # pyjwkest # requests-oauthlib - # slumber # social-auth-core requests-oauthlib==2.0.0 # via @@ -420,7 +409,7 @@ semantic-version==2.10.0 # via # -r requirements/base.txt # edx-drf-extensions -simplejson==3.19.2 +simplejson==3.19.3 # via # -r requirements/base.txt # django-rest-swagger @@ -436,10 +425,6 @@ six==1.16.0 # fs-s3fs # pyjwkest # python-dateutil -slumber==0.7.1 - # via - # -r requirements/base.txt - # edx-rest-api-client social-auth-app-django==5.4.2 # via # -r requirements/base.txt @@ -453,7 +438,7 @@ sqlparse==0.5.1 # via # -r requirements/base.txt # django -stevedore==5.2.0 +stevedore==5.3.0 # via # -r requirements/base.txt # code-annotations @@ -466,14 +451,13 @@ text-unidecode==1.3 typing-extensions==4.12.2 # via # -r requirements/base.txt - # asgiref # edx-opaque-keys uritemplate==4.1.1 # via # -r requirements/base.txt # coreapi # drf-yasg -urllib3==1.26.19 +urllib3==2.2.3 # via # -r requirements/base.txt # botocore @@ -490,17 +474,17 @@ webencodings==0.5.1 # via # -r requirements/base.txt # bleach -webob==1.8.7 +webob==1.8.8 # via # -r requirements/base.txt # xblock -xblock==5.0.0 +xblock==5.1.0 # via # -r requirements/base.txt # lti-consumer-xblock zope-event==5.0 # via gevent -zope-interface==6.4.post2 +zope-interface==7.0.3 # 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 57baf514..7da0de0c 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -18,44 +18,33 @@ astroid==3.2.4 # -r requirements/test.txt # pylint # pylint-celery -async-timeout==4.0.3 - # via - # -r requirements/test.txt - # redis -attrs==23.2.0 +attrs==24.2.0 # via # -r requirements/test.txt # lti-consumer-xblock # openedx-events -backports-tarfile==1.2.0 - # via jaraco-context -backports-zoneinfo==0.2.1 - # via - # -r requirements/test.txt - # django - # djangorestframework bleach==6.1.0 # via # -r requirements/test.txt # lti-consumer-xblock -boto3==1.34.149 +boto3==1.35.22 # via # -r requirements/test.txt # fs-s3fs -botocore==1.34.149 +botocore==1.35.22 # via # -r requirements/test.txt # boto3 # s3transfer -cachetools==5.4.0 +cachetools==5.5.0 # via # -r requirements/test.txt # tox -certifi==2024.7.4 +certifi==2024.8.30 # via # -r requirements/test.txt # requests -cffi==1.16.0 +cffi==1.17.1 # via # -r requirements/test.txt # cryptography @@ -97,11 +86,11 @@ coreschema==0.0.4 # via # -r requirements/test.txt # coreapi -coverage[toml]==7.6.0 +coverage[toml]==7.6.1 # via # -r requirements/test.txt # pytest-cov -cryptography==43.0.0 +cryptography==43.0.1 # via # -r requirements/test.txt # pyjwt @@ -121,7 +110,7 @@ distlib==0.3.8 # via # -r requirements/test.txt # virtualenv -django==4.2.14 +django==4.2.16 # via # -c requirements/common_constraints.txt # -r requirements/test.txt @@ -172,11 +161,11 @@ django-dynamic-fixture==4.0.1 # via -r requirements/test.txt django-extensions==3.2.3 # via -r requirements/test.txt -django-filter==24.2 +django-filter==24.3 # via # -r requirements/test.txt # lti-consumer-xblock -django-model-utils==4.5.1 +django-model-utils==5.0.0 # via -r requirements/test.txt django-rest-swagger==2.2.0 # via -r requirements/test.txt @@ -205,7 +194,7 @@ dnspython==2.6.1 # via # -r requirements/test.txt # pymongo -docutils==0.20.1 +docutils==0.21.2 # via readme-renderer drf-jwt==1.19.2 # via @@ -215,9 +204,9 @@ drf-yasg==1.21.7 # via # -r requirements/test.txt # edx-api-doc-tools -edx-api-doc-tools==1.8.0 +edx-api-doc-tools==2.0.0 # via -r requirements/test.txt -edx-auth-backends==4.3.0 +edx-auth-backends==4.4.0 # via -r requirements/test.txt edx-ccx-keys==1.3.0 # via @@ -226,7 +215,7 @@ edx-ccx-keys==1.3.0 # openedx-events edx-django-release-util==1.4.0 # via -r requirements/test.txt -edx-django-utils==5.14.2 +edx-django-utils==5.15.0 # via # -r requirements/test.txt # django-config-models @@ -236,24 +225,24 @@ edx-django-utils==5.14.2 # edx-rest-api-client # edx-toggles # openedx-events -edx-drf-extensions==10.3.0 +edx-drf-extensions==10.4.0 # via -r requirements/test.txt -edx-event-bus-kafka==5.7.0 +edx-event-bus-kafka==5.8.1 # via -r requirements/test.txt edx-event-bus-redis==0.5.0 # via -r requirements/test.txt -edx-lint==5.3.7 +edx-lint==5.4.0 # via # -r requirements/quality.in # -r requirements/test.txt -edx-opaque-keys[django]==2.10.0 +edx-opaque-keys[django]==2.11.0 # via # -r requirements/test.txt # edx-ccx-keys # edx-drf-extensions # lti-consumer-xblock # openedx-events -edx-rest-api-client==5.7.1 +edx-rest-api-client==6.0.0 # via -r requirements/test.txt edx-toggles==5.2.0 # via @@ -262,21 +251,17 @@ edx-toggles==5.2.0 # edx-event-bus-redis edx-token-utils==0.2.1 # via -r requirements/test.txt -exceptiongroup==1.2.2 - # via - # -r requirements/test.txt - # pytest -factory-boy==3.3.0 +factory-boy==3.3.1 # via -r requirements/test.txt -faker==26.0.0 +faker==28.4.1 # via # -r requirements/test.txt # factory-boy -fastavro==1.9.5 +fastavro==1.9.7 # via # -r requirements/test.txt # openedx-events -filelock==3.15.4 +filelock==3.16.1 # via # -r requirements/test.txt # tox @@ -297,17 +282,12 @@ future==1.0.0 # via # -r requirements/test.txt # pyjwkest -idna==3.7 +idna==3.10 # via # -r requirements/test.txt # requests -importlib-metadata==6.11.0 - # via - # -c requirements/common_constraints.txt - # keyring - # twine -importlib-resources==6.4.0 - # via keyring +importlib-metadata==8.5.0 + # via twine inflection==0.5.1 # via # -r requirements/test.txt @@ -327,9 +307,9 @@ itypes==1.2.0 # coreapi jaraco-classes==3.4.0 # via keyring -jaraco-context==5.3.0 +jaraco-context==6.0.1 # via keyring -jaraco-functools==4.0.1 +jaraco-functools==4.0.2 # via keyring jinja2==3.1.4 # via @@ -345,7 +325,7 @@ jsonfield==3.1.0 # via # -r requirements/test.txt # lti-consumer-xblock -keyring==25.2.1 +keyring==25.4.0 # via twine lazy==1.6 # via @@ -353,7 +333,7 @@ lazy==1.6 # lti-consumer-xblock lti-consumer-xblock==9.11.3 # via -r requirements/test.txt -lxml==5.2.2 +lxml==5.3.0 # via # -r requirements/test.txt # lti-consumer-xblock @@ -379,13 +359,13 @@ mdurl==0.1.2 # via markdown-it-py mock==5.1.0 # via -r requirements/test.txt -more-itertools==10.3.0 +more-itertools==10.5.0 # via # jaraco-classes # jaraco-functools mysqlclient==2.2.4 # via -r requirements/test.txt -newrelic==9.12.0 +newrelic==9.13.0 # via # -r requirements/test.txt # edx-django-utils @@ -401,11 +381,11 @@ openapi-codec==1.3.2 # via # -r requirements/test.txt # django-rest-swagger -openedx-django-pyfs==3.6.0 +openedx-django-pyfs==3.7.0 # via # -r requirements/test.txt # lti-consumer-xblock -openedx-events==9.11.0 +openedx-events==9.14.1 # via # -r requirements/test.txt # edx-event-bus-kafka @@ -421,13 +401,13 @@ packaging==24.1 # pyproject-api # pytest # tox -pbr==6.0.0 +pbr==6.1.0 # via # -r requirements/test.txt # stevedore pkginfo==1.10.0 # via twine -platformdirs==4.2.2 +platformdirs==4.3.6 # via # -r requirements/test.txt # pylint @@ -442,7 +422,7 @@ psutil==6.0.0 # via # -r requirements/test.txt # edx-django-utils -pycodestyle==2.12.0 +pycodestyle==2.12.1 # via -r requirements/quality.in pycparser==2.22 # via @@ -464,7 +444,7 @@ pyjwkest==1.4.2 # -r requirements/test.txt # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/test.txt # drf-jwt @@ -472,7 +452,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==3.2.6 +pylint==3.2.7 # via # -r requirements/test.txt # edx-lint @@ -494,7 +474,7 @@ pylint-plugin-utils==0.8.2 # pylint-django pymemcache==4.0.0 # via -r requirements/test.txt -pymongo==4.8.0 +pymongo==4.9.1 # via # -r requirements/test.txt # edx-opaque-keys @@ -502,18 +482,18 @@ pynacl==1.5.0 # via # -r requirements/test.txt # edx-django-utils -pyproject-api==1.7.1 +pyproject-api==1.8.0 # via # -r requirements/test.txt # tox -pytest==8.3.2 +pytest==8.3.3 # via # -r requirements/test.txt # pytest-cov # pytest-django pytest-cov==5.0.0 # via -r requirements/test.txt -pytest-django==4.8.0 +pytest-django==4.9.0 # via -r requirements/test.txt python-dateutil==2.9.0.post0 # via @@ -530,12 +510,12 @@ python3-openid==3.2.0 # via # -r requirements/test.txt # social-auth-core -pytz==2024.1 +pytz==2024.2 # via # -r requirements/test.txt # drf-yasg # xblock -pyyaml==6.0.1 +pyyaml==6.0.2 # via # -r requirements/test.txt # code-annotations @@ -543,9 +523,9 @@ pyyaml==6.0.1 # edx-django-release-util # responses # xblock -readme-renderer==43.0 +readme-renderer==44.0 # via twine -redis==5.0.7 +redis==5.0.8 # via # -r requirements/test.txt # walrus @@ -559,7 +539,6 @@ requests==2.32.3 # requests-oauthlib # requests-toolbelt # responses - # slumber # social-auth-core # twine requests-oauthlib==2.0.0 @@ -572,7 +551,7 @@ responses==0.25.3 # via -r requirements/test.txt rfc3986==2.0.0 # via twine -rich==13.7.1 +rich==13.8.1 # via twine s3transfer==0.10.2 # via @@ -582,7 +561,7 @@ semantic-version==2.10.0 # via # -r requirements/test.txt # edx-drf-extensions -simplejson==3.19.2 +simplejson==3.19.3 # via # -r requirements/test.txt # django-rest-swagger @@ -599,10 +578,6 @@ six==1.16.0 # fs-s3fs # pyjwkest # python-dateutil -slumber==0.7.1 - # via - # -r requirements/test.txt - # edx-rest-api-client snowballstemmer==2.2.0 # via pydocstyle social-auth-app-django==5.4.2 @@ -618,7 +593,7 @@ sqlparse==0.5.1 # via # -r requirements/test.txt # django -stevedore==5.2.0 +stevedore==5.3.0 # via # -r requirements/test.txt # code-annotations @@ -628,43 +603,31 @@ text-unidecode==1.3 # via # -r requirements/test.txt # python-slugify -tomli==2.0.1 +tomlkit==0.13.2 # via # -r requirements/test.txt - # coverage # pylint - # pyproject-api - # pytest - # tox -tomlkit==0.13.0 - # via - # -r requirements/test.txt - # pylint -tox==4.16.0 +tox==4.20.0 # via -r requirements/test.txt twine==5.1.1 # via -r requirements/quality.in typing-extensions==4.12.2 # via # -r requirements/test.txt - # asgiref - # astroid # edx-opaque-keys - # pylint - # rich uritemplate==4.1.1 # via # -r requirements/test.txt # coreapi # drf-yasg -urllib3==1.26.19 +urllib3==2.2.3 # via # -r requirements/test.txt # botocore # requests # responses # twine -virtualenv==20.26.3 +virtualenv==20.26.5 # via # -r requirements/test.txt # tox @@ -680,18 +643,16 @@ webencodings==0.5.1 # via # -r requirements/test.txt # bleach -webob==1.8.7 +webob==1.8.8 # via # -r requirements/test.txt # xblock -xblock==5.0.0 +xblock==5.1.0 # via # -r requirements/test.txt # lti-consumer-xblock -zipp==3.19.2 - # via - # importlib-metadata - # importlib-resources +zipp==3.20.2 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/test.txt b/requirements/test.txt index 1a948759..bd92f159 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -17,40 +17,31 @@ astroid==3.2.4 # via # pylint # pylint-celery -async-timeout==4.0.3 - # via - # -r requirements/base.txt - # redis -attrs==23.2.0 +attrs==24.2.0 # via # -r requirements/base.txt # lti-consumer-xblock # openedx-events -backports-zoneinfo==0.2.1 - # via - # -r requirements/base.txt - # django - # djangorestframework bleach==6.1.0 # via # -r requirements/base.txt # lti-consumer-xblock -boto3==1.34.149 +boto3==1.35.22 # via # -r requirements/base.txt # fs-s3fs -botocore==1.34.149 +botocore==1.35.22 # via # -r requirements/base.txt # boto3 # s3transfer -cachetools==5.4.0 +cachetools==5.5.0 # via tox -certifi==2024.7.4 +certifi==2024.8.30 # via # -r requirements/base.txt # requests -cffi==1.16.0 +cffi==1.17.1 # via # -r requirements/base.txt # cryptography @@ -87,11 +78,11 @@ coreschema==0.0.4 # via # -r requirements/base.txt # coreapi -coverage[toml]==7.6.0 +coverage[toml]==7.6.1 # via # -r requirements/test.in # pytest-cov -cryptography==43.0.0 +cryptography==43.0.1 # via # -r requirements/base.txt # pyjwt @@ -157,11 +148,11 @@ django-dynamic-fixture==4.0.1 # via -r requirements/test.in django-extensions==3.2.3 # via -r requirements/base.txt -django-filter==24.2 +django-filter==24.3 # via # -r requirements/base.txt # lti-consumer-xblock -django-model-utils==4.5.1 +django-model-utils==5.0.0 # via -r requirements/base.txt django-rest-swagger==2.2.0 # via -r requirements/base.txt @@ -198,9 +189,9 @@ drf-yasg==1.21.7 # via # -r requirements/base.txt # edx-api-doc-tools -edx-api-doc-tools==1.8.0 +edx-api-doc-tools==2.0.0 # via -r requirements/base.txt -edx-auth-backends==4.3.0 +edx-auth-backends==4.4.0 # via -r requirements/base.txt edx-ccx-keys==1.3.0 # via @@ -209,7 +200,7 @@ edx-ccx-keys==1.3.0 # openedx-events edx-django-release-util==1.4.0 # via -r requirements/base.txt -edx-django-utils==5.14.2 +edx-django-utils==5.15.0 # via # -r requirements/base.txt # django-config-models @@ -219,22 +210,22 @@ edx-django-utils==5.14.2 # edx-rest-api-client # edx-toggles # openedx-events -edx-drf-extensions==10.3.0 +edx-drf-extensions==10.4.0 # via -r requirements/base.txt -edx-event-bus-kafka==5.7.0 +edx-event-bus-kafka==5.8.1 # via -r requirements/base.txt edx-event-bus-redis==0.5.0 # via -r requirements/base.txt -edx-lint==5.3.7 +edx-lint==5.4.0 # via -r requirements/test.in -edx-opaque-keys[django]==2.10.0 +edx-opaque-keys[django]==2.11.0 # via # -r requirements/base.txt # edx-ccx-keys # edx-drf-extensions # lti-consumer-xblock # openedx-events -edx-rest-api-client==5.7.1 +edx-rest-api-client==6.0.0 # via -r requirements/base.txt edx-toggles==5.2.0 # via @@ -243,17 +234,15 @@ edx-toggles==5.2.0 # edx-event-bus-redis edx-token-utils==0.2.1 # via -r requirements/base.txt -exceptiongroup==1.2.2 - # via pytest -factory-boy==3.3.0 +factory-boy==3.3.1 # via -r requirements/test.in -faker==26.0.0 +faker==28.4.1 # via factory-boy -fastavro==1.9.5 +fastavro==1.9.7 # via # -r requirements/base.txt # openedx-events -filelock==3.15.4 +filelock==3.16.1 # via # tox # virtualenv @@ -273,7 +262,7 @@ future==1.0.0 # via # -r requirements/base.txt # pyjwkest -idna==3.7 +idna==3.10 # via # -r requirements/base.txt # requests @@ -309,7 +298,7 @@ lazy==1.6 # lti-consumer-xblock lti-consumer-xblock==9.11.3 # via -r requirements/base.txt -lxml==5.2.2 +lxml==5.3.0 # via # -r requirements/base.txt # lti-consumer-xblock @@ -331,7 +320,7 @@ mock==5.1.0 # via -r requirements/test.in mysqlclient==2.2.4 # via -r requirements/base.txt -newrelic==9.12.0 +newrelic==9.13.0 # via # -r requirements/base.txt # edx-django-utils @@ -345,11 +334,11 @@ openapi-codec==1.3.2 # via # -r requirements/base.txt # django-rest-swagger -openedx-django-pyfs==3.6.0 +openedx-django-pyfs==3.7.0 # via # -r requirements/base.txt # lti-consumer-xblock -openedx-events==9.11.0 +openedx-events==9.14.1 # via # -r requirements/base.txt # edx-event-bus-kafka @@ -365,11 +354,11 @@ packaging==24.1 # pyproject-api # pytest # tox -pbr==6.0.0 +pbr==6.1.0 # via # -r requirements/base.txt # stevedore -platformdirs==4.2.2 +platformdirs==4.3.6 # via # pylint # tox @@ -396,7 +385,7 @@ pyjwkest==1.4.2 # -r requirements/base.txt # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/base.txt # drf-jwt @@ -404,7 +393,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==3.2.6 +pylint==3.2.7 # via # edx-lint # pylint-celery @@ -420,7 +409,7 @@ pylint-plugin-utils==0.8.2 # pylint-django pymemcache==4.0.0 # via -r requirements/base.txt -pymongo==4.8.0 +pymongo==4.9.1 # via # -r requirements/base.txt # edx-opaque-keys @@ -428,15 +417,15 @@ pynacl==1.5.0 # via # -r requirements/base.txt # edx-django-utils -pyproject-api==1.7.1 +pyproject-api==1.8.0 # via tox -pytest==8.3.2 +pytest==8.3.3 # via # pytest-cov # pytest-django pytest-cov==5.0.0 # via -r requirements/test.in -pytest-django==4.8.0 +pytest-django==4.9.0 # via -r requirements/test.in python-dateutil==2.9.0.post0 # via @@ -453,12 +442,12 @@ python3-openid==3.2.0 # via # -r requirements/base.txt # social-auth-core -pytz==2024.1 +pytz==2024.2 # via # -r requirements/base.txt # drf-yasg # xblock -pyyaml==6.0.1 +pyyaml==6.0.2 # via # -r requirements/base.txt # code-annotations @@ -466,7 +455,7 @@ pyyaml==6.0.1 # edx-django-release-util # responses # xblock -redis==5.0.7 +redis==5.0.8 # via # -r requirements/base.txt # walrus @@ -479,7 +468,6 @@ requests==2.32.3 # pyjwkest # requests-oauthlib # responses - # slumber # social-auth-core requests-oauthlib==2.0.0 # via @@ -495,7 +483,7 @@ semantic-version==2.10.0 # via # -r requirements/base.txt # edx-drf-extensions -simplejson==3.19.2 +simplejson==3.19.3 # via # -r requirements/base.txt # django-rest-swagger @@ -512,10 +500,6 @@ six==1.16.0 # fs-s3fs # pyjwkest # python-dateutil -slumber==0.7.1 - # via - # -r requirements/base.txt - # edx-rest-api-client social-auth-app-django==5.4.2 # via # -r requirements/base.txt @@ -529,7 +513,7 @@ sqlparse==0.5.1 # via # -r requirements/base.txt # django -stevedore==5.2.0 +stevedore==5.3.0 # via # -r requirements/base.txt # code-annotations @@ -539,36 +523,26 @@ text-unidecode==1.3 # via # -r requirements/base.txt # python-slugify -tomli==2.0.1 - # via - # coverage - # pylint - # pyproject-api - # pytest - # tox -tomlkit==0.13.0 +tomlkit==0.13.2 # via pylint -tox==4.16.0 +tox==4.20.0 # via -r requirements/test.in typing-extensions==4.12.2 # via # -r requirements/base.txt - # asgiref - # astroid # edx-opaque-keys - # pylint uritemplate==4.1.1 # via # -r requirements/base.txt # coreapi # drf-yasg -urllib3==1.26.19 +urllib3==2.2.3 # via # -r requirements/base.txt # botocore # requests # responses -virtualenv==20.26.3 +virtualenv==20.26.5 # via tox walrus==0.9.4 # via @@ -582,11 +556,11 @@ webencodings==0.5.1 # via # -r requirements/base.txt # bleach -webob==1.8.7 +webob==1.8.8 # via # -r requirements/base.txt # xblock -xblock==5.0.0 +xblock==5.1.0 # via # -r requirements/base.txt # lti-consumer-xblock diff --git a/requirements/validation.txt b/requirements/validation.txt index 0dea2135..ef2c298f 100644 --- a/requirements/validation.txt +++ b/requirements/validation.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -21,54 +21,39 @@ astroid==3.2.4 # -r requirements/test.txt # pylint # pylint-celery -async-timeout==4.0.3 - # via - # -r requirements/quality.txt - # -r requirements/test.txt - # redis -attrs==23.2.0 +attrs==24.2.0 # via # -r requirements/quality.txt # -r requirements/test.txt # lti-consumer-xblock # openedx-events -backports-tarfile==1.2.0 - # via - # -r requirements/quality.txt - # jaraco-context -backports-zoneinfo==0.2.1 - # via - # -r requirements/quality.txt - # -r requirements/test.txt - # django - # djangorestframework bleach==6.1.0 # via # -r requirements/quality.txt # -r requirements/test.txt # lti-consumer-xblock -boto3==1.34.149 +boto3==1.35.22 # via # -r requirements/quality.txt # -r requirements/test.txt # fs-s3fs -botocore==1.34.149 +botocore==1.35.22 # via # -r requirements/quality.txt # -r requirements/test.txt # boto3 # s3transfer -cachetools==5.4.0 +cachetools==5.5.0 # via # -r requirements/quality.txt # -r requirements/test.txt # tox -certifi==2024.7.4 +certifi==2024.8.30 # via # -r requirements/quality.txt # -r requirements/test.txt # requests -cffi==1.16.0 +cffi==1.17.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -119,12 +104,12 @@ coreschema==0.0.4 # -r requirements/quality.txt # -r requirements/test.txt # coreapi -coverage[toml]==7.6.0 +coverage[toml]==7.6.1 # via # -r requirements/quality.txt # -r requirements/test.txt # pytest-cov -cryptography==43.0.0 +cryptography==43.0.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -150,7 +135,7 @@ distlib==0.3.8 # -r requirements/quality.txt # -r requirements/test.txt # virtualenv -django==4.2.14 +django==4.2.16 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -210,12 +195,12 @@ django-extensions==3.2.3 # via # -r requirements/quality.txt # -r requirements/test.txt -django-filter==24.2 +django-filter==24.3 # via # -r requirements/quality.txt # -r requirements/test.txt # lti-consumer-xblock -django-model-utils==4.5.1 +django-model-utils==5.0.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -254,7 +239,7 @@ dnspython==2.6.1 # -r requirements/quality.txt # -r requirements/test.txt # pymongo -docutils==0.20.1 +docutils==0.21.2 # via # -r requirements/quality.txt # readme-renderer @@ -268,11 +253,11 @@ drf-yasg==1.21.7 # -r requirements/quality.txt # -r requirements/test.txt # edx-api-doc-tools -edx-api-doc-tools==1.8.0 +edx-api-doc-tools==2.0.0 # via # -r requirements/quality.txt # -r requirements/test.txt -edx-auth-backends==4.3.0 +edx-auth-backends==4.4.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -286,7 +271,7 @@ edx-django-release-util==1.4.0 # via # -r requirements/quality.txt # -r requirements/test.txt -edx-django-utils==5.14.2 +edx-django-utils==5.15.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -297,11 +282,11 @@ edx-django-utils==5.14.2 # edx-rest-api-client # edx-toggles # openedx-events -edx-drf-extensions==10.3.0 +edx-drf-extensions==10.4.0 # via # -r requirements/quality.txt # -r requirements/test.txt -edx-event-bus-kafka==5.7.0 +edx-event-bus-kafka==5.8.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -309,11 +294,11 @@ edx-event-bus-redis==0.5.0 # via # -r requirements/quality.txt # -r requirements/test.txt -edx-lint==5.3.7 +edx-lint==5.4.0 # via # -r requirements/quality.txt # -r requirements/test.txt -edx-opaque-keys[django]==2.10.0 +edx-opaque-keys[django]==2.11.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -321,7 +306,7 @@ edx-opaque-keys[django]==2.10.0 # edx-drf-extensions # lti-consumer-xblock # openedx-events -edx-rest-api-client==5.7.1 +edx-rest-api-client==6.0.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -335,26 +320,21 @@ edx-token-utils==0.2.1 # via # -r requirements/quality.txt # -r requirements/test.txt -exceptiongroup==1.2.2 - # via - # -r requirements/quality.txt - # -r requirements/test.txt - # pytest -factory-boy==3.3.0 +factory-boy==3.3.1 # via # -r requirements/quality.txt # -r requirements/test.txt -faker==26.0.0 +faker==28.4.1 # via # -r requirements/quality.txt # -r requirements/test.txt # factory-boy -fastavro==1.9.5 +fastavro==1.9.7 # via # -r requirements/quality.txt # -r requirements/test.txt # openedx-events -filelock==3.15.4 +filelock==3.16.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -381,20 +361,15 @@ future==1.0.0 # -r requirements/quality.txt # -r requirements/test.txt # pyjwkest -idna==3.7 +idna==3.10 # via # -r requirements/quality.txt # -r requirements/test.txt # requests -importlib-metadata==6.11.0 +importlib-metadata==8.5.0 # via # -r requirements/quality.txt - # keyring # twine -importlib-resources==6.4.0 - # via - # -r requirements/quality.txt - # keyring inflection==0.5.1 # via # -r requirements/quality.txt @@ -419,11 +394,11 @@ jaraco-classes==3.4.0 # via # -r requirements/quality.txt # keyring -jaraco-context==5.3.0 +jaraco-context==6.0.1 # via # -r requirements/quality.txt # keyring -jaraco-functools==4.0.1 +jaraco-functools==4.0.2 # via # -r requirements/quality.txt # keyring @@ -444,7 +419,7 @@ jsonfield==3.1.0 # -r requirements/quality.txt # -r requirements/test.txt # lti-consumer-xblock -keyring==25.2.1 +keyring==25.4.0 # via # -r requirements/quality.txt # twine @@ -457,7 +432,7 @@ lti-consumer-xblock==9.11.3 # via # -r requirements/quality.txt # -r requirements/test.txt -lxml==5.2.2 +lxml==5.3.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -493,7 +468,7 @@ mock==5.1.0 # via # -r requirements/quality.txt # -r requirements/test.txt -more-itertools==10.3.0 +more-itertools==10.5.0 # via # -r requirements/quality.txt # jaraco-classes @@ -502,7 +477,7 @@ mysqlclient==2.2.4 # via # -r requirements/quality.txt # -r requirements/test.txt -newrelic==9.12.0 +newrelic==9.13.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -523,12 +498,12 @@ openapi-codec==1.3.2 # -r requirements/quality.txt # -r requirements/test.txt # django-rest-swagger -openedx-django-pyfs==3.6.0 +openedx-django-pyfs==3.7.0 # via # -r requirements/quality.txt # -r requirements/test.txt # lti-consumer-xblock -openedx-events==9.11.0 +openedx-events==9.14.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -547,7 +522,7 @@ packaging==24.1 # pyproject-api # pytest # tox -pbr==6.0.0 +pbr==6.1.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -556,7 +531,7 @@ pkginfo==1.10.0 # via # -r requirements/quality.txt # twine -platformdirs==4.2.2 +platformdirs==4.3.6 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -574,7 +549,7 @@ psutil==6.0.0 # -r requirements/quality.txt # -r requirements/test.txt # edx-django-utils -pycodestyle==2.12.0 +pycodestyle==2.12.1 # via -r requirements/quality.txt pycparser==2.22 # via @@ -600,7 +575,7 @@ pyjwkest==1.4.2 # -r requirements/test.txt # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -609,7 +584,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==3.2.6 +pylint==3.2.7 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -637,7 +612,7 @@ pymemcache==4.0.0 # via # -r requirements/quality.txt # -r requirements/test.txt -pymongo==4.8.0 +pymongo==4.9.1 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -647,12 +622,12 @@ pynacl==1.5.0 # -r requirements/quality.txt # -r requirements/test.txt # edx-django-utils -pyproject-api==1.7.1 +pyproject-api==1.8.0 # via # -r requirements/quality.txt # -r requirements/test.txt # tox -pytest==8.3.2 +pytest==8.3.3 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -662,7 +637,7 @@ pytest-cov==5.0.0 # via # -r requirements/quality.txt # -r requirements/test.txt -pytest-django==4.8.0 +pytest-django==4.9.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -684,13 +659,13 @@ python3-openid==3.2.0 # -r requirements/quality.txt # -r requirements/test.txt # social-auth-core -pytz==2024.1 +pytz==2024.2 # via # -r requirements/quality.txt # -r requirements/test.txt # drf-yasg # xblock -pyyaml==6.0.1 +pyyaml==6.0.2 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -699,11 +674,11 @@ pyyaml==6.0.1 # edx-django-release-util # responses # xblock -readme-renderer==43.0 +readme-renderer==44.0 # via # -r requirements/quality.txt # twine -redis==5.0.7 +redis==5.0.8 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -719,7 +694,6 @@ requests==2.32.3 # requests-oauthlib # requests-toolbelt # responses - # slumber # social-auth-core # twine requests-oauthlib==2.0.0 @@ -739,7 +713,7 @@ rfc3986==2.0.0 # via # -r requirements/quality.txt # twine -rich==13.7.1 +rich==13.8.1 # via # -r requirements/quality.txt # twine @@ -753,7 +727,7 @@ semantic-version==2.10.0 # -r requirements/quality.txt # -r requirements/test.txt # edx-drf-extensions -simplejson==3.19.2 +simplejson==3.19.3 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -772,11 +746,6 @@ six==1.16.0 # fs-s3fs # pyjwkest # python-dateutil -slumber==0.7.1 - # via - # -r requirements/quality.txt - # -r requirements/test.txt - # edx-rest-api-client snowballstemmer==2.2.0 # via # -r requirements/quality.txt @@ -797,7 +766,7 @@ sqlparse==0.5.1 # -r requirements/quality.txt # -r requirements/test.txt # django -stevedore==5.2.0 +stevedore==5.3.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -809,21 +778,12 @@ text-unidecode==1.3 # -r requirements/quality.txt # -r requirements/test.txt # python-slugify -tomli==2.0.1 +tomlkit==0.13.2 # via # -r requirements/quality.txt # -r requirements/test.txt - # coverage # pylint - # pyproject-api - # pytest - # tox -tomlkit==0.13.0 - # via - # -r requirements/quality.txt - # -r requirements/test.txt - # pylint -tox==4.16.0 +tox==4.20.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -833,18 +793,14 @@ typing-extensions==4.12.2 # via # -r requirements/quality.txt # -r requirements/test.txt - # asgiref - # astroid # edx-opaque-keys - # pylint - # rich uritemplate==4.1.1 # via # -r requirements/quality.txt # -r requirements/test.txt # coreapi # drf-yasg -urllib3==1.26.19 +urllib3==2.2.3 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -852,7 +808,7 @@ urllib3==1.26.19 # requests # responses # twine -virtualenv==20.26.3 +virtualenv==20.26.5 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -872,21 +828,20 @@ webencodings==0.5.1 # -r requirements/quality.txt # -r requirements/test.txt # bleach -webob==1.8.7 +webob==1.8.8 # via # -r requirements/quality.txt # -r requirements/test.txt # xblock -xblock==5.0.0 +xblock==5.1.0 # via # -r requirements/quality.txt # -r requirements/test.txt # lti-consumer-xblock -zipp==3.19.2 +zipp==3.20.2 # via # -r requirements/quality.txt # importlib-metadata - # importlib-resources # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/tox.ini b/tox.ini index 2be151a7..01e72d80 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py38-django{42}, quality, docs, pii_check +envlist = py312-django{42}, quality, docs, pii_check skipsdist = true [doc8]