diff --git a/meta-python/conf/include/ptest-packagelists-meta-python.inc b/meta-python/conf/include/ptest-packagelists-meta-python.inc index 3b21c7cfa2..d62f138798 100644 --- a/meta-python/conf/include/ptest-packagelists-meta-python.inc +++ b/meta-python/conf/include/ptest-packagelists-meta-python.inc @@ -129,6 +129,7 @@ PTESTS_FAST_META_PYTHON = "\ PTESTS_SLOW_META_PYTHON = "\ python3-arrow \ + python3-django \ python3-ecdsa \ python3-fastapi \ python3-google-auth \ diff --git a/meta-python/recipes-core/images/meta-python-image-ptest.bb b/meta-python/recipes-core/images/meta-python-image-ptest.bb index 794b9d1e4d..c5eb0b6403 100644 --- a/meta-python/recipes-core/images/meta-python-image-ptest.bb +++ b/meta-python/recipes-core/images/meta-python-image-ptest.bb @@ -32,6 +32,7 @@ QB_MEM:virtclass-mcextend-python3-scrypt = "-m 2048" # Needs atleast 5G to avoid OOMs QB_MEM:virtclass-mcextend-python3-fastjsonschema = "-m 5120" QB_MEM:virtclass-mcextend-python3-pillow = "-m 2048" +QB_MEM:virtclass-mcextend-python3-django = "-m 3072" TEST_SUITES = "ping ssh parselogs ptest" diff --git a/meta-python/recipes-devtools/python/python3-django.inc b/meta-python/recipes-devtools/python/python3-django.inc index c6475d2079..317793abba 100644 --- a/meta-python/recipes-devtools/python/python3-django.inc +++ b/meta-python/recipes-devtools/python/python3-django.inc @@ -6,7 +6,9 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=f09eb47206614a4954c51db8a94840fa" PYPI_PACKAGE = "django" UPSTREAM_CHECK_PYPI_PACKAGE = "${PYPI_PACKAGE}" -inherit pypi +inherit pypi ptest + +SRC_URI += "file://run-ptest" FILES:${PN} += "${datadir}/django" @@ -31,3 +33,31 @@ RDEPENDS:${PN} += "\ " CVE_PRODUCT = "django" + +do_install_ptest(){ + install -d ${D}${PTEST_PATH}//docs/_ext + install -m 0644 ${S}/docs/_ext/github_links.py ${D}${PTEST_PATH}/docs/_ext + + cp -r ${S}/tests ${D}${PTEST_PATH} + sed -i 's,/usr/bin/env python,/usr/bin/env python3,' ${D}${PTEST_PATH}/tests/runtests.py + ln -sr ${D}${libdir}/python3.*/site-packages/django ${D}${PTEST_PATH}/django +} + +RDEPENDS:${PN}-ptest += " \ + gettext \ + python3-asgiref \ + python3-bcrypt \ + python3-compile \ + python3-docutils \ + python3-fcntl \ + python3-jinja2 \ + python3-misc \ + python3-numpy \ + python3-pillow \ + python3-pyyaml \ + python3-sqlite3 \ + python3-statistics \ + python3-tblib \ + python3-zoneinfo \ + tzdata \ +" diff --git a/meta-python/recipes-devtools/python/python3-django/0001-Fix-test_strip_tags-test.patch b/meta-python/recipes-devtools/python/python3-django/0001-Fix-test_strip_tags-test.patch new file mode 100644 index 0000000000..f77c3b963a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-django/0001-Fix-test_strip_tags-test.patch @@ -0,0 +1,76 @@ +From 7b80b2186300620931009fd62c2969f108fe7a62 Mon Sep 17 00:00:00 2001 +From: Jacob Walls +Date: Thu, 11 Dec 2025 08:44:19 -0500 +Subject: [PATCH] Refs #36499 -- Adjusted test_strip_tags following Python + behavior change for incomplete entities. + +Upstream-Status: Backport [https://github.com/django/django/commit/7b80b2186300620931009fd62c2969f108fe7a62] +Signed-off-by: Gyorgy Sarvari +--- + tests/utils_tests/test_html.py | 25 ++++++++++++++++++++----- + 1 file changed, 20 insertions(+), 5 deletions(-) + +diff --git a/tests/utils_tests/test_html.py b/tests/utils_tests/test_html.py +index 7412c2624c73..ee115aaf1cf2 100644 +--- a/tests/utils_tests/test_html.py ++++ b/tests/utils_tests/test_html.py +@@ -1,3 +1,4 @@ ++import math + import os + import sys + from datetime import datetime +@@ -124,7 +125,7 @@ + # old and new results. The check below is temporary until all supported + # Python versions and CI workers include the fix. See: + # https://github.com/python/cpython/commit/6eb6c5db +- min_fixed = { ++ min_fixed_security = { + (3, 14): (3, 14), + (3, 13): (3, 13, 6), + (3, 12): (3, 12, 12), +@@ -132,7 +133,21 @@ + (3, 10): (3, 10, 19), + (3, 9): (3, 9, 24), + } +- htmlparser_fixed = sys.version_info >= min_fixed[sys.version_info[:2]] ++ # Similarly, there was a fix for terminating incomplete entities. See: ++ # https://github.com/python/cpython/commit/95296a9d ++ min_fixed_incomplete_entities = { ++ (3, 14): (3, 14, 1), ++ (3, 13): (3, 13, 10), ++ (3, 12): (3, 12, math.inf), # not fixed in 3.12. ++ } ++ major_version = sys.version_info[:2] ++ htmlparser_fixed_security = sys.version_info >= min_fixed_security.get( ++ major_version, major_version ++ ) ++ htmlparser_fixed_incomplete_entities = ( ++ sys.version_info ++ >= min_fixed_incomplete_entities.get(major_version, major_version) ++ ) + items = ( + ( + "

See: 'é is an apostrophe followed by e acute

", +@@ -159,16 +174,19 @@ + # https://bugs.python.org/issue20288 + ("&gotcha&#;<>", "&gotcha&#;<>"), + ("ript>test</script>", "ript>test"), +- ("&h", "alert()h"), ++ ( ++ "&h", ++ "alert()&h;" if htmlparser_fixed_incomplete_entities else "alert()h", ++ ), + ( + ">" if htmlparser_fixed else ">" if htmlparser_fixed_security else ">br>br>br>X", "XX"), + ("<" * 50 + "a>" * 50, ""), + ( + ">" + "" if htmlparser_fixed else ">" + "" if htmlparser_fixed_security else ">" + " +Date: Fri, 6 Jun 2025 04:58:29 +0800 +Subject: [PATCH] Fixed #36421 -- Made test_msgfmt_error_including_non_ascii + compatible with msgfmt 0.25. + +Upstream-Status: Backport [https://github.com/django/django/commit/1960ecd879ce351226b36e7ac0aa25616241b6f6] +Signed-off-by: Gyorgy Sarvari +--- + tests/i18n/test_compilation.py | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +diff --git a/tests/i18n/test_compilation.py b/tests/i18n/test_compilation.py +index 4b0bb9f6bb16..3a57dbf0765f 100644 +--- a/tests/i18n/test_compilation.py ++++ b/tests/i18n/test_compilation.py +@@ -1,5 +1,6 @@ + import gettext as gettext_module + import os ++import re + import stat + import unittest + from io import StringIO +@@ -8,10 +9,12 @@ + from unittest import mock + + from django.core.management import CommandError, call_command, execute_from_command_line +-from django.core.management.utils import find_command ++from django.core.management.utils import find_command, popen_wrapper + from django.test import SimpleTestCase, override_settings + from django.test.utils import captured_stderr, captured_stdout + from django.utils import translation ++from django.utils.encoding import DEFAULT_LOCALE_ENCODING ++from django.utils.functional import cached_property + from django.utils.translation import gettext + + from .utils import RunInTmpDirMixin, copytree +@@ -254,6 +257,17 @@ def test_no_dirs_accidentally_skipped(self): + + + class CompilationErrorHandling(MessageCompilationTests): ++ @cached_property ++ def msgfmt_version(self): ++ # Note that msgfmt is installed via GNU gettext tools, hence the msgfmt ++ # version should align to gettext. ++ out, err, status = popen_wrapper( ++ ["msgfmt", "--version"], ++ stdout_encoding=DEFAULT_LOCALE_ENCODING, ++ ) ++ m = re.search(r"(\d+)\.(\d+)\.?(\d+)?", out) ++ return tuple(int(d) for d in m.groups() if d is not None) ++ + def test_error_reported_by_msgfmt(self): + # po file contains wrong po formatting. + with self.assertRaises(CommandError): +@@ -278,7 +292,14 @@ def test_msgfmt_error_including_non_ascii(self): + call_command( + "compilemessages", locale=["ko"], stdout=StringIO(), stderr=stderr + ) +- self.assertIn("' cannot start a field name", stderr.getvalue()) ++ if self.msgfmt_version < (0, 25): ++ error_msg = "' cannot start a field name" ++ else: ++ error_msg = ( ++ "a field name starts with a character that is not alphanumerical " ++ "or underscore" ++ ) ++ self.assertIn(error_msg, stderr.getvalue()) + + + class ProjectAndAppTests(MessageCompilationTests): diff --git a/meta-python/recipes-devtools/python/python3-django/run-ptest b/meta-python/recipes-devtools/python/python3-django/run-ptest new file mode 100644 index 0000000000..a7fe08cc83 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-django/run-ptest @@ -0,0 +1,19 @@ +#!/bin/sh +useradd tester || echo test user exists already + +# We need $(pwd), because some tests import modules from the actual tests folder +# Also, there is one module in the docs/_ext folder that is imported, and that +# module accesses other modules by a relative path to itself. +export PYTHONPATH=$(pwd):$(pwd)/docs/_ext:$PYTHONPATH + +cd tests + +su tester -c "./runtests.py --noinput -v 2" 2>&1 | \ + tee ../testoutput.log | \ + sed -e '/\.\.\. ok/ s/^/PASS: /g' \ + -e '/\.\.\. \(ERROR\|FAIL\)/ s/^/FAIL: /g' \ + -e '/\.\.\. skipped/ s/^/SKIP: /g' \ + -e 's/ \.\.\. ok//g' \ + -e 's/ \.\.\. ERROR//g' \ + -e 's/ \.\.\. FAIL//g' \ + -e 's/ \.\.\. skipped//g' diff --git a/meta-python/recipes-devtools/python/python3-django_5.2.9.bb b/meta-python/recipes-devtools/python/python3-django_5.2.9.bb index c0aff44a78..fa9fb2e929 100644 --- a/meta-python/recipes-devtools/python/python3-django_5.2.9.bb +++ b/meta-python/recipes-devtools/python/python3-django_5.2.9.bb @@ -1,6 +1,9 @@ require python3-django.inc inherit python_setuptools_build_meta +SRC_URI += "file://0001-fix-test_msgfmt_error_including_non_ascii-test.patch \ + file://0001-Fix-test_strip_tags-test.patch \ +" SRC_URI[sha256sum] = "16b5ccfc5e8c27e6c0561af551d2ea32852d7352c67d452ae3e76b4f6b2ca495" RDEPENDS:${PN} += "\