summaryrefslogtreecommitdiff
path: root/django/template/loaders
diff options
context:
space:
mode:
authorAdrian Holovaty <adrian@holovaty.com>2006-05-02 01:31:56 +0000
committerAdrian Holovaty <adrian@holovaty.com>2006-05-02 01:31:56 +0000
commitf69cf70ed813a8cd7e1f963a14ae39103e8d5265 (patch)
treed3b32e84cd66573b3833ddf662af020f8ef2f7a8 /django/template/loaders
parentd5dbeaa9be359a4c794885c2e9f1b5a7e5e51fb8 (diff)
MERGED MAGIC-REMOVAL BRANCH TO TRUNK. This change is highly backwards-incompatible. Please read http://code.djangoproject.com/wiki/RemovingTheMagic for upgrade instructions.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@2809 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/template/loaders')
-rw-r--r--django/template/loaders/__init__.py0
-rw-r--r--django/template/loaders/app_directories.py41
-rw-r--r--django/template/loaders/eggs.py25
-rw-r--r--django/template/loaders/filesystem.py25
4 files changed, 91 insertions, 0 deletions
diff --git a/django/template/loaders/__init__.py b/django/template/loaders/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/template/loaders/__init__.py
diff --git a/django/template/loaders/app_directories.py b/django/template/loaders/app_directories.py
new file mode 100644
index 0000000000..8a9bfef4b6
--- /dev/null
+++ b/django/template/loaders/app_directories.py
@@ -0,0 +1,41 @@
+# Wrapper for loading templates from "template" directories in installed app packages.
+
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+from django.template import TemplateDoesNotExist
+import os
+
+# At compile time, cache the directories to search.
+app_template_dirs = []
+for app in settings.INSTALLED_APPS:
+ i = app.rfind('.')
+ if i == -1:
+ m, a = app, None
+ else:
+ m, a = app[:i], app[i+1:]
+ try:
+ if a is None:
+ mod = __import__(m, '', '', [])
+ else:
+ mod = getattr(__import__(m, '', '', [a]), a)
+ except ImportError, e:
+ raise ImproperlyConfigured, 'ImportError %s: %s' % (app, e.args[0])
+ template_dir = os.path.join(os.path.dirname(mod.__file__), 'templates')
+ if os.path.isdir(template_dir):
+ app_template_dirs.append(template_dir)
+
+# It won't change, so convert it to a tuple to save memory.
+app_template_dirs = tuple(app_template_dirs)
+
+def get_template_sources(template_name, template_dirs=None):
+ for template_dir in app_template_dirs:
+ yield os.path.join(template_dir, template_name)
+
+def load_template_source(template_name, template_dirs=None):
+ for filepath in get_template_sources(template_name, template_dirs):
+ try:
+ return (open(filepath).read(), filepath)
+ except IOError:
+ pass
+ raise TemplateDoesNotExist, template_name
+load_template_source.is_usable = True
diff --git a/django/template/loaders/eggs.py b/django/template/loaders/eggs.py
new file mode 100644
index 0000000000..6184aeaccf
--- /dev/null
+++ b/django/template/loaders/eggs.py
@@ -0,0 +1,25 @@
+# Wrapper for loading templates from eggs via pkg_resources.resource_string.
+
+try:
+ from pkg_resources import resource_string
+except ImportError:
+ resource_string = None
+
+from django.template import TemplateDoesNotExist
+from django.conf import settings
+
+def load_template_source(template_name, template_dirs=None):
+ """
+ Loads templates from Python eggs via pkg_resource.resource_string.
+
+ For every installed app, it tries to get the resource (app, template_name).
+ """
+ if resource_string is not None:
+ pkg_name = 'templates/' + template_name
+ for app in settings.INSTALLED_APPS:
+ try:
+ return (resource_string(app, pkg_name), 'egg:%s:%s ' % (app, pkg_name))
+ except:
+ pass
+ raise TemplateDoesNotExist, template_name
+load_template_source.is_usable = resource_string is not None
diff --git a/django/template/loaders/filesystem.py b/django/template/loaders/filesystem.py
new file mode 100644
index 0000000000..0c94021fb8
--- /dev/null
+++ b/django/template/loaders/filesystem.py
@@ -0,0 +1,25 @@
+# Wrapper for loading templates from the filesystem.
+
+from django.conf import settings
+from django.template import TemplateDoesNotExist
+import os
+
+def get_template_sources(template_name, template_dirs=None):
+ if not template_dirs:
+ template_dirs = settings.TEMPLATE_DIRS
+ for template_dir in template_dirs:
+ yield os.path.join(template_dir, template_name)
+
+def load_template_source(template_name, template_dirs=None):
+ tried = []
+ for filepath in get_template_sources(template_name, template_dirs):
+ try:
+ return (open(filepath).read(), filepath)
+ except IOError:
+ tried.append(filepath)
+ if template_dirs:
+ error_msg = "Tried %s" % tried
+ else:
+ error_msg = "Your TEMPLATE_DIRS setting is empty. Change it to point to at least one template directory."
+ raise TemplateDoesNotExist, error_msg
+load_template_source.is_usable = True