diff options
| author | Giannis Terzopoulos <terzo.giannis@gmail.com> | 2024-03-18 14:50:32 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2024-03-27 08:14:54 +0100 |
| commit | d658a3162fbeb68d148d1b2fcf4da4fe1437eddb (patch) | |
| tree | 2614270a87d4c178dfca714dc48b075a75c9676b /django/template | |
| parent | b98271a6e42107233311d17f5d7bc74fbb47f22c (diff) | |
Fixed #35233 -- Moved template engine system checks to backend methods.
Thanks Adam Johnson for reviews.
Diffstat (limited to 'django/template')
| -rw-r--r-- | django/template/backends/base.py | 3 | ||||
| -rw-r--r-- | django/template/backends/django.py | 46 |
2 files changed, 49 insertions, 0 deletions
diff --git a/django/template/backends/base.py b/django/template/backends/base.py index 991ce64cb7..f08eb2464b 100644 --- a/django/template/backends/base.py +++ b/django/template/backends/base.py @@ -23,6 +23,9 @@ class BaseEngine: "Unknown parameters: {}".format(", ".join(params)) ) + def check(self, **kwargs): + return [] + @property def app_dirname(self): raise ImproperlyConfigured( diff --git a/django/template/backends/django.py b/django/template/backends/django.py index ba561bba9f..cf6874c408 100644 --- a/django/template/backends/django.py +++ b/django/template/backends/django.py @@ -1,8 +1,10 @@ +from collections import defaultdict from importlib import import_module from pkgutil import walk_packages from django.apps import apps from django.conf import settings +from django.core.checks import Error, Warning from django.template import TemplateDoesNotExist from django.template.context import make_context from django.template.engine import Engine @@ -25,6 +27,50 @@ class DjangoTemplates(BaseEngine): super().__init__(params) self.engine = Engine(self.dirs, self.app_dirs, **options) + def check(self, **kwargs): + return [ + *self._check_string_if_invalid_is_string(), + *self._check_for_template_tags_with_the_same_name(), + ] + + def _check_string_if_invalid_is_string(self): + value = self.engine.string_if_invalid + if not isinstance(value, str): + return [ + Error( + "'string_if_invalid' in TEMPLATES OPTIONS must be a string but " + "got: %r (%s)." % (value, type(value)), + obj=self, + id="templates.E002", + ) + ] + return [] + + def _check_for_template_tags_with_the_same_name(self): + libraries = defaultdict(set) + + for module_name, module_path in get_template_tag_modules(): + libraries[module_name].add(module_path) + + for module_name, module_path in self.engine.libraries.items(): + libraries[module_name].add(module_path) + + errors = [] + + for library_name, items in libraries.items(): + if len(items) > 1: + items = ", ".join(repr(item) for item in sorted(items)) + errors.append( + Warning( + f"{library_name!r} is used for multiple template tag modules: " + f"{items}", + obj=self, + id="templates.W003", + ) + ) + + return errors + def from_string(self, template_code): return Template(self.engine.from_string(template_code), self) |
