From fd86564e299158dc3b1a2c8a18f46c7e9e0df4f1 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 6 Mar 2026 14:44:36 -0500 Subject: [PATCH 1/7] chore: drop Python 3.11 support Removes Python 3.11 from CI matrix, publish_pypi workflow, tox envlist, and setup.py classifiers. Part of https://github.com/openedx/public-engineering/issues/499 --- .github/workflows/ci.yml | 1 - .github/workflows/publish_pypi.yml | 2 +- setup.py | 1 - tox.ini | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec374e1..bf7b2f9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,6 @@ jobs: matrix: os: [ubuntu-latest] python-version: - - '3.11' - '3.12' toxenv: [quality, docs, django42-drflatest, django52-drflatest, check_keywords] steps: diff --git a/.github/workflows/publish_pypi.yml b/.github/workflows/publish_pypi.yml index 40f5421..77889a1 100644 --- a/.github/workflows/publish_pypi.yml +++ b/.github/workflows/publish_pypi.yml @@ -16,7 +16,7 @@ jobs: - name: setup python uses: actions/setup-python@v6 with: - python-version: 3.11 + python-version: 3.12 - name: Install pip run: pip install -r requirements/pip.txt diff --git a/setup.py b/setup.py index 401e9fd..d04595e 100644 --- a/setup.py +++ b/setup.py @@ -152,7 +152,6 @@ def is_requirement(line): 'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)', 'Natural Language :: English', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', ], ) diff --git a/tox.ini b/tox.ini index ca3f3ae..437041e 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{311, 312}-django{42, 52}-drf{latest},quality,docs +envlist = py{312}-django{42, 52}-drf{latest},quality,docs [pycodestyle] exclude = .git,.tox,migrations From 04ce177f9cb2c2d79e1598a6eae2106d30c42359 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 6 Mar 2026 14:48:44 -0500 Subject: [PATCH 2/7] chore: update requirements for Python 3.12 Regenerated all pinned requirements files using Python 3.12. --- requirements/base.txt | 18 +++++----- requirements/ci.txt | 22 +++++++----- requirements/dev.txt | 73 +++++++++++++++++++++----------------- requirements/doc.txt | 70 +++++++++++++++++------------------- requirements/pip-tools.txt | 16 +++++---- requirements/pip.txt | 10 +++--- requirements/quality.txt | 42 +++++++++++----------- requirements/test.txt | 24 ++++++------- 8 files changed, 142 insertions(+), 133 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index e51cab8..dc9f542 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,16 +1,16 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -asgiref==3.10.0 +asgiref==3.11.1 # via django cffi==2.0.0 # via pynacl -click==8.3.0 +click==8.3.1 # via edx-django-utils -django==4.2.25 +django==5.2.12 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/base.in @@ -26,13 +26,13 @@ djangorestframework==3.16.1 # via -r requirements/base.in edx-django-utils==8.0.1 # via -r requirements/base.in -psutil==7.1.1 +psutil==7.2.2 # via edx-django-utils -pycparser==2.23 +pycparser==3.0 # via cffi -pynacl==1.6.0 +pynacl==1.6.2 # via edx-django-utils -sqlparse==0.5.3 +sqlparse==0.5.5 # via django -stevedore==5.5.0 +stevedore==5.7.0 # via edx-django-utils diff --git a/requirements/ci.txt b/requirements/ci.txt index 6555e14..ae0016f 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -1,34 +1,38 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -cachetools==6.2.1 - # via tox -chardet==5.2.0 +cachetools==7.0.3 # via tox colorama==0.4.6 # via tox distlib==0.4.0 # via virtualenv -filelock==3.20.0 +filelock==3.25.0 # via + # python-discovery # tox # virtualenv -packaging==25.0 +packaging==26.0 # via # pyproject-api # tox -platformdirs==4.5.0 +platformdirs==4.9.4 # via + # python-discovery # tox # virtualenv pluggy==1.6.0 # via tox pyproject-api==1.10.0 # via tox -tox==4.31.0 +python-discovery==1.1.0 + # via virtualenv +tomli-w==1.2.0 + # via tox +tox==4.48.1 # via -r requirements/ci.in -virtualenv==20.35.3 +virtualenv==21.1.0 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index a4cc597..3fa2f43 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,23 +1,23 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -asgiref==3.10.0 +asgiref==3.11.1 # via # -r requirements/quality.txt # django -astroid==3.3.11 +astroid==4.0.4 # via # -r requirements/quality.txt # pylint # pylint-celery -build==1.3.0 +build==1.4.0 # via # -r requirements/pip-tools.txt # pip-tools -cachetools==6.2.1 +cachetools==7.0.3 # via # -r requirements/ci.txt # tox @@ -25,11 +25,7 @@ cffi==2.0.0 # via # -r requirements/quality.txt # pynacl -chardet==5.2.0 - # via - # -r requirements/ci.txt - # tox -click==8.3.0 +click==8.3.1 # via # -r requirements/pip-tools.txt # -r requirements/quality.txt @@ -42,7 +38,7 @@ click-log==0.4.0 # via # -r requirements/quality.txt # edx-lint -code-annotations==2.3.0 +code-annotations==2.3.2 # via # -r requirements/quality.txt # edx-lint @@ -50,13 +46,13 @@ colorama==0.4.6 # via # -r requirements/ci.txt # tox -coverage[toml]==7.11.0 +coverage[toml]==7.13.4 # via # -r requirements/quality.txt # pytest-cov ddt==1.7.2 # via -r requirements/quality.txt -dill==0.4.0 +dill==0.4.1 # via # -r requirements/quality.txt # pylint @@ -64,7 +60,7 @@ distlib==0.4.0 # via # -r requirements/ci.txt # virtualenv -django==4.2.25 +django==5.2.12 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/quality.txt @@ -92,9 +88,10 @@ edx-i18n-tools==1.9.0 # via -r requirements/dev.in edx-lint==5.6.0 # via -r requirements/quality.txt -filelock==3.20.0 +filelock==3.25.0 # via # -r requirements/ci.txt + # python-discovery # tox # virtualenv freezegun==1.5.5 @@ -103,7 +100,7 @@ iniconfig==2.3.0 # via # -r requirements/quality.txt # pytest -isort==6.1.0 +isort==8.0.1 # via # -r requirements/quality.txt # pylint @@ -115,7 +112,7 @@ lxml[html-clean]==6.0.2 # via # edx-i18n-tools # lxml-html-clean -lxml-html-clean==0.4.3 +lxml-html-clean==0.4.4 # via lxml markupsafe==3.0.3 # via @@ -125,7 +122,7 @@ mccabe==0.7.0 # via # -r requirements/quality.txt # pylint -packaging==25.0 +packaging==26.0 # via # -r requirements/ci.txt # -r requirements/pip-tools.txt @@ -134,15 +131,17 @@ packaging==25.0 # pyproject-api # pytest # tox + # wheel path==16.16.0 # via edx-i18n-tools -pip-tools==7.5.1 +pip-tools==7.5.3 # via -r requirements/pip-tools.txt -platformdirs==4.5.0 +platformdirs==4.9.4 # via # -r requirements/ci.txt # -r requirements/quality.txt # pylint + # python-discovery # tox # virtualenv pluggy==1.6.0 @@ -154,13 +153,13 @@ pluggy==1.6.0 # tox polib==1.2.0 # via edx-i18n-tools -psutil==7.1.1 +psutil==7.2.2 # via # -r requirements/quality.txt # edx-django-utils pycodestyle==2.14.0 # via -r requirements/quality.txt -pycparser==2.23 +pycparser==3.0 # via # -r requirements/quality.txt # cffi @@ -170,7 +169,7 @@ pygments==2.19.2 # via # -r requirements/quality.txt # pytest -pylint==3.3.9 +pylint==4.0.5 # via # -r requirements/quality.txt # edx-lint @@ -181,7 +180,7 @@ pylint-celery==0.3 # via # -r requirements/quality.txt # edx-lint -pylint-django==2.6.1 +pylint-django==2.7.0 # via # -r requirements/quality.txt # edx-lint @@ -190,7 +189,7 @@ pylint-plugin-utils==0.9.0 # -r requirements/quality.txt # pylint-celery # pylint-django -pynacl==1.6.0 +pynacl==1.6.2 # via # -r requirements/quality.txt # edx-django-utils @@ -203,19 +202,23 @@ pyproject-hooks==1.2.0 # -r requirements/pip-tools.txt # build # pip-tools -pytest==8.4.2 +pytest==9.0.2 # via # -r requirements/quality.txt # pytest-cov # pytest-django pytest-cov==7.0.0 # via -r requirements/quality.txt -pytest-django==4.11.1 +pytest-django==4.12.0 # via -r requirements/quality.txt python-dateutil==2.9.0.post0 # via # -r requirements/quality.txt # freezegun +python-discovery==1.1.0 + # via + # -r requirements/ci.txt + # virtualenv python-slugify==8.0.4 # via # -r requirements/quality.txt @@ -236,11 +239,11 @@ snowballstemmer==3.0.1 # via # -r requirements/quality.txt # pydocstyle -sqlparse==0.5.3 +sqlparse==0.5.5 # via # -r requirements/quality.txt # django -stevedore==5.5.0 +stevedore==5.7.0 # via # -r requirements/quality.txt # code-annotations @@ -249,17 +252,21 @@ text-unidecode==1.3 # via # -r requirements/quality.txt # python-slugify -tomlkit==0.13.3 +tomli-w==1.2.0 + # via + # -r requirements/ci.txt + # tox +tomlkit==0.14.0 # via # -r requirements/quality.txt # pylint -tox==4.31.0 +tox==4.48.1 # via -r requirements/ci.txt -virtualenv==20.35.3 +virtualenv==21.1.0 # via # -r requirements/ci.txt # tox -wheel==0.45.1 +wheel==0.46.3 # via # -r requirements/pip-tools.txt # pip-tools diff --git a/requirements/doc.txt b/requirements/doc.txt index fcbe69e..b835f56 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -8,40 +8,38 @@ accessible-pygments==0.0.5 # via pydata-sphinx-theme alabaster==1.0.0 # via sphinx -asgiref==3.10.0 +asgiref==3.11.1 # via # -r requirements/test.txt # django -babel==2.17.0 +babel==2.18.0 # via # pydata-sphinx-theme # sphinx -backports-tarfile==1.2.0 - # via jaraco-context -beautifulsoup4==4.14.2 +beautifulsoup4==4.14.3 # via pydata-sphinx-theme -certifi==2025.10.5 +certifi==2026.2.25 # via requests cffi==2.0.0 # via # -r requirements/test.txt # cryptography # pynacl -charset-normalizer==3.4.4 +charset-normalizer==3.4.5 # via requests -click==8.3.0 +click==8.3.1 # via # -r requirements/test.txt # edx-django-utils -coverage[toml]==7.11.0 +coverage[toml]==7.13.4 # via # -r requirements/test.txt # pytest-cov -cryptography==46.0.3 +cryptography==46.0.5 # via secretstorage ddt==1.7.2 # via -r requirements/test.txt -django==4.2.25 +django==5.2.12 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/test.txt @@ -60,7 +58,7 @@ django-waffle==5.0.0 # edx-django-utils djangorestframework==3.16.1 # via -r requirements/test.txt -docutils==0.21.2 +docutils==0.22.4 # via # pydata-sphinx-theme # readme-renderer @@ -71,23 +69,21 @@ edx-django-utils==8.0.1 # via -r requirements/test.txt freezegun==1.5.5 # via -r requirements/test.txt -id==1.5.0 +id==1.6.1 # via twine idna==3.11 # via requests -imagesize==1.4.1 +imagesize==2.0.0 # via sphinx -importlib-metadata==8.7.0 - # via keyring iniconfig==2.3.0 # via # -r requirements/test.txt # pytest jaraco-classes==3.4.0 # via keyring -jaraco-context==6.0.1 +jaraco-context==6.1.0 # via keyring -jaraco-functools==4.3.0 +jaraco-functools==4.4.0 # via keyring jeepney==0.9.0 # via @@ -95,7 +91,7 @@ jeepney==0.9.0 # secretstorage jinja2==3.1.6 # via sphinx -keyring==25.6.0 +keyring==25.7.0 # via twine markdown-it-py==4.0.0 # via rich @@ -107,9 +103,9 @@ more-itertools==10.8.0 # via # jaraco-classes # jaraco-functools -nh3==0.3.1 +nh3==0.3.3 # via readme-renderer -packaging==25.0 +packaging==26.0 # via # -r requirements/test.txt # pydata-sphinx-theme @@ -121,11 +117,11 @@ pluggy==1.6.0 # -r requirements/test.txt # pytest # pytest-cov -psutil==7.1.1 +psutil==7.2.2 # via # -r requirements/test.txt # edx-django-utils -pycparser==2.23 +pycparser==3.0 # via # -r requirements/test.txt # cffi @@ -140,18 +136,18 @@ pygments==2.19.2 # readme-renderer # rich # sphinx -pynacl==1.6.0 +pynacl==1.6.2 # via # -r requirements/test.txt # edx-django-utils -pytest==8.4.2 +pytest==9.0.2 # via # -r requirements/test.txt # pytest-cov # pytest-django pytest-cov==7.0.0 # via -r requirements/test.txt -pytest-django==4.11.1 +pytest-django==4.12.0 # via -r requirements/test.txt python-dateutil==2.9.0.post0 # via @@ -167,7 +163,6 @@ readme-renderer==44.0 # twine requests==2.32.5 # via - # id # requests-toolbelt # sphinx # twine @@ -175,11 +170,11 @@ requests-toolbelt==1.0.0 # via twine rfc3986==2.0.0 # via twine -rich==14.2.0 +rich==14.3.3 # via twine -roman-numerals-py==3.1.0 +roman-numerals==4.1.0 # via sphinx -secretstorage==3.4.0 +secretstorage==3.5.0 # via keyring six==1.17.0 # via @@ -188,9 +183,9 @@ six==1.17.0 # python-dateutil snowballstemmer==3.0.1 # via sphinx -soupsieve==2.8 +soupsieve==2.8.3 # via beautifulsoup4 -sphinx==8.2.3 +sphinx==9.1.0 # via # -r requirements/doc.in # pydata-sphinx-theme @@ -209,11 +204,11 @@ sphinxcontrib-qthelp==2.0.0 # via sphinx sphinxcontrib-serializinghtml==2.0.0 # via sphinx -sqlparse==0.5.3 +sqlparse==0.5.5 # via # -r requirements/test.txt # django -stevedore==5.5.0 +stevedore==5.7.0 # via # -r requirements/test.txt # edx-django-utils @@ -223,9 +218,8 @@ typing-extensions==4.15.0 # via # beautifulsoup4 # pydata-sphinx-theme -urllib3==2.5.0 +urllib3==2.6.3 # via + # id # requests # twine -zipp==3.23.0 - # via importlib-metadata diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index e97cb1b..d89516b 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -1,22 +1,24 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -build==1.3.0 +build==1.4.0 # via pip-tools -click==8.3.0 +click==8.3.1 # via pip-tools -packaging==25.0 - # via build -pip-tools==7.5.1 +packaging==26.0 + # via + # build + # wheel +pip-tools==7.5.3 # via -r requirements/pip-tools.in pyproject-hooks==1.2.0 # via # build # pip-tools -wheel==0.45.1 +wheel==0.46.3 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/pip.txt b/requirements/pip.txt index dec1587..084d708 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -1,14 +1,16 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -wheel==0.45.1 +packaging==26.0 + # via wheel +wheel==0.46.3 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==25.2 +pip==26.0.1 # via -r requirements/pip.in -setuptools==80.9.0 +setuptools==82.0.0 # via -r requirements/pip.in diff --git a/requirements/quality.txt b/requirements/quality.txt index d01153e..3244427 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -1,14 +1,14 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -asgiref==3.10.0 +asgiref==3.11.1 # via # -r requirements/test.txt # django -astroid==3.3.11 +astroid==4.0.4 # via # pylint # pylint-celery @@ -16,7 +16,7 @@ cffi==2.0.0 # via # -r requirements/test.txt # pynacl -click==8.3.0 +click==8.3.1 # via # -r requirements/test.txt # click-log @@ -25,17 +25,17 @@ click==8.3.0 # edx-lint click-log==0.4.0 # via edx-lint -code-annotations==2.3.0 +code-annotations==2.3.2 # via edx-lint -coverage[toml]==7.11.0 +coverage[toml]==7.13.4 # via # -r requirements/test.txt # pytest-cov ddt==1.7.2 # via -r requirements/test.txt -dill==0.4.0 +dill==0.4.1 # via pylint -django==4.2.25 +django==5.2.12 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/test.txt @@ -66,7 +66,7 @@ iniconfig==2.3.0 # via # -r requirements/test.txt # pytest -isort==6.1.0 +isort==8.0.1 # via pylint jinja2==3.1.6 # via code-annotations @@ -74,24 +74,24 @@ markupsafe==3.0.3 # via jinja2 mccabe==0.7.0 # via pylint -packaging==25.0 +packaging==26.0 # via # -r requirements/test.txt # pytest -platformdirs==4.5.0 +platformdirs==4.9.4 # via pylint pluggy==1.6.0 # via # -r requirements/test.txt # pytest # pytest-cov -psutil==7.1.1 +psutil==7.2.2 # via # -r requirements/test.txt # edx-django-utils pycodestyle==2.14.0 # via -r requirements/quality.in -pycparser==2.23 +pycparser==3.0 # via # -r requirements/test.txt # cffi @@ -101,7 +101,7 @@ pygments==2.19.2 # via # -r requirements/test.txt # pytest -pylint==3.3.9 +pylint==4.0.5 # via # edx-lint # pylint-celery @@ -109,24 +109,24 @@ pylint==3.3.9 # pylint-plugin-utils pylint-celery==0.3 # via edx-lint -pylint-django==2.6.1 +pylint-django==2.7.0 # via edx-lint pylint-plugin-utils==0.9.0 # via # pylint-celery # pylint-django -pynacl==1.6.0 +pynacl==1.6.2 # via # -r requirements/test.txt # edx-django-utils -pytest==8.4.2 +pytest==9.0.2 # via # -r requirements/test.txt # pytest-cov # pytest-django pytest-cov==7.0.0 # via -r requirements/test.txt -pytest-django==4.11.1 +pytest-django==4.12.0 # via -r requirements/test.txt python-dateutil==2.9.0.post0 # via @@ -147,16 +147,16 @@ six==1.17.0 # python-dateutil snowballstemmer==3.0.1 # via pydocstyle -sqlparse==0.5.3 +sqlparse==0.5.5 # via # -r requirements/test.txt # django -stevedore==5.5.0 +stevedore==5.7.0 # via # -r requirements/test.txt # code-annotations # edx-django-utils text-unidecode==1.3 # via python-slugify -tomlkit==0.13.3 +tomlkit==0.14.0 # via pylint diff --git a/requirements/test.txt b/requirements/test.txt index a53ebcf..eec14be 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,10 +1,10 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -asgiref==3.10.0 +asgiref==3.11.1 # via # -r requirements/base.txt # django @@ -12,11 +12,11 @@ cffi==2.0.0 # via # -r requirements/base.txt # pynacl -click==8.3.0 +click==8.3.1 # via # -r requirements/base.txt # edx-django-utils -coverage[toml]==7.11.0 +coverage[toml]==7.13.4 # via pytest-cov ddt==1.7.2 # via -r requirements/test.in @@ -45,33 +45,33 @@ freezegun==1.5.5 # via -r requirements/test.in iniconfig==2.3.0 # via pytest -packaging==25.0 +packaging==26.0 # via pytest pluggy==1.6.0 # via # pytest # pytest-cov -psutil==7.1.1 +psutil==7.2.2 # via # -r requirements/base.txt # edx-django-utils -pycparser==2.23 +pycparser==3.0 # via # -r requirements/base.txt # cffi pygments==2.19.2 # via pytest -pynacl==1.6.0 +pynacl==1.6.2 # via # -r requirements/base.txt # edx-django-utils -pytest==8.4.2 +pytest==9.0.2 # via # pytest-cov # pytest-django pytest-cov==7.0.0 # via -r requirements/test.in -pytest-django==4.11.1 +pytest-django==4.12.0 # via -r requirements/test.in python-dateutil==2.9.0.post0 # via freezegun @@ -81,11 +81,11 @@ six==1.17.0 # via # edx-django-release-util # python-dateutil -sqlparse==0.5.3 +sqlparse==0.5.5 # via # -r requirements/base.txt # django -stevedore==5.5.0 +stevedore==5.7.0 # via # -r requirements/base.txt # edx-django-utils From cbda92ef0f0d24e6e22a8230cfb8a95e37174978 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 6 Mar 2026 14:48:50 -0500 Subject: [PATCH 3/7] chore: bump version to 3.0.0 Co-Authored-By: Claude Sonnet 4.6 --- config_models/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_models/__init__.py b/config_models/__init__.py index b3e2782..0b35a8d 100644 --- a/config_models/__init__.py +++ b/config_models/__init__.py @@ -2,4 +2,4 @@ Configuration models for Django allowing config management with auditing. """ -__version__ = '2.9.0' +__version__ = '3.0.0' From 506af7305d6f271a3ed51ea9a95921ee9fa7e55c Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Wed, 11 Mar 2026 09:59:28 -0400 Subject: [PATCH 4/7] fix: update ReadTheDocs build to Python 3.12 sphinx==9.1.0 (pinned by the requirements upgrade) requires Python 3.12+. The .readthedocs.yaml was still specifying python: "3.11", causing RTD builds to fail. Co-Authored-By: Claude Sonnet 4.6 --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 0b358e8..488e770 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -18,7 +18,7 @@ formats: build: os: "ubuntu-lts-latest" tools: - python: "3.11" + python: "3.12" # Optionally set the version of Python and requirements required to build your docs python: From d2bd70858e2ad37f238b338a3ad7124d38679de6 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Wed, 11 Mar 2026 09:59:53 -0400 Subject: [PATCH 5/7] fix: add **kwargs to ConfigurationModel.save() signature pylint 4.0.5 (upgraded via edx-lint) is stricter about W0221 (arguments-differ). Django 5.x added **kwargs to Model.save(), so ConfigurationModel.save() now triggers this warning because its signature does not include **kwargs. Add **kwargs to ConfigurationModel.save() and pass it through to super().save(), aligning with the Django 5.x base class signature. See: https://docs.djangoproject.com/en/5.2/ref/models/instances/#saving-objects Co-Authored-By: Claude Sonnet 4.6 --- config_models/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/config_models/models.py b/config_models/models.py index 03c6501..d8b7bfd 100644 --- a/config_models/models.py +++ b/config_models/models.py @@ -94,7 +94,7 @@ class Meta: enabled = models.BooleanField(default=False, verbose_name=_("Enabled")) def save(self, force_insert=False, force_update=False, using=None, - update_fields=None): + update_fields=None, **kwargs): """ Clear the cached value when saving a new configuration entry """ @@ -104,7 +104,8 @@ def save(self, force_insert=False, force_update=False, using=None, force_insert, force_update, using, - update_fields + update_fields, + **kwargs ) TieredCache.delete_all_tiers(self.cache_key_name(*[getattr(self, key) for key in self.KEY_FIELDS])) if self.KEY_FIELDS: From 8767a8235a6f674006c02c236c1aa721eaacf80b Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Wed, 11 Mar 2026 10:21:39 -0400 Subject: [PATCH 6/7] feat!: drop Django 4.2 support Django 4.2 reached end-of-life in April 2024. Remove the django42 tox env and classifier. BREAKING CHANGE: Django 4.2 is no longer supported. Requires Django 5.2+. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/ci.yml | 2 +- setup.py | 1 - tox.ini | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bf7b2f9..7ae9fa9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: os: [ubuntu-latest] python-version: - '3.12' - toxenv: [quality, docs, django42-drflatest, django52-drflatest, check_keywords] + toxenv: [quality, docs, django52-drflatest, check_keywords] steps: - uses: actions/checkout@v6 - name: setup python diff --git a/setup.py b/setup.py index d04595e..2bc5948 100644 --- a/setup.py +++ b/setup.py @@ -146,7 +146,6 @@ def is_requirement(line): classifiers=[ 'Development Status :: 3 - Alpha', 'Framework :: Django', - 'Framework :: Django :: 4.2', 'Framework :: Django :: 5.2', 'Intended Audience :: Developers', 'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)', diff --git a/tox.ini b/tox.ini index 437041e..b389dac 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{312}-django{42, 52}-drf{latest},quality,docs +envlist = py{312}-django{52}-drf{latest},quality,docs [pycodestyle] exclude = .git,.tox,migrations @@ -20,7 +20,6 @@ setenv = deps = setuptools wheel - django42: Django>=4.2,<4.3 django52: Django>=5.2,<5.3 drflatest: djangorestframework -r{toxinidir}/requirements/test.txt From 6289685a0731e1d847b1a0e0313293de9e5551ba Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Wed, 11 Mar 2026 12:31:36 -0400 Subject: [PATCH 7/7] fix: match Django 5.2 Model.save() *args signature Django 5.2 changed Model.save() to accept *args: def save(self, *args, force_insert=False, force_update=False, ...) See: https://github.com/django/django/commit/3d9bde50 pylint 4.x W0221 (arguments-differ) correctly flagged that our override removed the *args variadic introduced in Django 5.2. Co-Authored-By: Claude Sonnet 4.6 --- config_models/models.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/config_models/models.py b/config_models/models.py index d8b7bfd..c7f3017 100644 --- a/config_models/models.py +++ b/config_models/models.py @@ -93,7 +93,7 @@ class Meta: ) enabled = models.BooleanField(default=False, verbose_name=_("Enabled")) - def save(self, force_insert=False, force_update=False, using=None, + def save(self, *args, force_insert=False, force_update=False, using=None, update_fields=None, **kwargs): """ Clear the cached value when saving a new configuration entry @@ -101,10 +101,11 @@ def save(self, force_insert=False, force_update=False, using=None, # Always create a new entry, instead of updating an existing model self.pk = None super().save( - force_insert, - force_update, - using, - update_fields, + *args, + force_insert=force_insert, + force_update=force_update, + using=using, + update_fields=update_fields, **kwargs ) TieredCache.delete_all_tiers(self.cache_key_name(*[getattr(self, key) for key in self.KEY_FIELDS]))