Fixed #7423 -- Skip superuser creation when not running in a TTY.
Thanks to trac user galaxy4sale for the original report and to AeroNotix for the patch.
This commit is contained in:
parent
81cd3a7460
commit
a7639722f5
|
@ -17,6 +17,10 @@ from django.utils.six.moves import input
|
||||||
from django.utils.text import capfirst
|
from django.utils.text import capfirst
|
||||||
|
|
||||||
|
|
||||||
|
class NotRunningInTTYException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
@ -80,6 +84,9 @@ class Command(BaseCommand):
|
||||||
default_username = get_default_username()
|
default_username = get_default_username()
|
||||||
try:
|
try:
|
||||||
|
|
||||||
|
if not self.stdin.isatty():
|
||||||
|
raise NotRunningInTTYException("Not running in a TTY")
|
||||||
|
|
||||||
# Get a username
|
# Get a username
|
||||||
verbose_field_name = self.username_field.verbose_name
|
verbose_field_name = self.username_field.verbose_name
|
||||||
while username is None:
|
while username is None:
|
||||||
|
@ -136,8 +143,16 @@ class Command(BaseCommand):
|
||||||
self.stderr.write("\nOperation cancelled.")
|
self.stderr.write("\nOperation cancelled.")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
user_data[self.UserModel.USERNAME_FIELD] = username
|
except NotRunningInTTYException:
|
||||||
user_data['password'] = password
|
self.stdout.write(
|
||||||
self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
|
"Superuser creation skipped due to not running in a TTY. "
|
||||||
if verbosity >= 1:
|
"You can run `manage.py createsuperuser` in your project "
|
||||||
self.stdout.write("Superuser created successfully.")
|
"to create one manually."
|
||||||
|
)
|
||||||
|
|
||||||
|
if username:
|
||||||
|
user_data[self.UserModel.USERNAME_FIELD] = username
|
||||||
|
user_data['password'] = password
|
||||||
|
self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
|
||||||
|
if verbosity >= 1:
|
||||||
|
self.stdout.write("Superuser created successfully.")
|
||||||
|
|
|
@ -191,6 +191,27 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
|
||||||
|
|
||||||
self.assertEqual(CustomUser._default_manager.count(), 0)
|
self.assertEqual(CustomUser._default_manager.count(), 0)
|
||||||
|
|
||||||
|
def test_skip_if_not_in_TTY(self):
|
||||||
|
"""
|
||||||
|
If the command is not called from a TTY, it should be skipped and a
|
||||||
|
message should be displayed (#7423).
|
||||||
|
"""
|
||||||
|
class FakeStdin(object):
|
||||||
|
"""A fake stdin object that has isatty() return False."""
|
||||||
|
def isatty(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
out = StringIO()
|
||||||
|
call_command(
|
||||||
|
"createsuperuser",
|
||||||
|
stdin=FakeStdin(),
|
||||||
|
stdout=out,
|
||||||
|
interactive=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(User._default_manager.count(), 0)
|
||||||
|
self.assertIn("Superuser creation skipped", out.getvalue())
|
||||||
|
|
||||||
|
|
||||||
class CustomUserModelValidationTestCase(TestCase):
|
class CustomUserModelValidationTestCase(TestCase):
|
||||||
@override_settings(AUTH_USER_MODEL='auth.CustomUserNonListRequiredFields')
|
@override_settings(AUTH_USER_MODEL='auth.CustomUserNonListRequiredFields')
|
||||||
|
|
Loading…
Reference in New Issue