1
0
mirror of https://github.com/django/django.git synced 2025-07-04 09:49:12 +00:00

i18n: merged to [873] from trunk

git-svn-id: http://code.djangoproject.com/svn/django/branches/i18n@874 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Georg Bauer 2005-10-14 23:32:35 +00:00
commit cde24debb7
6 changed files with 298 additions and 169 deletions

View File

@ -71,6 +71,14 @@ TEMPLATE_DIRS = ()
# Extension on all templates. # Extension on all templates.
TEMPLATE_FILE_EXTENSION = '.html' TEMPLATE_FILE_EXTENSION = '.html'
# List of callables that know how to import templates from various sources.
# See the comments in django/core/template/loader.py for interface
# documentation.
TEMPLATE_LOADERS = (
'django.core.template.loaders.filesystem.load_template_source',
# 'django.core.template.loaders.eggs.load_template_source',
)
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash. # trailing slash.
# Examples: "http://foo.com/media/", "/media/". # Examples: "http://foo.com/media/", "/media/".

View File

@ -1,7 +1,50 @@
"Wrapper for loading templates from storage of some sort (e.g. files or db)" # Wrapper for loading templates from storage of some sort (e.g. filesystem, database).
#
# This uses the TEMPLATE_LOADERS setting, which is a list of loaders to use.
# Each loader is expected to have this interface:
#
# callable(name, dirs=[])
#
# name is the template name.
# dirs is an optional list of directories to search instead of TEMPLATE_DIRS.
#
# Each loader should have an "is_usable" attribute set. This is a boolean that
# specifies whether the loader can be used in this Python installation. Each
# loader is responsible for setting this when it's initialized.
#
# For example, the eggs loader (which is capable of loading templates from
# Python eggs) sets is_usable to False if the "pkg_resources" module isn't
# installed, because pkg_resources is necessary to read eggs.
from django.core.exceptions import ImproperlyConfigured
from django.core.template import Template, Context, Node, TemplateDoesNotExist, TemplateSyntaxError, resolve_variable_with_filters, register_tag from django.core.template import Template, Context, Node, TemplateDoesNotExist, TemplateSyntaxError, resolve_variable_with_filters, register_tag
from django.core.template.loaders.filesystem import load_template_source from django.conf.settings import TEMPLATE_LOADERS
template_source_loaders = []
for path in TEMPLATE_LOADERS:
i = path.rfind('.')
module, attr = path[:i], path[i+1:]
try:
mod = __import__(module, globals(), locals(), [attr])
except ImportError, e:
raise ImproperlyConfigured, 'Error importing template source loader %s: "%s"' % (module, e)
try:
func = getattr(mod, attr)
except AttributeError:
raise ImproperlyConfigured, 'Module "%s" does not define a "%s" callable template source loader' % (module, attr)
if not func.is_usable:
import warnings
warnings.warn("Your TEMPLATE_LOADERS setting includes %r, but your Python installation doesn't support that type of template loading. Consider removing that line from TEMPLATE_LOADERS." % path)
else:
template_source_loaders.append(func)
def load_template_source(name, dirs=None):
for loader in template_source_loaders:
try:
return loader(name, dirs)
except TemplateDoesNotExist:
pass
raise TemplateDoesNotExist, name
class ExtendsError(Exception): class ExtendsError(Exception):
pass pass

View File

@ -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.core.template import TemplateDoesNotExist
from django.conf.settings import INSTALLED_APPS, TEMPLATE_FILE_EXTENSION
def load_template_source(name, dirs=None):
"""
Loads templates from Python eggs via pkg_resource.resource_string.
For every installed app, it tries to get the resource (app, name).
"""
if resource_string is not None:
pkg_name = 'templates/' + name + TEMPLATE_FILE_EXTENSION
for app in INSTALLED_APPS:
try:
return resource_string(app, pkg_name)
except:
pass
raise TemplateDoesNotExist, name
load_template_source.is_usable = resource_string is not None

View File

@ -19,3 +19,4 @@ def load_template_source(template_name, template_dirs=None):
else: else:
error_msg = "Your TEMPLATE_DIRS settings is empty. Change it to point to at least one template directory." error_msg = "Your TEMPLATE_DIRS settings is empty. Change it to point to at least one template directory."
raise TemplateDoesNotExist, error_msg raise TemplateDoesNotExist, error_msg
load_template_source.is_usable = True

View File

@ -1,164 +1,213 @@
#!python #!python
"""Bootstrap setuptools installation """Bootstrap setuptools installation
If you want to use setuptools in your package's setup.py, just include this If you want to use setuptools in your package's setup.py, just include this
file in the same directory with it, and add this to the top of your setup.py:: file in the same directory with it, and add this to the top of your setup.py::
from ez_setup import use_setuptools from ez_setup import use_setuptools
use_setuptools() use_setuptools()
If you want to require a specific version of setuptools, set a download If you want to require a specific version of setuptools, set a download
mirror, or use an alternate download directory, you can do so by supplying mirror, or use an alternate download directory, you can do so by supplying
the appropriate options to ``use_setuptools()``. the appropriate options to ``use_setuptools()``.
This file can also be run as a script to install or upgrade setuptools. This file can also be run as a script to install or upgrade setuptools.
""" """
import sys
DEFAULT_VERSION = "0.5a12" DEFAULT_VERSION = "0.6a5"
DEFAULT_URL = "http://www.python.org/packages/source/s/setuptools/" DEFAULT_URL = "http://cheeseshop.python.org/packages/%s/s/setuptools/" % sys.version[:3]
import sys, os md5_data = {
'setuptools-0.5a13-py2.3.egg': '85edcf0ef39bab66e130d3f38f578c86',
'setuptools-0.5a13-py2.4.egg': 'ede4be600e3890e06d4ee5e0148e092a',
'setuptools-0.6a1-py2.3.egg': 'ee819a13b924d9696b0d6ca6d1c5833d',
'setuptools-0.6a1-py2.4.egg': '8256b5f1cd9e348ea6877b5ddd56257d',
'setuptools-0.6a2-py2.3.egg': 'b98da449da411267c37a738f0ab625ba',
'setuptools-0.6a2-py2.4.egg': 'be5b88bc30aed63fdefd2683be135c3b',
'setuptools-0.6a3-py2.3.egg': 'ee0e325de78f23aab79d33106dc2a8c8',
'setuptools-0.6a3-py2.4.egg': 'd95453d525a456d6c23e7a5eea89a063',
'setuptools-0.6a4-py2.3.egg': 'e958cbed4623bbf47dd1f268b99d7784',
'setuptools-0.6a4-py2.4.egg': '7f33c3ac2ef1296f0ab4fac1de4767d8',
'setuptools-0.6a5-py2.3.egg': '748408389c49bcd2d84f6ae0b01695b1',
'setuptools-0.6a5-py2.4.egg': '999bacde623f4284bfb3ea77941d2627',
}
import sys, os
def _validate_md5(egg_name, data):
if egg_name in md5_data:
from md5 import md5
digest = md5(data).hexdigest()
if digest != md5_data[egg_name]:
def use_setuptools( print >>sys.stderr, (
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir "md5 validation of %s failed! (Possible download problem?)"
): % egg_name
"""Automatically find/download setuptools and make it available on sys.path )
sys.exit(2)
`version` should be a valid setuptools version number that is available return data
as an egg for download under the `download_base` URL (which should end with
a '/'). `to_dir` is the directory where setuptools will be downloaded, if
it is not already available. def use_setuptools(
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
If an older version of setuptools is installed, this will print a message download_delay=15
to ``sys.stderr`` and raise SystemExit in an attempt to abort the calling ):
script. """Automatically find/download setuptools and make it available on sys.path
"""
try: `version` should be a valid setuptools version number that is available
import setuptools as an egg for download under the `download_base` URL (which should end with
if setuptools.__version__ == '0.0.1': a '/'). `to_dir` is the directory where setuptools will be downloaded, if
print >>sys.stderr, ( it is not already available. If `download_delay` is specified, it should
"You have an obsolete version of setuptools installed. Please\n" be the number of seconds that will be paused before initiating a download,
"remove it from your system entirely before rerunning this script." should one be required. If an older version of setuptools is installed,
) this routine will print a message to ``sys.stderr`` and raise SystemExit in
sys.exit(2) an attempt to abort the calling script.
"""
except ImportError: try:
egg = download_setuptools(version, download_base, to_dir) import setuptools
sys.path.insert(0, egg) if setuptools.__version__ == '0.0.1':
import setuptools; setuptools.bootstrap_install_from = egg print >>sys.stderr, (
"You have an obsolete version of setuptools installed. Please\n"
import pkg_resources "remove it from your system entirely before rerunning this script."
try: )
pkg_resources.require("setuptools>="+version) sys.exit(2)
except ImportError:
except pkg_resources.VersionConflict: egg = download_setuptools(version, download_base, to_dir, download_delay)
# XXX could we install in a subprocess here? sys.path.insert(0, egg)
print >>sys.stderr, ( import setuptools; setuptools.bootstrap_install_from = egg
"The required version of setuptools (>=%s) is not available, and\n"
"can't be installed while this script is running. Please install\n" import pkg_resources
" a more recent version first." try:
) % version pkg_resources.require("setuptools>="+version)
sys.exit(2)
except pkg_resources.VersionConflict:
def download_setuptools( # XXX could we install in a subprocess here?
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir print >>sys.stderr, (
): "The required version of setuptools (>=%s) is not available, and\n"
"""Download setuptools from a specified location and return its filename "can't be installed while this script is running. Please install\n"
" a more recent version first."
`version` should be a valid setuptools version number that is available ) % version
as an egg for download under the `download_base` URL (which should end sys.exit(2)
with a '/'). `to_dir` is the directory where the egg will be downloaded.
""" def download_setuptools(
import urllib2, shutil version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) delay = 15
url = download_base + egg_name + '.zip' # XXX ):
saveto = os.path.join(to_dir, egg_name) """Download setuptools from a specified location and return its filename
src = dst = None
`version` should be a valid setuptools version number that is available
if not os.path.exists(saveto): # Avoid repeated downloads as an egg for download under the `download_base` URL (which should end
try: with a '/'). `to_dir` is the directory where the egg will be downloaded.
from distutils import log `delay` is the number of seconds to pause before an actual download attempt.
log.warn("Downloading %s", url) """
src = urllib2.urlopen(url) import urllib2, shutil
# Read/write all in one block, so we don't create a corrupt file egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
# if the download is interrupted. url = download_base + egg_name
data = src.read() saveto = os.path.join(to_dir, egg_name)
dst = open(saveto,"wb") src = dst = None
dst.write(data) if not os.path.exists(saveto): # Avoid repeated downloads
finally: try:
if src: src.close() from distutils import log
if dst: dst.close() if delay:
log.warn("""
return os.path.realpath(saveto) ---------------------------------------------------------------------------
This script requires setuptools version %s to run (even to display
help). I will attempt to download it for you (from
%s), but
you may need to enable firewall access for this script first.
I will start the download in %d seconds.
---------------------------------------------------------------------------""",
version, download_base, delay
); from time import sleep; sleep(delay)
log.warn("Downloading %s", url)
src = urllib2.urlopen(url)
# Read/write all in one block, so we don't create a corrupt file
def main(argv, version=DEFAULT_VERSION): # if the download is interrupted.
"""Install or upgrade setuptools and EasyInstall""" data = _validate_md5(egg_name, src.read())
dst = open(saveto,"wb"); dst.write(data)
try: finally:
import setuptools if src: src.close()
except ImportError: if dst: dst.close()
import tempfile, shutil return os.path.realpath(saveto)
tmpdir = tempfile.mkdtemp(prefix="easy_install-")
try: def main(argv, version=DEFAULT_VERSION):
egg = download_setuptools(version, to_dir=tmpdir) """Install or upgrade setuptools and EasyInstall"""
sys.path.insert(0,egg)
from setuptools.command.easy_install import main try:
main(list(argv)+[egg]) import setuptools
finally: except ImportError:
shutil.rmtree(tmpdir) import tempfile, shutil
else: tmpdir = tempfile.mkdtemp(prefix="easy_install-")
if setuptools.__version__ == '0.0.1': try:
# tell the user to uninstall obsolete version egg = download_setuptools(version, to_dir=tmpdir, delay=0)
use_setuptools(version) sys.path.insert(0,egg)
from setuptools.command.easy_install import main
req = "setuptools>="+version main(list(argv)+[egg])
import pkg_resources finally:
try: shutil.rmtree(tmpdir)
pkg_resources.require(req) else:
except pkg_resources.VersionConflict: if setuptools.__version__ == '0.0.1':
try: # tell the user to uninstall obsolete version
from setuptools.command.easy_install import main use_setuptools(version)
except ImportError:
from easy_install import main req = "setuptools>="+version
main(list(argv)+[download_setuptools()]) import pkg_resources
sys.exit(0) # try to force an exit try:
else: pkg_resources.require(req)
if argv: except pkg_resources.VersionConflict:
from setuptools.command.easy_install import main try:
main(argv) from setuptools.command.easy_install import main
else: except ImportError:
print "Setuptools version",version,"or greater has been installed." from easy_install import main
print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' main(list(argv)+[download_setuptools(delay=0)])
if __name__=='__main__': sys.exit(0) # try to force an exit
main(sys.argv[1:]) else:
if argv:
from setuptools.command.easy_install import main
main(argv)
else:
print "Setuptools version",version,"or greater has been installed."
print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
def update_md5(filenames):
"""Update our built-in md5 registry"""
import re
from md5 import md5
for name in filenames:
base = os.path.basename(name)
f = open(name,'rb')
md5_data[base] = md5(f.read()).hexdigest()
f.close()
data = [" %r: %r,\n" % it for it in md5_data.items()]
data.sort()
repl = "".join(data)
import inspect
srcfile = inspect.getsourcefile(sys.modules[__name__])
f = open(srcfile, 'rb'); src = f.read(); f.close()
match = re.search("\nmd5_data = {\n([^}]+)}", src)
if not match:
print >>sys.stderr, "Internal error!"
sys.exit(2)
src = src[:match.start(1)] + repl + src[match.end(1):]
f = open(srcfile,'w')
f.write(src)
f.close()
if __name__=='__main__':
if len(sys.argv)>2 and sys.argv[1]=='--md5update':
update_md5(sys.argv[2:])
else:
main(sys.argv[1:])

View File

@ -260,15 +260,18 @@ TEMPLATE_TESTS = {
'i18n14': ('{{ bool|yesno:"ja,nein" }}', {'bool': True}, 'ja'), 'i18n14': ('{{ bool|yesno:"ja,nein" }}', {'bool': True}, 'ja'),
} }
# This replaces the standard template loader.
def test_template_loader(template_name, template_dirs=None): def test_template_loader(template_name, template_dirs=None):
"A custom template loader that loads the unit-test templates."
try: try:
return TEMPLATE_TESTS[template_name][0] return TEMPLATE_TESTS[template_name][0]
except KeyError: except KeyError:
raise template.TemplateDoesNotExist, template_name raise template.TemplateDoesNotExist, template_name
def run_tests(verbosity=0, standalone=False): def run_tests(verbosity=0, standalone=False):
loader.load_template_source, old_template_loader = test_template_loader, loader.load_template_source # Register our custom template loader.
old_template_loaders = loader.template_source_loaders
loader.template_source_loaders = [test_template_loader]
failed_tests = [] failed_tests = []
tests = TEMPLATE_TESTS.items() tests = TEMPLATE_TESTS.items()
tests.sort() tests.sort()
@ -295,7 +298,7 @@ def run_tests(verbosity=0, standalone=False):
if verbosity: if verbosity:
print "Template test: %s -- FAILED. Expected %r, got %r" % (name, vals[2], output) print "Template test: %s -- FAILED. Expected %r, got %r" % (name, vals[2], output)
failed_tests.append(name) failed_tests.append(name)
loader.load_template_source = old_template_loader loader.template_source_loaders = old_template_loaders
if failed_tests and not standalone: if failed_tests and not standalone:
msg = "Template tests %s failed." % failed_tests msg = "Template tests %s failed." % failed_tests