[1.7.x] Fixed #22699 -- Configure default settings in some management commands.
This makes it possible to run django.setup() in management commands that
don't need a settings module. In addition it simplifies error handling.
Thanks Claude for the review.
Backport of 4865326f
from master.
This commit is contained in:
parent
c0a56001e0
commit
430faebe3b
|
@ -107,18 +107,11 @@ def get_commands():
|
|||
"""
|
||||
commands = {name: 'django.core' for name in find_commands(__path__[0])}
|
||||
|
||||
# Find the installed apps
|
||||
try:
|
||||
settings.INSTALLED_APPS
|
||||
except ImproperlyConfigured:
|
||||
# Still useful for commands that do not require functional
|
||||
# settings, like startproject or help.
|
||||
app_names = []
|
||||
else:
|
||||
app_configs = apps.get_app_configs()
|
||||
app_names = [app_config.name for app_config in app_configs]
|
||||
if not settings.configured:
|
||||
return commands
|
||||
|
||||
app_names = [app_config.name for app_config in apps.get_app_configs()]
|
||||
|
||||
# Find and load the management module for each installed app.
|
||||
for app_name in reversed(app_names):
|
||||
try:
|
||||
path = find_management_module(app_name)
|
||||
|
@ -232,6 +225,7 @@ class ManagementUtility(object):
|
|||
def __init__(self, argv=None):
|
||||
self.argv = argv or sys.argv[:]
|
||||
self.prog_name = os.path.basename(self.argv[0])
|
||||
self.settings_exception = None
|
||||
|
||||
def main_help_text(self, commands_only=False):
|
||||
"""
|
||||
|
@ -260,12 +254,11 @@ class ManagementUtility(object):
|
|||
for name in sorted(commands_dict[app]):
|
||||
usage.append(" %s" % name)
|
||||
# Output an extra note if settings are not properly configured
|
||||
try:
|
||||
settings.INSTALLED_APPS
|
||||
except ImproperlyConfigured as e:
|
||||
if self.settings_exception is not None:
|
||||
usage.append(style.NOTICE(
|
||||
"Note that only Django core commands are listed as settings "
|
||||
"are not properly configured (error: %s)." % e))
|
||||
"Note that only Django core commands are listed "
|
||||
"as settings are not properly configured (error: %s)."
|
||||
% self.settings_exception))
|
||||
|
||||
return '\n'.join(usage)
|
||||
|
||||
|
@ -382,21 +375,31 @@ class ManagementUtility(object):
|
|||
except: # Needed because parser.parse_args can raise SystemExit
|
||||
pass # Ignore any option errors at this point.
|
||||
|
||||
try:
|
||||
settings.INSTALLED_APPS
|
||||
except ImproperlyConfigured:
|
||||
# Some commands are supposed to work without configured settings
|
||||
pass
|
||||
else:
|
||||
django.setup()
|
||||
|
||||
self.autocomplete()
|
||||
|
||||
try:
|
||||
subcommand = self.argv[1]
|
||||
except IndexError:
|
||||
subcommand = 'help' # Display help if no arguments were given.
|
||||
|
||||
no_settings_commands = [
|
||||
'help', 'version', '--help', '--version', '-h',
|
||||
'compilemessages', 'makemessages',
|
||||
'startapp', 'startproject',
|
||||
]
|
||||
|
||||
try:
|
||||
settings.INSTALLED_APPS
|
||||
except ImproperlyConfigured as exc:
|
||||
self.settings_exception = exc
|
||||
# A handful of built-in management commands work without settings.
|
||||
# Load the default settings -- where INSTALLED_APPS is empty.
|
||||
if subcommand in no_settings_commands:
|
||||
settings.configure()
|
||||
|
||||
if settings.configured:
|
||||
django.setup()
|
||||
|
||||
self.autocomplete()
|
||||
|
||||
if subcommand == 'help':
|
||||
if len(args) <= 2:
|
||||
parser.print_lax_help()
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
# Regression for #22699.
|
||||
# Generated at {% now "DATE_FORMAT" %}
|
Loading…
Reference in New Issue