From c4044ec4d49d677a15ef5a5500a57d8ef75cf908 Mon Sep 17 00:00:00 2001 From: Irtaza Akram Date: Wed, 25 Jun 2025 11:19:06 +0500 Subject: [PATCH] feat: add support for Django 5.2 - Remove deprecated pytz usage - Update CI to use Python 3.11 - Drop Python 3.8 references - Drop MySQL 5.7 references --- .github/docker-compose-ci.yml | 9 -- .github/workflows/ci.yml | 24 ++-- .github/workflows/mysql8-migrations-check.yml | 4 +- requirements.txt | 53 ++++---- requirements/base.in | 6 +- requirements/ci.txt | 24 ++-- requirements/constraints.txt | 2 - requirements/dev.txt | 113 ++++++------------ requirements/pip-tools.txt | 12 +- requirements/pip.txt | 4 +- requirements/quality.txt | 4 +- requirements/test.txt | 77 +++++------- .../commands/delete_old_submissions.py | 7 +- .../management/commands/tests/__init__.py | 6 +- ...queue_submi_queue_n_4c6cd5_idx_and_more.py | 28 +++++ submission_queue/models.py | 8 +- tox.ini | 5 +- xqueue/settings.py | 8 -- xqueue/test_settings.py | 2 +- 19 files changed, 164 insertions(+), 232 deletions(-) create mode 100644 submission_queue/migrations/0005_rename_submission_queue_name_retired_push_time_arrival_time_queue_submi_queue_n_4c6cd5_idx_and_more.py diff --git a/.github/docker-compose-ci.yml b/.github/docker-compose-ci.yml index eee3f2eb..6c134873 100644 --- a/.github/docker-compose-ci.yml +++ b/.github/docker-compose-ci.yml @@ -1,14 +1,6 @@ version: "2.1" services: - mysql57: - image: mysql:5.7 - container_name: mysql57 - command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci - environment: - MYSQL_ROOT_PASSWORD: "" - MYSQL_ALLOW_EMPTY_PASSWORD: "yes" - mysql80: image: mysql:8.0 container_name: mysql80 @@ -24,7 +16,6 @@ services: volumes: - ..:/edx/app/xqueue/xqueue depends_on: - - mysql57 - mysql80 environment: RABBIT_HOST: "rabbit" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2bd22776..f42fdd5c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,26 +13,34 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['py38', 'py312'] - env-name: ['django42', 'quality'] + python-version: ['py311', 'py312'] + env-name: ['django42','django52', 'quality'] db-version: ['mysql80'] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Start container run: | docker compose -f .github/docker-compose-ci.yml up -d - - name: setup python - if: ${{ matrix.python-version == 'py312' }} + - name: Setup Python ${{ matrix.python-version }} inside container run: | - docker exec -e TOXENV=${{ matrix.python-version }}-${{ matrix.env-name }} -e DB_HOST=${{ matrix.db-version }} xqueue bash -c \ - "apt update && apt install -y software-properties-common && add-apt-repository ppa:deadsnakes/ppa -y && apt install python3.12 python3.12-dev -y" + PY_VER=$(if [ "${{ matrix.python-version }}" = "py312" ]; then echo "3.12"; else echo "3.11"; fi) + + docker exec xqueue bash -c " + apt update && + apt install -y software-properties-common curl && + add-apt-repository ppa:deadsnakes/ppa -y && + apt install -y python$PY_VER python$PY_VER-dev python$PY_VER-venv && + update-alternatives --install /usr/bin/python3 python3 /usr/bin/python$PY_VER 1 && + python$PY_VER -m venv /tmp/venv && + /tmp/venv/bin/pip install --upgrade pip + " - name: Install test dependencies and run tests env: TOXENV: ${{ matrix.python-version }}-${{ matrix.env-name }} run: | - docker exec xqueue bash -c "cd /edx/app/xqueue/xqueue/; pip3 install -r requirements/ci.txt" + docker exec xqueue bash -c "cd /edx/app/xqueue/xqueue/; /tmp/venv/bin/pip install -r requirements/ci.txt" docker exec xqueue bash -c "cd /edx/app/xqueue/xqueue/ && DB_HOST=${{ matrix.db-version }} tox -e ${TOXENV}" diff --git a/.github/workflows/mysql8-migrations-check.yml b/.github/workflows/mysql8-migrations-check.yml index cfd9d4e4..49980414 100644 --- a/.github/workflows/mysql8-migrations-check.yml +++ b/.github/workflows/mysql8-migrations-check.yml @@ -19,10 +19,10 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff --git a/requirements.txt b/requirements.txt index a3b7ba68..a9e8370d 100644 --- a/requirements.txt +++ b/requirements.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.11 # by the following command: # # make upgrade @@ -8,25 +8,21 @@ asgiref==3.8.1 # via django backoff==2.2.1 # via -r requirements/base.in -backports-zoneinfo==0.2.1 ; python_version < "3.9" - # via - # -c requirements/constraints.txt - # django -boto3==1.36.21 +boto3==1.38.43 # via -r requirements/base.in -botocore==1.36.21 +botocore==1.38.43 # via # boto3 # s3transfer -certifi==2025.1.31 +certifi==2025.6.15 # via requests cffi==1.17.1 # via pynacl -charset-normalizer==3.4.1 +charset-normalizer==3.4.2 # via requests -click==8.1.8 +click==8.2.1 # via edx-django-utils -django==4.2.19 +django==4.2.23 # via # -c requirements/common_constraints.txt # -r requirements/base.in @@ -37,19 +33,19 @@ django==4.2.19 # edx-django-utils django-crum==0.7.9 # via edx-django-utils -django-storages==1.14.4 +django-storages==1.14.6 # via -r requirements/base.in -django-waffle==4.2.0 +django-waffle==5.0.0 # via edx-django-utils -edx-django-release-util==1.4.0 +edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==7.1.0 +edx-django-utils==8.0.0 # via -r requirements/base.in gunicorn==23.0.0 # via -r requirements/base.in idna==3.10 # via requests -isort==5.13.2 +isort==6.0.1 # via -r requirements/base.in jmespath==1.0.1 # via @@ -57,13 +53,11 @@ jmespath==1.0.1 # botocore mysqlclient==2.2.7 # via -r requirements/base.in -newrelic==10.6.0 - # via - # -r requirements/base.in - # edx-django-utils -packaging==24.2 +newrelic==10.14.0 + # via -r requirements/base.in +packaging==25.0 # via gunicorn -path-py==11.0.1 +path==17.1.0 # via -r requirements/base.in pbr==6.1.1 # via stevedore @@ -77,15 +71,11 @@ python-dateutil==2.9.0.post0 # via botocore python-memcached==1.62 # via -r requirements/base.in -python-termstyle==0.1.10 - # via -r requirements/base.in -pytz==2025.1 - # via -r requirements/base.in pyyaml==6.0.2 # via edx-django-release-util -requests==2.32.3 +requests==2.32.4 # via -r requirements/base.in -s3transfer==0.11.2 +s3transfer==0.13.0 # via boto3 six==1.17.0 # via @@ -93,16 +83,13 @@ six==1.17.0 # python-dateutil sqlparse==0.5.3 # via django -stevedore==5.3.0 +stevedore==5.4.1 # via edx-django-utils -typing-extensions==4.12.2 - # via asgiref -urllib3==1.26.20 +urllib3==2.2.3 # via # -c requirements/common_constraints.txt # botocore # requests # The following packages are considered to be unsafe in a requirements file: -# pip # setuptools diff --git a/requirements/base.in b/requirements/base.in index 6e21f416..0445ae24 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -11,10 +11,6 @@ edx-django-utils gunicorn isort newrelic -path.py==11.0.1 +path python-memcached -python-termstyle==0.1.10 -pytz requests -# Pin pip to 18.1 since newer versions break tox and prevent merging -pip==18.1 diff --git a/requirements/ci.txt b/requirements/ci.txt index 830d01b5..ef6cc183 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -1,10 +1,10 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -cachetools==5.5.1 +cachetools==6.1.0 # via tox chardet==5.2.0 # via tox @@ -12,29 +12,23 @@ colorama==0.4.6 # via tox distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.18.0 # via # tox # virtualenv -packaging==24.2 +packaging==25.0 # via # pyproject-api # tox -platformdirs==4.3.6 +platformdirs==4.3.8 # via # tox # virtualenv -pluggy==1.5.0 +pluggy==1.6.0 # via tox -pyproject-api==1.8.0 +pyproject-api==1.9.1 # via tox -tomli==2.2.1 - # via - # pyproject-api - # tox -tox==4.24.1 +tox==4.27.0 # via -r requirements/ci.in -typing-extensions==4.12.2 - # via tox -virtualenv==20.29.2 +virtualenv==20.31.2 # via tox diff --git a/requirements/constraints.txt b/requirements/constraints.txt index a15b6636..a51cb08b 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -10,5 +10,3 @@ # Common constraints for edx repos -c common_constraints.txt - -backports-zoneinfo==0.2.1; python_version < '3.9' diff --git a/requirements/dev.txt b/requirements/dev.txt index 0e485bfb..f5be1e05 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.11 # by the following command: # # make upgrade @@ -10,14 +10,9 @@ asgiref==3.8.1 # django backoff==2.2.1 # via -r requirements/test.txt -backports-zoneinfo==0.2.1 ; python_version < "3.9" - # via - # -c requirements/constraints.txt - # -r requirements/test.txt - # django -boto3==1.36.21 +boto3==1.38.43 # via -r requirements/test.txt -botocore==1.36.21 +botocore==1.38.43 # via # -r requirements/test.txt # boto3 @@ -26,11 +21,11 @@ build==1.2.2.post1 # via # -r requirements/pip-tools.txt # pip-tools -cachetools==5.5.1 +cachetools==6.1.0 # via # -r requirements/ci.txt # tox -certifi==2025.1.31 +certifi==2025.6.15 # via # -r requirements/test.txt # requests @@ -42,11 +37,11 @@ chardet==5.2.0 # via # -r requirements/ci.txt # tox -charset-normalizer==3.4.1 +charset-normalizer==3.4.2 # via # -r requirements/test.txt # requests -click==8.1.8 +click==8.2.1 # via # -r requirements/pip-tools.txt # -r requirements/test.txt @@ -56,7 +51,7 @@ colorama==0.4.6 # via # -r requirements/ci.txt # tox -coverage[toml]==7.6.1 +coverage[toml]==7.9.1 # via # -r requirements/test.txt # pytest-cov @@ -64,7 +59,7 @@ distlib==0.3.9 # via # -r requirements/ci.txt # virtualenv -django==4.2.19 +django==4.2.23 # via # -c requirements/common_constraints.txt # -r requirements/test.txt @@ -77,21 +72,17 @@ django-crum==0.7.9 # via # -r requirements/test.txt # edx-django-utils -django-storages==1.14.4 +django-storages==1.14.6 # via -r requirements/test.txt -django-waffle==4.2.0 +django-waffle==5.0.0 # via # -r requirements/test.txt # edx-django-utils -edx-django-release-util==1.4.0 +edx-django-release-util==1.5.0 # via -r requirements/test.txt -edx-django-utils==7.1.0 +edx-django-utils==8.0.0 # via -r requirements/test.txt -exceptiongroup==1.2.2 - # via - # -r requirements/test.txt - # pytest -filelock==3.16.1 +filelock==3.18.0 # via # -r requirements/ci.txt # tox @@ -102,15 +93,11 @@ idna==3.10 # via # -r requirements/test.txt # requests -importlib-metadata==8.5.0 - # via - # -r requirements/pip-tools.txt - # build -iniconfig==2.0.0 +iniconfig==2.1.0 # via # -r requirements/test.txt # pytest -isort==5.13.2 +isort==6.0.1 # via -r requirements/test.txt jmespath==1.0.1 # via @@ -119,11 +106,9 @@ jmespath==1.0.1 # botocore mysqlclient==2.2.7 # via -r requirements/test.txt -newrelic==10.6.0 - # via - # -r requirements/test.txt - # edx-django-utils -packaging==24.2 +newrelic==10.14.0 + # via -r requirements/test.txt +packaging==25.0 # via # -r requirements/ci.txt # -r requirements/pip-tools.txt @@ -133,7 +118,7 @@ packaging==24.2 # pyproject-api # pytest # tox -path-py==11.0.1 +path==17.1.0 # via -r requirements/test.txt pbr==6.1.1 # via @@ -141,32 +126,37 @@ pbr==6.1.1 # stevedore pip-tools==7.4.1 # via -r requirements/pip-tools.txt -platformdirs==4.3.6 +platformdirs==4.3.8 # via # -r requirements/ci.txt # tox # virtualenv -pluggy==1.5.0 +pluggy==1.6.0 # via # -r requirements/ci.txt # -r requirements/test.txt # pytest + # pytest-cov # tox psutil==7.0.0 # via # -r requirements/test.txt # edx-django-utils -pycodestyle==2.12.1 +pycodestyle==2.14.0 # via -r requirements/quality.txt pycparser==2.22 # via # -r requirements/test.txt # cffi +pygments==2.19.2 + # via + # -r requirements/test.txt + # pytest pynacl==1.5.0 # via # -r requirements/test.txt # edx-django-utils -pyproject-api==1.8.0 +pyproject-api==1.9.1 # via # -r requirements/ci.txt # tox @@ -175,14 +165,14 @@ pyproject-hooks==1.2.0 # -r requirements/pip-tools.txt # build # pip-tools -pytest==8.3.4 +pytest==8.4.1 # via # -r requirements/test.txt # pytest-cov # pytest-django -pytest-cov==5.0.0 +pytest-cov==6.2.1 # via -r requirements/test.txt -pytest-django==4.10.0 +pytest-django==4.11.1 # via -r requirements/test.txt python-dateutil==2.9.0.post0 # via @@ -190,19 +180,13 @@ python-dateutil==2.9.0.post0 # botocore python-memcached==1.62 # via -r requirements/test.txt -python-termstyle==0.1.10 - # via -r requirements/test.txt -pytz==2025.1 - # via -r requirements/test.txt -pywatchman==2.0.0 ; "linux" in sys_platform - # via -r requirements/dev.in pyyaml==6.0.2 # via # -r requirements/test.txt # edx-django-release-util -requests==2.32.3 +requests==2.32.4 # via -r requirements/test.txt -s3transfer==0.11.2 +s3transfer==0.13.0 # via # -r requirements/test.txt # boto3 @@ -215,36 +199,19 @@ sqlparse==0.5.3 # via # -r requirements/test.txt # django -stevedore==5.3.0 +stevedore==5.4.1 # via # -r requirements/test.txt # edx-django-utils -tomli==2.2.1 - # via - # -r requirements/ci.txt - # -r requirements/pip-tools.txt - # -r requirements/test.txt - # build - # coverage - # pip-tools - # pyproject-api - # pytest - # tox -tox==4.24.1 +tox==4.27.0 # via -r requirements/ci.txt -typing-extensions==4.12.2 - # via - # -r requirements/ci.txt - # -r requirements/test.txt - # asgiref - # tox -urllib3==1.26.20 +urllib3==2.2.3 # via # -c requirements/common_constraints.txt # -r requirements/test.txt # botocore # requests -virtualenv==20.29.2 +virtualenv==20.31.2 # via # -r requirements/ci.txt # tox @@ -252,10 +219,6 @@ wheel==0.45.1 # via # -r requirements/pip-tools.txt # pip-tools -zipp==3.20.2 - # via - # -r requirements/pip-tools.txt - # importlib-metadata # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 48de9589..990b4234 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -6,11 +6,9 @@ # build==1.2.2.post1 # via pip-tools -click==8.1.8 +click==8.2.1 # via pip-tools -importlib-metadata==8.5.0 - # via build -packaging==24.2 +packaging==25.0 # via build pip-tools==7.4.1 # via -r requirements/pip-tools.in @@ -18,14 +16,8 @@ pyproject-hooks==1.2.0 # via # build # pip-tools -tomli==2.2.1 - # via - # build - # pip-tools wheel==0.45.1 # via pip-tools -zipp==3.20.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 26517a3e..dabfa8f0 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -10,7 +10,7 @@ wheel==0.45.1 # The following packages are considered to be unsafe in a requirements file: pip==24.2 # via - # -c /home/runner/work/xqueue/xqueue/requirements/common_constraints.txt + # -c requirements/common_constraints.txt # -r requirements/pip.in -setuptools==75.3.0 +setuptools==80.9.0 # via -r requirements/pip.in diff --git a/requirements/quality.txt b/requirements/quality.txt index 122cedc7..12a5f8a5 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -1,8 +1,8 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -pycodestyle==2.12.1 +pycodestyle==2.14.0 # via -r requirements/quality.in diff --git a/requirements/test.txt b/requirements/test.txt index 097cebc0..e2b2f497 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.11 # by the following command: # # make upgrade @@ -10,19 +10,14 @@ asgiref==3.8.1 # django backoff==2.2.1 # via -r requirements/../requirements.txt -backports-zoneinfo==0.2.1 ; python_version < "3.9" - # via - # -c requirements/constraints.txt - # -r requirements/../requirements.txt - # django -boto3==1.36.21 +boto3==1.38.43 # via -r requirements/../requirements.txt -botocore==1.36.21 +botocore==1.38.43 # via # -r requirements/../requirements.txt # boto3 # s3transfer -certifi==2025.1.31 +certifi==2025.6.15 # via # -r requirements/../requirements.txt # requests @@ -30,15 +25,15 @@ cffi==1.17.1 # via # -r requirements/../requirements.txt # pynacl -charset-normalizer==3.4.1 +charset-normalizer==3.4.2 # via # -r requirements/../requirements.txt # requests -click==8.1.8 +click==8.2.1 # via # -r requirements/../requirements.txt # edx-django-utils -coverage[toml]==7.6.1 +coverage[toml]==7.9.1 # via pytest-cov # via # -c requirements/common_constraints.txt @@ -52,27 +47,25 @@ django-crum==0.7.9 # via # -r requirements/../requirements.txt # edx-django-utils -django-storages==1.14.4 +django-storages==1.14.6 # via -r requirements/../requirements.txt -django-waffle==4.2.0 +django-waffle==5.0.0 # via # -r requirements/../requirements.txt # edx-django-utils -edx-django-release-util==1.4.0 +edx-django-release-util==1.5.0 # via -r requirements/../requirements.txt -edx-django-utils==7.1.0 +edx-django-utils==8.0.0 # via -r requirements/../requirements.txt -exceptiongroup==1.2.2 - # via pytest gunicorn==23.0.0 # via -r requirements/../requirements.txt idna==3.10 # via # -r requirements/../requirements.txt # requests -iniconfig==2.0.0 +iniconfig==2.1.0 # via pytest -isort==5.13.2 +isort==6.0.1 # via -r requirements/../requirements.txt jmespath==1.0.1 # via @@ -81,23 +74,23 @@ jmespath==1.0.1 # botocore mysqlclient==2.2.7 # via -r requirements/../requirements.txt -newrelic==10.6.0 - # via - # -r requirements/../requirements.txt - # edx-django-utils -packaging==24.2 +newrelic==10.14.0 + # via -r requirements/../requirements.txt +packaging==25.0 # via # -r requirements/../requirements.txt # gunicorn # pytest -path-py==11.0.1 +path==17.1.0 # via -r requirements/../requirements.txt pbr==6.1.1 # via # -r requirements/../requirements.txt # stevedore -pluggy==1.5.0 - # via pytest +pluggy==1.6.0 + # via + # pytest + # pytest-cov psutil==7.0.0 # via # -r requirements/../requirements.txt @@ -106,18 +99,20 @@ pycparser==2.22 # via # -r requirements/../requirements.txt # cffi +pygments==2.19.2 + # via pytest pynacl==1.5.0 # via # -r requirements/../requirements.txt # edx-django-utils -pytest==8.3.4 +pytest==8.4.1 # via # -r requirements/test.in # pytest-cov # pytest-django -pytest-cov==5.0.0 +pytest-cov==6.2.1 # via -r requirements/test.in -pytest-django==4.10.0 +pytest-django==4.11.1 # via -r requirements/test.in python-dateutil==2.9.0.post0 # via @@ -125,17 +120,13 @@ python-dateutil==2.9.0.post0 # botocore python-memcached==1.62 # via -r requirements/../requirements.txt -python-termstyle==0.1.10 - # via -r requirements/../requirements.txt -pytz==2025.1 - # via -r requirements/../requirements.txt pyyaml==6.0.2 # via # -r requirements/../requirements.txt # edx-django-release-util -requests==2.32.3 +requests==2.32.4 # via -r requirements/../requirements.txt -s3transfer==0.11.2 +s3transfer==0.13.0 # via # -r requirements/../requirements.txt # boto3 @@ -148,19 +139,11 @@ sqlparse==0.5.3 # via # -r requirements/../requirements.txt # django -stevedore==5.3.0 +stevedore==5.4.1 # via # -r requirements/../requirements.txt # edx-django-utils -tomli==2.2.1 - # via - # coverage - # pytest -typing-extensions==4.12.2 - # via - # -r requirements/../requirements.txt - # asgiref -urllib3==1.26.20 +urllib3==2.2.3 # via # -c requirements/common_constraints.txt # -r requirements/../requirements.txt diff --git a/submission_queue/management/commands/delete_old_submissions.py b/submission_queue/management/commands/delete_old_submissions.py index 6c1d36e3..c7fc107e 100644 --- a/submission_queue/management/commands/delete_old_submissions.py +++ b/submission_queue/management/commands/delete_old_submissions.py @@ -5,12 +5,13 @@ import logging import time from datetime import datetime, timedelta -from submission_queue.models import Submission +from zoneinfo import ZoneInfo -import pytz from django.core.management.base import BaseCommand, CommandError from django.db import transaction +from submission_queue.models import Submission + log = logging.getLogger(__name__) @@ -63,7 +64,7 @@ def handle(self, *args, **options): if days_old < 0: raise CommandError(f'Only non-negative days old is allowed ({days_old}).') - delete_date = datetime.now(pytz.utc) - timedelta(days=days_old) + delete_date = datetime.now(ZoneInfo("UTC")) - timedelta(days=days_old) old_submissions = Submission.objects.filter(arrival_time__lte=delete_date) total_old_submissions = old_submissions.count() diff --git a/submission_queue/management/commands/tests/__init__.py b/submission_queue/management/commands/tests/__init__.py index e87d739f..6d2627c5 100644 --- a/submission_queue/management/commands/tests/__init__.py +++ b/submission_queue/management/commands/tests/__init__.py @@ -1,13 +1,13 @@ from datetime import datetime, timedelta -from submission_queue.models import Submission +from zoneinfo import ZoneInfo -import pytz +from submission_queue.models import Submission def bulk_create_submissions(count=1, days_old=10, **create_params): for i in range(count): submission = create_submission(**create_params) - actual_arrival_time = datetime.now(pytz.utc) - timedelta(days=days_old) + actual_arrival_time = datetime.now(ZoneInfo("UTC")) - timedelta(days=days_old) Submission.objects.filter(pk=submission.id).update(arrival_time=actual_arrival_time) diff --git a/submission_queue/migrations/0005_rename_submission_queue_name_retired_push_time_arrival_time_queue_submi_queue_n_4c6cd5_idx_and_more.py b/submission_queue/migrations/0005_rename_submission_queue_name_retired_push_time_arrival_time_queue_submi_queue_n_4c6cd5_idx_and_more.py new file mode 100644 index 00000000..9bccd020 --- /dev/null +++ b/submission_queue/migrations/0005_rename_submission_queue_name_retired_push_time_arrival_time_queue_submi_queue_n_4c6cd5_idx_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 5.2.3 on 2025-06-25 06:10 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('submission_queue', '0004_remove_queue_name_index'), + ] + + operations = [ + migrations.RenameIndex( + model_name='submission', + new_name='queue_submi_queue_n_4c6cd5_idx', + old_fields=('queue_name', 'retired', 'push_time', 'arrival_time'), + ), + migrations.RenameIndex( + model_name='submission', + new_name='queue_submi_lms_cal_367510_idx', + old_fields=('lms_callback_url', 'retired'), + ), + migrations.RenameIndex( + model_name='submission', + new_name='queue_submi_queue_n_9fcfbd_idx', + old_fields=('queue_name', 'retired', 'pull_time', 'arrival_time'), + ), + ] diff --git a/submission_queue/models.py b/submission_queue/models.py index 8c91477f..cc263a20 100644 --- a/submission_queue/models.py +++ b/submission_queue/models.py @@ -6,8 +6,8 @@ """ import json from datetime import datetime, timedelta +from zoneinfo import ZoneInfo -import pytz from django.conf import settings from django.db import models from django.db.models import Q @@ -73,7 +73,7 @@ def time_filter(self, time_field=None): if time_field not in ['push_time', 'pull_time']: raise ValueError(f'time_field must be pull_time or push_time not ({time_field})') - previous_update = datetime.now(pytz.utc) - timedelta(minutes=settings.SUBMISSION_PROCESSING_DELAY) + previous_update = datetime.now(ZoneInfo("UTC")) - timedelta(minutes=settings.SUBMISSION_PROCESSING_DELAY) if time_field == "push_time": time_filter = Q(push_time__lte=(previous_update)) | Q(push_time__isnull=True) elif time_field == "pull_time": @@ -90,9 +90,7 @@ class Submission(models.Model): class Meta: # Once we get to Django 1.11 use indexes, it would have allowed a better index name # https://docs.djangoproject.com/en/1.11/ref/models/options/#django.db.models.Options.indexes - index_together = [('queue_name', 'retired', 'push_time', 'arrival_time'), - ('queue_name', 'retired', 'pull_time', 'arrival_time'), - ('lms_callback_url', 'retired')] + indexes = [models.Index(fields=("queue_name", "retired", "push_time", "arrival_time")), models.Index(fields=("queue_name", "retired", "pull_time", "arrival_time")), models.Index(fields=("lms_callback_url", "retired"))] db_table = 'queue_submission' # Submission diff --git a/tox.ini b/tox.ini index 93664285..8ab2fb21 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{311,312}-django{42},py{311,312}-quality +envlist = py{311,312}-django{42,52},py{311,312}-quality skipsdist = True [pycodestyle] @@ -14,6 +14,7 @@ norecursedirs = .* jenkins load_tests log reports script test_framework xqueue [testenv] deps = django42: Django>=4.2,<5.0 + django52: Django>=5.2,<6.0 -r{toxinidir}/requirements/test.txt passenv = DB_HOST @@ -22,7 +23,7 @@ allowlist_externals = commands = make test -[testenv:py{38,312}-quality] +[testenv:py{311,312}-quality] deps = -r{toxinidir}/requirements/quality.txt allowlist_externals = diff --git a/xqueue/settings.py b/xqueue/settings.py index b7d0674b..3f7c9e83 100644 --- a/xqueue/settings.py +++ b/xqueue/settings.py @@ -71,18 +71,10 @@ # to load the internationalization machinery. USE_I18N = True -# If you set this to False, Django will not format dates, numbers and -# calendars according to the current locale. -USE_L10N = True # If you set this to False, Django will not use timezone-aware datetimes. USE_TZ = True -# Django 4.0+ uses zoneinfo if this is not set. We can remove this and -# migrate to zoneinfo after Django 4.2 upgrade. See more on following url -# https://docs.djangoproject.com/en/4.2/releases/4.0/#zoneinfo-default-timezone-implementation -USE_DEPRECATED_PYTZ = True - # Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/home/media/media.lawrence.com/media/" MEDIA_ROOT = '' diff --git a/xqueue/test_settings.py b/xqueue/test_settings.py index 3b4b3d17..d27fddda 100644 --- a/xqueue/test_settings.py +++ b/xqueue/test_settings.py @@ -21,7 +21,7 @@ 'PASSWORD': os.environ.get('DB_PASSWORD', ''), # pytest/django TestCase instances auto-prefix test_ onto the NAME 'NAME': 'xqueue', - 'HOST': os.environ.get('DB_HOST', 'edx.devstack.mysql57'), + 'HOST': os.environ.get('DB_HOST', 'edx.devstack.mysql80'), # Wrap all view methods in an atomic transaction automatically. 'ATOMIC_REQUESTS': True }