Skip to content

Commit

Permalink
Fixed #22699 -- Configure default settings in some management commands.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
aaugustin committed May 27, 2014
1 parent 2e613ea commit 4865326
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 25 deletions.
53 changes: 28 additions & 25 deletions django/core/management/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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):
"""
Expand Down Expand Up @@ -260,12 +254,11 @@ def main_help_text(self, commands_only=False):
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 err:
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)." % err))
"Note that only Django core commands are listed "
"as settings are not properly configured (error: %s)."
% self.settings_exception))

return '\n'.join(usage)

Expand Down Expand Up @@ -384,21 +377,31 @@ def execute(self):
except: # Needed because parser.parse_args can raise SystemExit
pass # Ignore any option errors at this point.

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:
# Some commands are supposed to work without configured settings
pass
else:
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()

try:
subcommand = self.argv[1]
except IndexError:
subcommand = 'help' # Display help if no arguments were given.

if subcommand == 'help':
if len(args) <= 2:
parser.print_lax_help()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Regression for #22699.
# Generated at {% now "DATE_FORMAT" %}

0 comments on commit 4865326

Please sign in to comment.