From bc36a6dc9266eab88202e2232fd73f6d04677f72 Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Sat, 11 Apr 2026 11:33:45 -0400 Subject: [PATCH] =?UTF-8?q?Support=20Django=204.2=E2=80=935.2=20LTS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cove/input/models.py: Overrides formfield() to pass assume_scheme='https' on Django 5.0+, to avoid RemovedInDjango60Warning. - cove/management/commands/tests.py: Use datetime.timezone.utc instead of timezone.utc, which was removed in Django 5.0. - cove/settings.py: Remove USE_L10N (default True since Django 4.0, setting removed in 5.0). - setup.py: Change Django range to >=4.2,<5.3. Django 4.2 LTS is supported until April 2026. - ci.yml: Test Django 4.2 and 5.2 on Python 3.10/3.12/3.13. Enable PYTHONWARNINGS=error for all versions. --- .github/workflows/ci.yml | 32 +++++-------------------------- cove/input/models.py | 15 ++++++++++++++- cove/management/commands/tests.py | 2 +- cove/settings.py | 2 -- setup.py | 2 +- 5 files changed, 21 insertions(+), 32 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 646fff5..6f199e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,28 +6,14 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9", "3.10"] + python-version: ["3.10", "3.12", "3.13"] django-version: - - "Django>=2.2,<2.3" - - "Django>=3.0,<3.1" - - "Django>=3.1,<3.2" - - "Django>=3.2,<3.3" - "Django>=4.2,<4.3" + - "Django>=5.2,<5.3" exclude: - # Django 3.1+ supports Python 3.9. - # https://docs.djangoproject.com/en/3.1/releases/3.1.3/ - - python-version: "3.9" - django-version: "Django>=2.2,<2.3" - - python-version: "3.9" - django-version: "Django>=3.0,<3.1" - # Django 3.2+ supports Python 3.10. - # https://docs.djangoproject.com/en/3.2/releases/3.2/ - - python-version: "3.10" - django-version: "Django>=2.2,<2.3" - - python-version: "3.10" - django-version: "Django>=3.0,<3.1" - - python-version: "3.10" - django-version: "Django>=3.1,<3.2" + # Django 4.2 supports Python 3.8–3.12. + - python-version: "3.13" + django-version: "Django>=4.2,<4.3" steps: - uses: actions/checkout@v4 - name: Setup python @@ -43,14 +29,6 @@ jobs: PYTHONWARNINGS: error DJANGO_SETTINGS_MODULE: cove.settings SECRET_KEY: 7ur)dt+e%1^e6$8_sd-@1h67_5zixe2&39%r2$$8_7v6fr_7ee - if: ${{ matrix.django-version != 'Django>=4.2,<4.3' }} - # Don't set PYTHONWARNING for Django 4.2, as that has some known - # deprecation warnings for 5.0 - - run: "py.test -n 2 cove --cov" - env: - DJANGO_SETTINGS_MODULE: cove.settings - SECRET_KEY: 7ur)dt+e%1^e6$8_sd-@1h67_5zixe2&39%r2$$8_7v6fr_7ee - if: ${{ matrix.django-version == 'Django>=4.2,<4.3' }} - name: Check existing migrations can run and no migrations are missing env: DJANGO_SETTINGS_MODULE: cove.settings diff --git a/cove/input/models.py b/cove/input/models.py index 29838ea..40f4cb3 100644 --- a/cove/input/models.py +++ b/cove/input/models.py @@ -9,6 +9,7 @@ from werkzeug.http import parse_options_header import secrets import string +import django CONTENT_TYPE_MAP = { 'application/json': 'json', @@ -26,9 +27,21 @@ def upload_to(instance, filename=''): return os.path.join(str(instance.pk), random_string, filename) +# This class is only needed while Django<5 is supported. +class URLField(models.URLField): + def formfield(self, **kwargs): + if django.VERSION >= (5, 0): + kwargs.setdefault('assume_scheme', 'https') + return super().formfield(**kwargs) + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + return name, "django.db.models.URLField", args, kwargs + + class SuppliedData(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) - source_url = models.URLField(null=True, max_length=2000) + source_url = URLField(null=True, max_length=2000) original_file = models.FileField(upload_to=upload_to, max_length=256) current_app = models.CharField(max_length=20) diff --git a/cove/management/commands/tests.py b/cove/management/commands/tests.py index ea346b7..03fd88b 100644 --- a/cove/management/commands/tests.py +++ b/cove/management/commands/tests.py @@ -13,7 +13,7 @@ def test_expire_files(): recent.original_file.save('test.json', ContentFile('{}')) old = SuppliedData.objects.create() - old.created = timezone.datetime(2015, 1, 1, tzinfo=timezone.utc) + old.created = timezone.datetime(2015, 1, 1, tzinfo=datetime.timezone.utc) old.original_file.save('test.json', ContentFile('{}')) call_command('expire_files') diff --git a/cove/settings.py b/cove/settings.py index 55bf2fa..acb16c1 100644 --- a/cove/settings.py +++ b/cove/settings.py @@ -126,8 +126,6 @@ USE_I18N = True -USE_L10N = True - USE_TZ = True diff --git a/setup.py b/setup.py index 69ff7e4..05e65b2 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ classifiers=["License :: OSI Approved :: BSD License"], python_requires=">=3.8", install_requires=[ - "Django>=2.2,<4.3", + "Django>=4.2,<5.3", "django-bootstrap3", "requests", "flattentool",