File py314.patch of Package python-Django4
From 8d7b1423f89bcc3df57333fc79fa5aead17b0cbc Mon Sep 17 00:00:00 2001
From: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Date: Sun, 17 Nov 2024 16:07:23 +0100
Subject: [PATCH] Refs #35844 -- Fixed copying BaseContext and its subclasses
on Python 3.14+.
super objects are copyable on Python 3.14+:
https://github.com/python/cpython/commit/5ca4e34bc1aab8321911aac6d5b2b9e75ff764d8
and can no longer be used in BaseContext.__copy__().
---
django/template/context.py | 4 +++-
tests/template_tests/test_context.py | 8 ++++++++
2 files changed, 11 insertions(+), 1 deletion(-)
Index: django-4.2.29/django/template/context.py
===================================================================
--- django-4.2.29.orig/django/template/context.py
+++ django-4.2.29/django/template/context.py
@@ -35,7 +35,9 @@ class BaseContext:
self.dicts.append(value)
def __copy__(self):
- duplicate = copy(super())
+ duplicate = BaseContext()
+ duplicate.__class__ = self.__class__
+ duplicate.__dict__ = copy(self.__dict__)
duplicate.dicts = self.dicts[:]
return duplicate
Index: django-4.2.29/tests/template_tests/test_context.py
===================================================================
--- django-4.2.29.orig/tests/template_tests/test_context.py
+++ django-4.2.29/tests/template_tests/test_context.py
@@ -1,3 +1,4 @@
+from copy import copy
from unittest import mock
from django.http import HttpRequest
@@ -276,3 +277,10 @@ class RequestContextTests(SimpleTestCase
context = RequestContext(request, {})
context["foo"] = "foo"
self.assertEqual(template.render(context), "foo")
+
+ def test_context_copyable(self):
+ request_context = RequestContext(HttpRequest())
+ request_context_copy = copy(request_context)
+ self.assertIsInstance(request_context_copy, RequestContext)
+ self.assertEqual(request_context_copy.dicts, request_context.dicts)
+ self.assertIsNot(request_context_copy.dicts, request_context.dicts)
From 34066d6cf3d66b8a3c7fac86912455dbb2ed0ed6 Mon Sep 17 00:00:00 2001
From: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Date: Thu, 24 Oct 2024 16:41:37 +0200
Subject: [PATCH] Refs #35844 -- Fixed tests for test --parallel option on
Python 3.14+.
"forkserver" is the new default on POSIX systems, and Django doesn't
support parallel tests with "forkserver":
https://github.com/python/cpython/commit/b65f2cdfa77d8d12c213aec663ddaaa30d75a4b2
---
tests/test_runner/test_discover_runner.py | 1 +
tests/test_runner/tests.py | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/tests/test_runner/test_discover_runner.py b/tests/test_runner/test_discover_runner.py
index a845f6dd67d4..4f13cceeffc4 100644
--- a/tests/test_runner/test_discover_runner.py
+++ b/tests/test_runner/test_discover_runner.py
@@ -45,6 +45,7 @@ def change_loader_patterns(patterns):
@mock.patch.dict(os.environ, {}, clear=True)
@mock.patch.object(multiprocessing, "cpu_count", return_value=12)
# Python 3.8 on macOS defaults to 'spawn' mode.
+# Python 3.14 on POSIX systems defaults to 'forkserver' mode.
@mock.patch.object(multiprocessing, "get_start_method", return_value="fork")
class DiscoverRunnerParallelArgumentTests(SimpleTestCase):
def get_parser(self):
diff --git a/tests/test_runner/tests.py b/tests/test_runner/tests.py
index b900ff69ea0c..fba8dd3b6ff2 100644
--- a/tests/test_runner/tests.py
+++ b/tests/test_runner/tests.py
@@ -506,6 +506,7 @@ def test_durations_lt_py312(self):
@mock.patch.dict(os.environ, {}, clear=True)
@mock.patch.object(multiprocessing, "cpu_count", return_value=12)
class ManageCommandParallelTests(SimpleTestCase):
+ @mock.patch.object(multiprocessing, "get_start_method", return_value="fork")
def test_parallel_default(self, *mocked_objects):
with captured_stderr() as stderr:
call_command(
@@ -515,6 +516,7 @@ def test_parallel_default(self, *mocked_objects):
)
self.assertIn("parallel=12", stderr.getvalue())
+ @mock.patch.object(multiprocessing, "get_start_method", return_value="fork")
def test_parallel_auto(self, *mocked_objects):
with captured_stderr() as stderr:
call_command(
@@ -550,12 +552,14 @@ def test_no_parallel_spawn(self, *mocked_objects):
self.assertEqual(stderr.getvalue(), "")
@mock.patch.dict(os.environ, {"DJANGO_TEST_PROCESSES": "7"})
+ @mock.patch.object(multiprocessing, "get_start_method", return_value="fork")
def test_no_parallel_django_test_processes_env(self, *mocked_objects):
with captured_stderr() as stderr:
call_command("test", testrunner="test_runner.tests.MockTestRunner")
self.assertEqual(stderr.getvalue(), "")
@mock.patch.dict(os.environ, {"DJANGO_TEST_PROCESSES": "invalid"})
+ @mock.patch.object(multiprocessing, "get_start_method", return_value="fork")
def test_django_test_processes_env_non_int(self, *mocked_objects):
with self.assertRaises(ValueError):
call_command(
@@ -565,6 +569,7 @@ def test_django_test_processes_env_non_int(self, *mocked_objects):
)
@mock.patch.dict(os.environ, {"DJANGO_TEST_PROCESSES": "7"})
+ @mock.patch.object(multiprocessing, "get_start_method", return_value="fork")
def test_django_test_processes_parallel_default(self, *mocked_objects):
for parallel in ["--parallel", "--parallel=auto"]:
with self.subTest(parallel=parallel):
From fcd9d08379a2aee3b2c49eab0d0b8db6fd66d091 Mon Sep 17 00:00:00 2001
From: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Date: Fri, 20 Dec 2024 08:43:14 +0100
Subject: [PATCH] Refs #35844 -- Fixed
OtherModelFormTests.test_prefetch_related_queryset() test on Python 3.14+.
https://github.com/python/cpython/commit/5a23994a3dbee43a0b08f5920032f60f38b63071
---
tests/model_forms/tests.py | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
Index: django-4.2.29/tests/model_forms/tests.py
===================================================================
--- django-4.2.29.orig/tests/model_forms/tests.py
+++ django-4.2.29/tests/model_forms/tests.py
@@ -23,6 +23,7 @@ from django.forms.models import (
from django.template import Context, Template
from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
from django.test.utils import isolate_apps
+from django.utils.version import PY314, PYPY
from .models import (
Article,
@@ -2947,7 +2948,7 @@ class OtherModelFormTests(TestCase):
return ", ".join(c.name for c in obj.colours.all())
field = ColorModelChoiceField(ColourfulItem.objects.prefetch_related("colours"))
- with self.assertNumQueries(3): # would be 4 if prefetch is ignored
+ with self.assertNumQueries(2 if PYPY or PY314 else 3): # would be 4 if prefetch is ignored
self.assertEqual(
tuple(field.choices),
(
Index: django-4.2.29/django/utils/version.py
===================================================================
--- django-4.2.29.orig/django/utils/version.py
+++ django-4.2.29/django/utils/version.py
@@ -18,6 +18,9 @@ PY310 = sys.version_info >= (3, 10)
PY311 = sys.version_info >= (3, 11)
PY312 = sys.version_info >= (3, 12)
PY313 = sys.version_info >= (3, 13)
+PY314 = sys.version_info >= (3, 14)
+
+PYPY = sys.implementation.name == "pypy"
def get_version(version=None):