Fixed #32744 -- Normalized to pathlib.Path in autoreloader check for template changes.

This commit is contained in:
Hasan Ramezani 2021-05-17 21:53:21 +02:00 committed by Carlton Gibson
parent 7e51893911
commit 68357b2ca9
3 changed files with 28 additions and 2 deletions

View File

@ -1,6 +1,9 @@
from pathlib import Path
from django.dispatch import receiver from django.dispatch import receiver
from django.template import engines from django.template import engines
from django.template.backends.django import DjangoTemplates from django.template.backends.django import DjangoTemplates
from django.utils._os import to_path
from django.utils.autoreload import ( from django.utils.autoreload import (
autoreload_started, file_changed, is_django_path, autoreload_started, file_changed, is_django_path,
) )
@ -15,13 +18,13 @@ def get_template_directories():
if not isinstance(backend, DjangoTemplates): if not isinstance(backend, DjangoTemplates):
continue continue
items.update(backend.engine.dirs) items.update(Path.cwd() / to_path(dir) for dir in backend.engine.dirs)
for loader in backend.engine.template_loaders: for loader in backend.engine.template_loaders:
if not hasattr(loader, 'get_dirs'): if not hasattr(loader, 'get_dirs'):
continue continue
items.update( items.update(
directory Path.cwd() / to_path(directory)
for directory in loader.get_dirs() for directory in loader.get_dirs()
if not is_django_path(directory) if not is_django_path(directory)
) )

View File

@ -22,3 +22,6 @@ Bugfixes
* Fixed a crash in Django 3.2 that could occur when running ``mod_wsgi`` with * Fixed a crash in Django 3.2 that could occur when running ``mod_wsgi`` with
the recommended settings while the Windows ``colorama`` library was installed the recommended settings while the Windows ``colorama`` library was installed
(:ticket:`32740`). (:ticket:`32740`).
* Fixed a bug in Django 3.2 that would trigger the auto-reloader for template
changes when directory paths were specified with strings (:ticket:`32744`).

View File

@ -64,6 +64,26 @@ class TemplateReloadTests(SimpleTestCase):
autoreload.reset_loaders() autoreload.reset_loaders()
self.assertEqual(mock_reset.call_count, 2) self.assertEqual(mock_reset.call_count, 2)
@override_settings(
TEMPLATES=[{
'DIRS': [
str(ROOT) + '/absolute_str',
'template_tests/relative_str',
Path('template_tests/relative_path'),
],
'BACKEND': 'django.template.backends.django.DjangoTemplates',
}]
)
def test_template_dirs_normalized_to_paths(self):
self.assertSetEqual(
autoreload.get_template_directories(),
{
ROOT / 'absolute_str',
Path.cwd() / 'template_tests/relative_str',
Path.cwd() / 'template_tests/relative_path',
}
)
@require_jinja2 @require_jinja2
@override_settings(INSTALLED_APPS=['template_tests']) @override_settings(INSTALLED_APPS=['template_tests'])