diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5708dccf94..0c98ff19ec 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,13 +26,13 @@ concurrency: # - django 5.0, python 3.11, sqlite, WAGTAIL_CHECK_TEMPLATE_NUMBER_FORMAT=1 # - django 5.1, python 3.12, mysql:8.4, parallel, USE_EMAIL_USER_MODEL=yes # - django 5.1, python 3.12, mariadb:11.4, USE_EMAIL_USER_MODEL=yes -# - django 5.1, python 3.12, sqlite, parallel, USE_EMAIL_USER_MODEL=yes -# - django 5.1, python 3.12, postgres:15, psycopg 3, parallel, DISABLE_TIMEZONE=yes +# - django 5.1, python 3.13, sqlite, parallel, USE_EMAIL_USER_MODEL=yes +# - django 5.1, python 3.13, postgres:15, psycopg 3, parallel, DISABLE_TIMEZONE=yes # - django stable/5.1.x, python 3.11, postgres:15, psycopg 3 (allow failures) -# - django main, python 3.12, postgres:latest, psycopg 3, parallel (allow failures) +# - django main, python 3.13, postgres:latest, psycopg 3, parallel (allow failures) # - elasticsearch 7, django 4.2, python 3.9, postgres:latest, psycopg 2 # - opensearch 2, django 5.0, python 3.10, sqlite -# - elasticsearch 8, django 5.1, python 3.12, sqlite, USE_EMAIL_USER_MODEL=yes +# - elasticsearch 8, django 5.1, python 3.13, sqlite, USE_EMAIL_USER_MODEL=yes # Some tests are run in parallel by passing --parallel to runtests.py. # When running tests in parallel, some errors cannot be pickled and result in @@ -52,7 +52,7 @@ jobs: - python: '3.11' django: 'Django>=5.0,<5.1' check_template_number_format: '1' - - python: '3.12' + - python: '3.13' django: 'Django>=5.1,<5.2' emailuser: emailuser parallel: '--parallel' @@ -95,7 +95,7 @@ jobs: psycopg: 'psycopg2>=2.6' experimental: false parallel: '--parallel' - - python: '3.12' + - python: '3.13' django: 'Django>=5.0,<5.1' psycopg: 'psycopg>=3.1.8' postgres: 'postgres:15' @@ -107,7 +107,7 @@ jobs: psycopg: 'psycopg>=3.1.8' postgres: 'postgres:15' experimental: true - - python: '3.12' + - python: '3.13' django: 'git+https://github.com/django/django.git@main#egg=Django' psycopg: 'psycopg>=3.1.8' experimental: true @@ -227,7 +227,7 @@ jobs: strategy: matrix: include: - - python: '3.12' + - python: '3.13' django: 'Django>=5.1,<5.2' emailuser: emailuser steps: diff --git a/CHANGELOG.txt b/CHANGELOG.txt index f7bad3ca88..aec700a761 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -16,6 +16,7 @@ Changelog * Add search and filters to form pages listing (Sage Abdullah) * Deprecate the `WAGTAIL_AUTO_UPDATE_PREVIEW` setting, use `WAGTAIL_AUTO_UPDATE_PREVIEW_INTERVAL = 0` instead (Sage Abdullah) * Consistently use `capfirst` for title-casing model verbose names (Sébastien Corbin) + * Add support for Python 3.13 (Matt Westcott) * Fire `copy_for_translation_done` signal when copying translatable models as well as pages (Coen van der Kamp) * Fix: Prevent page type business rules from blocking reordering of pages (Andy Babic, Sage Abdullah) * Fix: Improve layout of object permissions table (Sage Abdullah) diff --git a/README.md b/README.md index b98fc7fa01..cf45eb93b9 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ _(If you are reading this on GitHub, the details here may not be indicative of t Wagtail supports: - Django 4.2.x, 5.0.x and 5.1.x -- Python 3.9, 3.10, 3.11 and 3.12 +- Python 3.9, 3.10, 3.11, 3.12 and 3.13 - PostgreSQL, MySQL, MariaDB and SQLite (with JSON1) as database backends [Previous versions of Wagtail](https://docs.wagtail.org/en/stable/releases/upgrading.html#compatible-django-python-versions) additionally supported Python 2.7, 3.8 and earlier Django versions. diff --git a/docs/releases/6.3.md b/docs/releases/6.3.md index 0d0bc54ac4..1fad8cf556 100644 --- a/docs/releases/6.3.md +++ b/docs/releases/6.3.md @@ -11,6 +11,10 @@ depth: 1 ## What's new +### Python 3.13 support + +This release adds formal support for Python 3.13. + ### Django 5.1 support This release adds formal support for Django 5.1. diff --git a/docs/releases/upgrading.md b/docs/releases/upgrading.md index 2753f6fb7e..c330b94471 100644 --- a/docs/releases/upgrading.md +++ b/docs/releases/upgrading.md @@ -57,57 +57,57 @@ New feature releases frequently add support for newer versions of Django and Pyt The compatible versions of Django and Python for each Wagtail release are: -| Wagtail release | Compatible Django versions | Compatible Python versions | -| --------------- | -------------------------- | -------------------------- | -| 6.3 | 4.2, 5.0, 5.1 | 3.9, 3.10, 3.11, 3.12 | -| 6.2 | 4.2, 5.0 | 3.8, 3.9, 3.10, 3.11, 3.12 | -| 6.1 | 4.2, 5.0 | 3.8, 3.9, 3.10, 3.11, 3.12 | -| 6.0 | 4.2, 5.0 | 3.8, 3.9, 3.10, 3.11, 3.12 | -| 5.2 LTS | 3.2, 4.1, 4.2, 5.0[^*] | 3.8, 3.9, 3.10, 3.11, 3.12 | -| 5.1 | 3.2, 4.1, 4.2 | 3.8, 3.9, 3.10, 3.11 | -| 5.0 | 3.2, 4.1, 4.2 | 3.7, 3.8, 3.9, 3.10, 3.11 | -| 4.2 | 3.2, 4.0, 4.1 | 3.7, 3.8, 3.9, 3.10, 3.11 | -| 4.1 LTS | 3.2, 4.0, 4.1 | 3.7, 3.8, 3.9, 3.10, 3.11 | -| 4.0 | 3.2, 4.0, 4.1 | 3.7, 3.8, 3.9, 3.10 | -| 3.0 | 3.2, 4.0 | 3.7, 3.8, 3.9, 3.10 | -| 2.16 | 3.2, 4.0 | 3.7, 3.8, 3.9, 3.10 | -| 2.15 LTS | 3.0, 3.1, 3.2 | 3.6, 3.7, 3.8, 3.9, 3.10 | -| 2.14 | 3.0, 3.1, 3.2 | 3.6, 3.7, 3.8, 3.9 | -| 2.13 | 2.2, 3.0, 3.1, 3.2 | 3.6, 3.7, 3.8, 3.9 | -| 2.12 | 2.2, 3.0, 3.1 | 3.6, 3.7, 3.8, 3.9 | -| 2.11 LTS | 2.2, 3.0, 3.1 | 3.6, 3.7, 3.8 | -| 2.10 | 2.2, 3.0, 3.1 | 3.6, 3.7, 3.8 | -| 2.9 | 2.2, 3.0 | 3.5, 3.6, 3.7, 3.8 | -| 2.8 | 2.1, 2.2, 3.0 | 3.5, 3.6, 3.7, 3.8 | -| 2.7 LTS | 2.0, 2.1, 2.2 | 3.5, 3.6, 3.7, 3.8 | -| 2.6 | 2.0, 2.1, 2.2 | 3.5, 3.6, 3.7 | -| 2.5 | 2.0, 2.1, 2.2 | 3.4, 3.5, 3.6, 3.7 | -| 2.4 | 2.0, 2.1 | 3.4, 3.5, 3.6, 3.7 | -| 2.3 LTS | 1.11, 2.0, 2.1 | 3.4, 3.5, 3.6 | -| 2.2 | 1.11, 2.0 | 3.4, 3.5, 3.6 | -| 2.1 | 1.11, 2.0 | 3.4, 3.5, 3.6 | -| 2.0 | 1.11, 2.0 | 3.4, 3.5, 3.6 | -| 1.13 LTS | 1.8, 1.10, 1.11 | 2.7, 3.4, 3.5, 3.6 | -| 1.12 LTS | 1.8, 1.10, 1.11 | 2.7, 3.4, 3.5, 3.6 | -| 1.11 | 1.8, 1.10, 1.11 | 2.7, 3.4, 3.5, 3.6 | -| 1.10 | 1.8, 1.10, 1.11 | 2.7, 3.4, 3.5, 3.6 | -| 1.9 | 1.8, 1.9, 1.10 | 2.7, 3.3, 3.4, 3.5 | -| 1.8 LTS | 1.8, 1.9, 1.10 | 2.7, 3.3, 3.4, 3.5 | -| 1.7 | 1.8, 1.9, 1.10 | 2.7, 3.3, 3.4, 3.5 | -| 1.6 | 1.8, 1.9, 1.10 | 2.7, 3.3, 3.4, 3.5 | -| 1.5 | 1.8, 1.9 | 2.7, 3.3, 3.4, 3.5 | -| 1.4 LTS | 1.8, 1.9 | 2.7, 3.3, 3.4, 3.5 | -| 1.3 | 1.7, 1.8, 1.9 | 2.7, 3.3, 3.4, 3.5 | -| 1.2 | 1.7, 1.8 | 2.7, 3.3, 3.4, 3.5 | -| 1.1 | 1.7, 1.8 | 2.7, 3.3, 3.4 | -| 1.0 | 1.7, 1.8 | 2.7, 3.3, 3.4 | -| 0.8 LTS | 1.6, 1.7 | 2.6, 2.7, 3.2, 3.3, 3.4 | -| 0.7 | 1.6, 1.7 | 2.6, 2.7, 3.2, 3.3, 3.4 | -| 0.6 | 1.6, 1.7 | 2.6, 2.7, 3.2, 3.3, 3.4 | -| 0.5 | 1.6 | 2.6, 2.7, 3.2, 3.3, 3.4 | -| 0.4 | 1.6 | 2.6, 2.7, 3.2, 3.3, 3.4 | -| 0.3 | 1.6 | 2.6, 2.7 | -| 0.2 | 1.6 | 2.7 | -| 0.1 | 1.6 | 2.7 | +| Wagtail release | Compatible Django versions | Compatible Python versions | +| --------------- | -------------------------- | --------------------------- | +| 6.3 | 4.2, 5.0, 5.1 | 3.9, 3.10, 3.11, 3.12, 3.13 | +| 6.2 | 4.2, 5.0 | 3.8, 3.9, 3.10, 3.11, 3.12 | +| 6.1 | 4.2, 5.0 | 3.8, 3.9, 3.10, 3.11, 3.12 | +| 6.0 | 4.2, 5.0 | 3.8, 3.9, 3.10, 3.11, 3.12 | +| 5.2 LTS | 3.2, 4.1, 4.2, 5.0[^*] | 3.8, 3.9, 3.10, 3.11, 3.12 | +| 5.1 | 3.2, 4.1, 4.2 | 3.8, 3.9, 3.10, 3.11 | +| 5.0 | 3.2, 4.1, 4.2 | 3.7, 3.8, 3.9, 3.10, 3.11 | +| 4.2 | 3.2, 4.0, 4.1 | 3.7, 3.8, 3.9, 3.10, 3.11 | +| 4.1 LTS | 3.2, 4.0, 4.1 | 3.7, 3.8, 3.9, 3.10, 3.11 | +| 4.0 | 3.2, 4.0, 4.1 | 3.7, 3.8, 3.9, 3.10 | +| 3.0 | 3.2, 4.0 | 3.7, 3.8, 3.9, 3.10 | +| 2.16 | 3.2, 4.0 | 3.7, 3.8, 3.9, 3.10 | +| 2.15 LTS | 3.0, 3.1, 3.2 | 3.6, 3.7, 3.8, 3.9, 3.10 | +| 2.14 | 3.0, 3.1, 3.2 | 3.6, 3.7, 3.8, 3.9 | +| 2.13 | 2.2, 3.0, 3.1, 3.2 | 3.6, 3.7, 3.8, 3.9 | +| 2.12 | 2.2, 3.0, 3.1 | 3.6, 3.7, 3.8, 3.9 | +| 2.11 LTS | 2.2, 3.0, 3.1 | 3.6, 3.7, 3.8 | +| 2.10 | 2.2, 3.0, 3.1 | 3.6, 3.7, 3.8 | +| 2.9 | 2.2, 3.0 | 3.5, 3.6, 3.7, 3.8 | +| 2.8 | 2.1, 2.2, 3.0 | 3.5, 3.6, 3.7, 3.8 | +| 2.7 LTS | 2.0, 2.1, 2.2 | 3.5, 3.6, 3.7, 3.8 | +| 2.6 | 2.0, 2.1, 2.2 | 3.5, 3.6, 3.7 | +| 2.5 | 2.0, 2.1, 2.2 | 3.4, 3.5, 3.6, 3.7 | +| 2.4 | 2.0, 2.1 | 3.4, 3.5, 3.6, 3.7 | +| 2.3 LTS | 1.11, 2.0, 2.1 | 3.4, 3.5, 3.6 | +| 2.2 | 1.11, 2.0 | 3.4, 3.5, 3.6 | +| 2.1 | 1.11, 2.0 | 3.4, 3.5, 3.6 | +| 2.0 | 1.11, 2.0 | 3.4, 3.5, 3.6 | +| 1.13 LTS | 1.8, 1.10, 1.11 | 2.7, 3.4, 3.5, 3.6 | +| 1.12 LTS | 1.8, 1.10, 1.11 | 2.7, 3.4, 3.5, 3.6 | +| 1.11 | 1.8, 1.10, 1.11 | 2.7, 3.4, 3.5, 3.6 | +| 1.10 | 1.8, 1.10, 1.11 | 2.7, 3.4, 3.5, 3.6 | +| 1.9 | 1.8, 1.9, 1.10 | 2.7, 3.3, 3.4, 3.5 | +| 1.8 LTS | 1.8, 1.9, 1.10 | 2.7, 3.3, 3.4, 3.5 | +| 1.7 | 1.8, 1.9, 1.10 | 2.7, 3.3, 3.4, 3.5 | +| 1.6 | 1.8, 1.9, 1.10 | 2.7, 3.3, 3.4, 3.5 | +| 1.5 | 1.8, 1.9 | 2.7, 3.3, 3.4, 3.5 | +| 1.4 LTS | 1.8, 1.9 | 2.7, 3.3, 3.4, 3.5 | +| 1.3 | 1.7, 1.8, 1.9 | 2.7, 3.3, 3.4, 3.5 | +| 1.2 | 1.7, 1.8 | 2.7, 3.3, 3.4, 3.5 | +| 1.1 | 1.7, 1.8 | 2.7, 3.3, 3.4 | +| 1.0 | 1.7, 1.8 | 2.7, 3.3, 3.4 | +| 0.8 LTS | 1.6, 1.7 | 2.6, 2.7, 3.2, 3.3, 3.4 | +| 0.7 | 1.6, 1.7 | 2.6, 2.7, 3.2, 3.3, 3.4 | +| 0.6 | 1.6, 1.7 | 2.6, 2.7, 3.2, 3.3, 3.4 | +| 0.5 | 1.6 | 2.6, 2.7, 3.2, 3.3, 3.4 | +| 0.4 | 1.6 | 2.6, 2.7, 3.2, 3.3, 3.4 | +| 0.3 | 1.6 | 2.6, 2.7 | +| 0.2 | 1.6 | 2.7 | +| 0.1 | 1.6 | 2.7 | [^*]: Added in a patch release diff --git a/setup.py b/setup.py index 2288492ed6..fd3cf7d6c9 100755 --- a/setup.py +++ b/setup.py @@ -111,6 +111,7 @@ https://github.com/wagtail/wagtail/.", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Framework :: Django", "Framework :: Django :: 4.2", "Framework :: Django :: 5.0", diff --git a/tox.ini b/tox.ini index 0f8ffe5fb4..025656f8c9 100644 --- a/tox.ini +++ b/tox.ini @@ -2,7 +2,7 @@ skipsdist = True usedevelop = True -envlist = py{39,310,311,312}-dj{42,50,51,51stable,main}-{sqlite,postgres,mysql,mssql}-{elasticsearch8,elasticsearch7,noelasticsearch}-{customuser,emailuser}-{tz,notz}, +envlist = py{39,310,311,312,313}-dj{42,50,51,51stable,main}-{sqlite,postgres,mysql,mssql}-{elasticsearch8,elasticsearch7,noelasticsearch}-{customuser,emailuser}-{tz,notz}, [testenv] install_command = pip install -e ".[testing]" -U {opts} {packages} @@ -16,6 +16,7 @@ basepython = py310: python3.10 py311: python3.11 py312: python3.12 + py313: python3.13 deps = django-sendfile==0.3.6