django-cotton/django_cotton/apps.py
2024-09-29 20:46:40 +01:00

88 lines
2.9 KiB
Python

"""
django-cotton
App configuration to set up the cotton loader and builtins automatically.
"""
import re
from contextlib import suppress
import django.contrib.admin
import django.template
from django.apps import AppConfig
from django.conf import settings
def wrap_loaders(name):
for template_config in settings.TEMPLATES:
engine_name = template_config.get("NAME")
if not engine_name:
engine_name = template_config["BACKEND"].split(".")[-2]
if engine_name == name:
loaders = template_config.setdefault("OPTIONS", {}).get("loaders", [])
loaders_already_configured = (
loaders
and isinstance(loaders, (list, tuple))
and isinstance(loaders[0], (tuple, list))
and loaders[0][0] == "django.template.loaders.cached.Loader"
and "django_cotton.cotton_loader.Loader" in loaders[0][1]
)
if not loaders_already_configured:
template_config.pop("APP_DIRS", None)
default_loaders = [
"django_cotton.cotton_loader.Loader",
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
]
cached_loaders = [("django.template.loaders.cached.Loader", default_loaders)]
template_config["OPTIONS"]["loaders"] = cached_loaders
options = template_config.setdefault("OPTIONS", {})
builtins = options.setdefault("builtins", [])
builtins_already_configured = (
builtins and "django_cotton.templatetags.cotton" in builtins
)
if not builtins_already_configured:
template_config["OPTIONS"]["builtins"].insert(
0, "django_cotton.templatetags.cotton"
)
break
# Force re-evaluation of settings.TEMPLATES because EngineHandler caches it.
with suppress(AttributeError):
del django.template.engines.templates
django.template.engines._engines = {}
class LoaderAppConfig(AppConfig):
"""
This, the default configuration, does the automatic setup of a partials loader.
"""
name = "django_cotton"
default = True
def ready(self):
from django.template import base
# Support for multiline tags
base.tag_re = re.compile(base.tag_re.pattern, re.DOTALL)
wrap_loaders("django")
class SimpleAppConfig(AppConfig):
"""
This, the non-default configuration, allows the user to opt-out of the automatic configuration. They just need to
add "django_cotton.apps.SimpleAppConfig" to INSTALLED_APPS instead of "django_cotton".
"""
name = "django_cotton"
def ready(self):
from django.template import base
# Support for multiline tags
base.tag_re = re.compile(base.tag_re.pattern, re.DOTALL)