Fixed #23866 -- Harmonized refs to Django documentation from code

This commit is contained in:
Claude Paroz 2014-12-25 13:30:37 +01:00
parent a6f0b6a98f
commit 234a2e0b6b
9 changed files with 37 additions and 21 deletions

View File

@ -2,13 +2,14 @@ from django.core.exceptions import ImproperlyConfigured
# Want to get everything from the 'normal' models package. # Want to get everything from the 'normal' models package.
from django.db.models import * # NOQA from django.db.models import * # NOQA
from django.utils.version import get_docs_version
from django.contrib.gis.geos import HAS_GEOS from django.contrib.gis.geos import HAS_GEOS
if not HAS_GEOS: if not HAS_GEOS:
raise ImproperlyConfigured( raise ImproperlyConfigured(
"GEOS is required and has not been detected. Are you sure it is installed? " "GEOS is required and has not been detected. Are you sure it is installed? "
"See also https://docs.djangoproject.com/en/stable/ref/contrib/gis/install/geolibs/") "See also https://docs.djangoproject.com/en/%s/ref/contrib/gis/install/geolibs/" % get_docs_version())
# Geographic aggregate functions # Geographic aggregate functions
from django.contrib.gis.db.models.aggregates import * # NOQA from django.contrib.gis.db.models.aggregates import * # NOQA

View File

@ -1,5 +1,4 @@
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.utils import six
from django.conf import settings from django.conf import settings
from django.db import connections, DEFAULT_DB_ALIAS, migrations from django.db import connections, DEFAULT_DB_ALIAS, migrations
from django.db.migrations.loader import AmbiguityError from django.db.migrations.loader import AmbiguityError
@ -7,6 +6,8 @@ from django.db.migrations.executor import MigrationExecutor
from django.db.migrations.writer import MigrationWriter from django.db.migrations.writer import MigrationWriter
from django.db.migrations.optimizer import MigrationOptimizer from django.db.migrations.optimizer import MigrationOptimizer
from django.db.migrations.migration import SwappableTuple from django.db.migrations.migration import SwappableTuple
from django.utils import six
from django.utils.version import get_docs_version
class Command(BaseCommand): class Command(BaseCommand):
@ -85,7 +86,7 @@ class Command(BaseCommand):
raise CommandError( raise CommandError(
"You cannot squash squashed migrations! Please transition " "You cannot squash squashed migrations! Please transition "
"it to a normal migration first: " "it to a normal migration first: "
"https://docs.djangoproject.com/en/1.7/topics/migrations/#squashing-migrations" "https://docs.djangoproject.com/en/%s/topics/migrations/#squashing-migrations" % get_docs_version()
) )
operations.extend(smigration.operations) operations.extend(smigration.operations)
for dependency in smigration.dependencies: for dependency in smigration.dependencies:

View File

@ -10,6 +10,7 @@ from django.conf import settings
from django.core.management.base import CommandError from django.core.management.base import CommandError
from django.db import models, router from django.db import models, router
from django.utils.deprecation import RemovedInDjango19Warning from django.utils.deprecation import RemovedInDjango19Warning
from django.utils.version import get_docs_version
def check_for_migrations(app_config, connection): def check_for_migrations(app_config, connection):
@ -31,9 +32,11 @@ def sql_create(app_config, style, connection):
if connection.settings_dict['ENGINE'] == 'django.db.backends.dummy': if connection.settings_dict['ENGINE'] == 'django.db.backends.dummy':
# This must be the "dummy" database backend, which means the user # This must be the "dummy" database backend, which means the user
# hasn't set ENGINE for the database. # hasn't set ENGINE for the database.
raise CommandError("Django doesn't know which syntax to use for your SQL statements,\n" + raise CommandError(
"because you haven't properly specified the ENGINE setting for the database.\n" + "Django doesn't know which syntax to use for your SQL statements,\n"
"see: https://docs.djangoproject.com/en/dev/ref/settings/#databases") "because you haven't properly specified the ENGINE setting for the database.\n"
"see: https://docs.djangoproject.com/en/%s/ref/settings/#databases" % get_docs_version()
)
# Get installed models, so we generate REFERENCES right. # Get installed models, so we generate REFERENCES right.
# We trim models from the current app so that the sqlreset command does not # We trim models from the current app so that the sqlreset command does not

View File

@ -16,6 +16,7 @@ from django.template import Template, Context
from django.utils import archive from django.utils import archive
from django.utils.six.moves.urllib.request import urlretrieve from django.utils.six.moves.urllib.request import urlretrieve
from django.utils._os import rmtree_errorhandler from django.utils._os import rmtree_errorhandler
from django.utils.version import get_docs_version
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.core.management.utils import handle_extensions from django.core.management.utils import handle_extensions
@ -100,15 +101,11 @@ class TemplateCommand(BaseCommand):
base_name = '%s_name' % app_or_project base_name = '%s_name' % app_or_project
base_subdir = '%s_template' % app_or_project base_subdir = '%s_template' % app_or_project
base_directory = '%s_directory' % app_or_project base_directory = '%s_directory' % app_or_project
if django.VERSION[-2] != 'final':
docs_version = 'dev'
else:
docs_version = '%d.%d' % django.VERSION[:2]
context = Context(dict(options, **{ context = Context(dict(options, **{
base_name: name, base_name: name,
base_directory: top_dir, base_directory: top_dir,
'docs_version': docs_version, 'docs_version': get_docs_version(),
'django_version': django.__version__, 'django_version': django.__version__,
}), autoescape=False) }), autoescape=False)

View File

@ -10,6 +10,7 @@ from django.conf import settings
from django.utils import six from django.utils import six
from django.utils.encoding import force_text, smart_text from django.utils.encoding import force_text, smart_text
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from django.utils.version import get_docs_version
class InvalidBasesError(ValueError): class InvalidBasesError(ValueError):
@ -71,8 +72,8 @@ class ProjectState(object):
raise InvalidBasesError( raise InvalidBasesError(
"Cannot resolve bases for %r\nThis can happen if you are inheriting models from an " "Cannot resolve bases for %r\nThis can happen if you are inheriting models from an "
"app with migrations (e.g. contrib.auth)\n in an app with no migrations; see " "app with migrations (e.g. contrib.auth)\n in an app with no migrations; see "
"https://docs.djangoproject.com/en/1.7/topics/migrations/#dependencies " "https://docs.djangoproject.com/en/%s/topics/migrations/#dependencies "
"for more" % new_unrendered_models "for more" % (new_unrendered_models, get_docs_version())
) )
unrendered_models = new_unrendered_models unrendered_models = new_unrendered_models
# make sure apps has no dangling references # make sure apps has no dangling references

View File

@ -18,6 +18,7 @@ from django.utils import datetime_safe, six
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.functional import Promise from django.utils.functional import Promise
from django.utils.timezone import utc from django.utils.timezone import utc
from django.utils.version import get_docs_version
COMPILED_REGEX_TYPE = type(re.compile('')) COMPILED_REGEX_TYPE = type(re.compile(''))
@ -389,8 +390,8 @@ class MigrationWriter(object):
"declared and used in the same class body). Please move " "declared and used in the same class body). Please move "
"the function into the main module body to use migrations.\n" "the function into the main module body to use migrations.\n"
"For more information, see " "For more information, see "
"https://docs.djangoproject.com/en/dev/topics/migrations/#serializing-values" "https://docs.djangoproject.com/en/%s/topics/migrations/#serializing-values"
% (value.__name__, module_name)) % (value.__name__, module_name, get_docs_version()))
return "%s.%s" % (module_name, value.__name__), {"import %s" % module_name} return "%s.%s" % (module_name, value.__name__), {"import %s" % module_name}
# Other iterables # Other iterables
elif isinstance(value, collections.Iterable): elif isinstance(value, collections.Iterable):
@ -419,8 +420,8 @@ class MigrationWriter(object):
else: else:
raise ValueError( raise ValueError(
"Cannot serialize: %r\nThere are some values Django cannot serialize into " "Cannot serialize: %r\nThere are some values Django cannot serialize into "
"migration files.\nFor more, see https://docs.djangoproject.com/en/dev/" "migration files.\nFor more, see https://docs.djangoproject.com/en/%s/"
"topics/migrations/#migration-serializing" % value "topics/migrations/#migration-serializing" % (value, get_docs_version())
) )

View File

@ -1,6 +1,8 @@
from __future__ import absolute_import # Avoid importing `importlib` from this package. from __future__ import absolute_import # Avoid importing `importlib` from this package.
from importlib import import_module from importlib import import_module
from django.utils.version import get_docs_version
def deconstructible(*args, **kwargs): def deconstructible(*args, **kwargs):
""" """
@ -38,8 +40,8 @@ def deconstructible(*args, **kwargs):
"classes. Please move the object into the main module " "classes. Please move the object into the main module "
"body to use migrations.\n" "body to use migrations.\n"
"For more information, see " "For more information, see "
"https://docs.djangoproject.com/en/dev/topics/migrations/#serializing-values" "https://docs.djangoproject.com/en/%s/topics/migrations/#serializing-values"
% (name, module_name)) % (name, module_name, get_docs_version()))
return ( return (
path or '%s.%s' % (obj.__class__.__module__, name), path or '%s.%s' % (obj.__class__.__module__, name),
obj._constructor_args[0], obj._constructor_args[0],

View File

@ -52,6 +52,14 @@ def get_complete_version(version=None):
return version return version
def get_docs_version(version=None):
version = get_complete_version(version)
if version[3] != 'final':
return 'dev'
else:
return '%d.%d' % version[:2]
@lru_cache() @lru_cache()
def get_git_changeset(): def get_git_changeset():
"""Returns a numeric identifier of the latest git changeset. """Returns a numeric identifier of the latest git changeset.

View File

@ -2,6 +2,7 @@ from django.conf import settings
from django.http import HttpResponseForbidden from django.http import HttpResponseForbidden
from django.template import Context, Template from django.template import Context, Template
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.utils.version import get_docs_version
# We include the template inline since we need to be able to reliably display # We include the template inline since we need to be able to reliably display
# this error message, especially for the sake of developers, and there isn't any # this error message, especially for the sake of developers, and there isn't any
@ -58,7 +59,7 @@ CSRF_FAILURE_TEMPLATE = """
<p>In general, this can occur when there is a genuine Cross Site Request Forgery, or when <p>In general, this can occur when there is a genuine Cross Site Request Forgery, or when
<a <a
href='http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ref-contrib-csrf'>Django's href='https://docs.djangoproject.com/en/{{ docs_version }}/ref/contrib/csrf/#ref-contrib-csrf'>Django's
CSRF mechanism</a> has not been used correctly. For POST forms, you need to CSRF mechanism</a> has not been used correctly. For POST forms, you need to
ensure:</p> ensure:</p>
@ -66,7 +67,7 @@ CSRF_FAILURE_TEMPLATE = """
<li>Your browser is accepting cookies.</li> <li>Your browser is accepting cookies.</li>
<li>The view function uses <a <li>The view function uses <a
href='http://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext'><code>RequestContext</code></a> href='https://docs.djangoproject.com/en/{{ docs_version }}/ref/templates/api/#subclassing-context-requestcontext'><code>RequestContext</code></a>
for the template, instead of <code>Context</code>.</li> for the template, instead of <code>Context</code>.</li>
<li>In the template, there is a <code>{% templatetag openblock %} csrf_token <li>In the template, there is a <code>{% templatetag openblock %} csrf_token
@ -126,6 +127,7 @@ def csrf_failure(request, reason=""):
"re-enable them, at least for this site, or for 'same-origin' " "re-enable them, at least for this site, or for 'same-origin' "
"requests."), "requests."),
'DEBUG': settings.DEBUG, 'DEBUG': settings.DEBUG,
'docs_version': get_docs_version(),
'more': _("More information is available with DEBUG=True."), 'more': _("More information is available with DEBUG=True."),
}) })
return HttpResponseForbidden(t.render(c), content_type='text/html') return HttpResponseForbidden(t.render(c), content_type='text/html')