python3Packages.django_4: drop

Removing due to it becoming a leaf package right before it's EOL on April
30th.

Closes: #490868
This commit is contained in:
Martin Weinelt
2026-03-30 16:34:15 +02:00
parent 82839c1e61
commit cbda4e8724
8 changed files with 3 additions and 270 deletions
@@ -10,7 +10,7 @@
pytestCheckHook,
# for passthru.tests
asyncssh,
django_4,
django,
fastapi,
paramiko,
twisted,
@@ -57,7 +57,7 @@ buildPythonPackage rec {
passthru.tests = {
inherit
asyncssh
django_4
django
fastapi
paramiko
twisted
@@ -1,174 +0,0 @@
{
lib,
stdenv,
buildPythonPackage,
fetchFromGitHub,
fetchpatch,
pythonAtLeast,
replaceVars,
# build
setuptools,
# patched in
geos,
gdal,
withGdal ? false,
# propagates
asgiref,
sqlparse,
# extras
argon2-cffi,
bcrypt,
# tests
aiosmtpd,
docutils,
geoip2,
jinja2,
numpy,
pillow,
pylibmc,
pymemcache,
python,
pywatchman,
pyyaml,
pytz,
redis,
selenium,
tblib,
tzdata,
}:
buildPythonPackage rec {
pname = "django";
version = "4.2.29";
pyproject = true;
disabled = pythonAtLeast "3.13";
src = fetchFromGitHub {
owner = "django";
repo = "django";
tag = version;
hash = "sha256-30OcLxtACSxLJ1jT+k7fmM8CyMyleXSPc+l7/3JZKzI=";
};
patches = [
(replaceVars ./django_4_set_zoneinfo_dir.patch {
zoneinfo = tzdata + "/share/zoneinfo";
})
# make sure the tests don't remove packages from our pythonpath
# and disable failing tests
./django_4_tests.patch
# fix filename length limit tests on bcachefs
# FIXME: remove if ever backported
(fetchpatch {
url = "https://github.com/django/django/commit/12f4f95405c7857cbf2f4bf4d0261154aac31676.patch";
hash = "sha256-+K20/V8sh036Ox9U7CSPgfxue7f28Sdhr3MsB7erVOk=";
})
# backport fix for https://code.djangoproject.com/ticket/36056
# FIXME: remove if ever backported upstream
(fetchpatch {
url = "https://github.com/django/django/commit/ec0e784f91b551c654f0962431cc31091926792d.patch";
includes = [ "django/*" ]; # tests don't apply
hash = "sha256-8YwdOBNJq6+GNoxzdLyN9HEEIWRXGQk9YbyfPwYVkwU=";
})
]
++ lib.optionals withGdal [
(replaceVars ./django_4_set_geos_gdal_lib.patch {
geos = geos;
gdal = gdal;
extension = stdenv.hostPlatform.extensions.sharedLibrary;
})
];
postPatch = ''
substituteInPlace tests/utils_tests/test_autoreload.py \
--replace "/usr/bin/python" "${python.interpreter}"
''
+ lib.optionalString (pythonAtLeast "3.12" && stdenv.hostPlatform.system == "aarch64-linux") ''
# Test regression after xz was reverted from 5.6.0 to 5.4.6
# https://hydra.nixos.org/build/254630990
substituteInPlace tests/view_tests/tests/test_debug.py \
--replace-fail "test_files" "dont_test_files"
''
+ lib.optionalString (pythonAtLeast "3.13") ''
# Fixed CommandTypes.test_help_default_options_with_custom_arguments test on Python 3.13+.
# https://github.com/django/django/commit/3426a5c33c36266af42128ee9eca4921e68ea876
substituteInPlace tests/admin_scripts/tests.py --replace-fail \
"test_help_default_options_with_custom_arguments" \
"dont_test_help_default_options_with_custom_arguments"
'';
nativeBuildInputs = [ setuptools ];
propagatedBuildInputs = [
asgiref
sqlparse
];
optional-dependencies = {
argon2 = [ argon2-cffi ];
bcrypt = [ bcrypt ];
};
nativeCheckInputs = [
# tests/requirements/py3.txt
aiosmtpd
docutils
geoip2
jinja2
numpy
pillow
pylibmc
pymemcache
pywatchman
pyyaml
pytz
redis
selenium
tblib
tzdata
]
++ lib.concatAttrValues optional-dependencies;
doCheck =
!stdenv.hostPlatform.isDarwin
# pywatchman depends on folly which does not support 32bits
&& !stdenv.hostPlatform.is32bit;
preCheck = ''
# make sure the installed library gets imported
rm -rf django
# provide timezone data, works only on linux
export TZDIR=${tzdata}/${python.sitePackages}/tzdata/zoneinfo
'';
checkPhase = ''
runHook preCheck
pushd tests
${python.interpreter} runtests.py --settings=test_sqlite
popd
runHook postCheck
'';
__darwinAllowLocalNetworking = true;
meta = {
changelog = "https://docs.djangoproject.com/en/${lib.versions.majorMinor version}/releases/${version}/";
description = "High-level Python Web framework that encourages rapid development and clean, pragmatic design";
mainProgram = "django-admin";
homepage = "https://www.djangoproject.com";
license = lib.licenses.bsd3;
maintainers = with lib.maintainers; [ hexa ];
};
}
@@ -1,26 +0,0 @@
diff --git a/django/contrib/gis/gdal/libgdal.py b/django/contrib/gis/gdal/libgdal.py
index 05b5732..91fafee 100644
--- a/django/contrib/gis/gdal/libgdal.py
+++ b/django/contrib/gis/gdal/libgdal.py
@@ -14,7 +14,7 @@ try:
from django.conf import settings
lib_path = settings.GDAL_LIBRARY_PATH
except (AttributeError, ImportError, ImproperlyConfigured, OSError):
- lib_path = None
+ lib_path = "@gdal@/lib/libgdal@extension@"
if lib_path:
lib_names = None
diff --git a/django/contrib/gis/geos/libgeos.py b/django/contrib/gis/geos/libgeos.py
index 2cdb5d3..fac2d04 100644
--- a/django/contrib/gis/geos/libgeos.py
+++ b/django/contrib/gis/geos/libgeos.py
@@ -24,7 +24,7 @@ def load_geos():
from django.conf import settings
lib_path = settings.GEOS_LIBRARY_PATH
except (AttributeError, ImportError, ImproperlyConfigured, OSError):
- lib_path = None
+ lib_path = "@geos@/lib/libgeos_c@extension@"
# Setting the appropriate names for the GEOS-C library.
if lib_path:
@@ -1,13 +0,0 @@
diff --git a/django/conf/__init__.py b/django/conf/__init__.py
index cb70a71791..5156f7dd73 100644
--- a/django/conf/__init__.py
+++ b/django/conf/__init__.py
@@ -227,7 +227,7 @@ class Settings:
if hasattr(time, "tzset") and self.TIME_ZONE:
# When we can, attempt to validate the timezone. If we can't find
# this file, no check happens and it's harmless.
- zoneinfo_root = Path("/usr/share/zoneinfo")
+ zoneinfo_root = Path("@zoneinfo@")
zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split("/"))
if zoneinfo_root.exists() and not zone_info_file.exists():
raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE)
@@ -1,51 +0,0 @@
diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py
index 6d67c2931a..0c1f407f88 100644
--- a/tests/admin_scripts/tests.py
+++ b/tests/admin_scripts/tests.py
@@ -127,6 +127,7 @@ class AdminScriptTestCase(SimpleTestCase):
del test_environ["DJANGO_SETTINGS_MODULE"]
python_path = [base_dir, django_dir, tests_dir]
python_path.extend(ext_backend_base_dirs)
+ python_path.extend(sys.path)
test_environ["PYTHONPATH"] = os.pathsep.join(python_path)
test_environ["PYTHONWARNINGS"] = ""
diff --git a/tests/auth_tests/test_hashers.py b/tests/auth_tests/test_hashers.py
index 36f22d5f09..6cc6888980 100644
--- a/tests/auth_tests/test_hashers.py
+++ b/tests/auth_tests/test_hashers.py
@@ -1,4 +1,4 @@
-from unittest import mock, skipUnless
+from unittest import mock, skipUnless, skip
from django.conf.global_settings import PASSWORD_HASHERS
from django.contrib.auth.hashers import (
@@ -241,6 +241,7 @@ class TestUtilsHashPass(SimpleTestCase):
@ignore_warnings(category=RemovedInDjango50Warning)
@skipUnless(crypt, "no crypt module to generate password.")
+ @skip("Legacy crypt algorithms are unsupported in nixpkgs")
@override_settings(
PASSWORD_HASHERS=["django.contrib.auth.hashers.CryptPasswordHasher"]
)
diff --git a/tests/settings_tests/tests.py b/tests/settings_tests/tests.py
index 62cbffbee9..2f0ec718f8 100644
--- a/tests/settings_tests/tests.py
+++ b/tests/settings_tests/tests.py
@@ -2,7 +2,7 @@ import os
import sys
import unittest
from types import ModuleType, SimpleNamespace
-from unittest import mock
+from unittest import mock, skip
from django.conf import (
ENVIRONMENT_VARIABLE,
@@ -342,6 +342,7 @@ class SettingsTests(SimpleTestCase):
getattr(s, "foo")
@requires_tz_support
+ @skip("Assertion fails, exception does not get raised")
@mock.patch("django.conf.global_settings.TIME_ZONE", "test")
def test_incorrect_timezone(self):
with self.assertRaisesMessage(ValueError, "Incorrect timezone setting: test"):
@@ -8,7 +8,6 @@
# for passthru.tests
django,
django_4,
django-silk,
pgadmin4,
}:
@@ -36,7 +35,6 @@ buildPythonPackage rec {
passthru.tests = {
inherit
django
django_4
django-silk
pgadmin4
;
+1
View File
@@ -152,6 +152,7 @@ mapAliases {
django-crispy-bootstrap5 = crispy-bootstrap5; # added 2025-06-11
django-modelsearch = modelsearch; # added 2026-03-02
django_3 = throw "Django 3 has reached it's EOL in 2024-04 and has therefore been removed."; # added 2025-01-25
django_4 = throw "Django 4 has reached it's EOL in 2026-04 and has therefore been removed."; # added 2026-03-30
django_5_1 = throw "Django 5.1 has reached it's EOL in 2025-12 and has therefore been removed."; # added 2025-11-30"
django_5_2 = django_5; # added 2026-01-18
django_appconf = throw "'django_appconf' has been renamed to/replaced by 'django-appconf'"; # Converted to throw 2025-10-29
-2
View File
@@ -4443,8 +4443,6 @@ self: super: with self; {
{ };
# LTS in extended support phase
django_4 = callPackage ../development/python-modules/django/4.nix { };
django_5 = callPackage ../development/python-modules/django/5.nix { };
django_6 = callPackage ../development/python-modules/django/6.nix { };