app/django/template/loaders/filesystem.py
author Sverre Rabbelier <srabbelier@gmail.com>
Sat, 22 Nov 2008 14:53:23 +0000
changeset 555 3cdfb42d941b
parent 323 ff1a9aa48cfd
permissions -rw-r--r--
Split the list view code up in three pieces 1. getListContents which returns the required contents dictionary 2. _list which returns the response for a specified list of contents 3. list which constructs just one content dict and passes it to _list This way it is easier to do step 1 and 2 in other code than list(), which makes it possible to display multiple list pages (by calling getListContents multiple times and passing the result to _list).

"""
Wrapper for loading templates from the filesystem.
"""

from django.conf import settings
from django.template import TemplateDoesNotExist
from django.utils._os import safe_join

def get_template_sources(template_name, template_dirs=None):
    """
    Returns the absolute paths to "template_name", when appended to each
    directory in "template_dirs". Any paths that don't lie inside one of the
    template dirs are excluded from the result set, for security reasons.
    """
    if not template_dirs:
        template_dirs = settings.TEMPLATE_DIRS
    for template_dir in template_dirs:
        try:
            yield safe_join(template_dir, template_name)
        except UnicodeDecodeError:
            # The template dir name was a bytestring that wasn't valid UTF-8.
            raise
        except ValueError:
            # The joined path was located outside of this particular
            # template_dir (it might be inside another one, so this isn't
            # fatal).
            pass

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().decode(settings.FILE_CHARSET), filepath)
        except IOError:
            tried.append(filepath)
    if tried:
        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