From 0767055dfc255ba120811f6d9cba2c7e593b0731 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Tue, 10 Jun 2014 12:22:07 -0400 Subject: [PATCH] [1.7.x] Fixed #22770 -- Removed create_superuser from post_migrate signals. Moved logic to syncdb command for backwards compatibility. Backport of 93d05536fd from master --- django/contrib/auth/management/__init__.py | 31 +------------------ django/core/management/commands/syncdb.py | 23 ++++++++++++++ docs/intro/tutorial01.txt | 35 +-------------------- docs/intro/tutorial02.txt | 36 +++++++++++++++++++--- docs/ref/django-admin.txt | 5 ++- docs/topics/auth/default.txt | 4 +-- 6 files changed, 60 insertions(+), 74 deletions(-) diff --git a/django/contrib/auth/management/__init__.py b/django/contrib/auth/management/__init__.py index 5e2a6b42e8..18cdcce598 100644 --- a/django/contrib/auth/management/__init__.py +++ b/django/contrib/auth/management/__init__.py @@ -7,15 +7,13 @@ import getpass import unicodedata from django.apps import apps -from django.contrib.auth import (models as auth_app, get_permission_codename, - get_user_model) +from django.contrib.auth import models as auth_app, get_permission_codename from django.core import exceptions from django.core.management.base import CommandError from django.db import DEFAULT_DB_ALIAS, router from django.db.models import signals from django.utils.encoding import DEFAULT_LOCALE_ENCODING from django.utils import six -from django.utils.six.moves import input def _get_all_permissions(opts, ctype): @@ -119,30 +117,6 @@ def create_permissions(app_config, verbosity=2, interactive=True, using=DEFAULT_ print("Adding permission '%s'" % perm) -def create_superuser(app_config, verbosity=2, interactive=True, using=DEFAULT_DB_ALIAS, **kwargs): - try: - apps.get_model('auth', 'Permission') - except LookupError: - return - - UserModel = get_user_model() - - from django.core.management import call_command - - if not UserModel._default_manager.exists() and interactive: - msg = ("\nYou have installed Django's auth system, and " - "don't have any superusers defined.\nWould you like to create one " - "now? (yes/no): ") - confirm = input(msg) - while 1: - if confirm not in ('yes', 'no'): - confirm = input('Please enter either "yes" or "no": ') - continue - if confirm == 'yes': - call_command("createsuperuser", interactive=True, database=using) - break - - def get_system_username(): """ Try to determine the current system user's username. @@ -207,6 +181,3 @@ def get_default_username(check_db=True): signals.post_migrate.connect(create_permissions, dispatch_uid="django.contrib.auth.management.create_permissions") -signals.post_migrate.connect(create_superuser, - sender=apps.get_app_config('auth'), - dispatch_uid="django.contrib.auth.management.create_superuser") diff --git a/django/core/management/commands/syncdb.py b/django/core/management/commands/syncdb.py index e6ca565ca2..5b4791618f 100644 --- a/django/core/management/commands/syncdb.py +++ b/django/core/management/commands/syncdb.py @@ -1,10 +1,13 @@ import warnings from optparse import make_option +from django.apps import apps +from django.contrib.auth import get_user_model from django.db import DEFAULT_DB_ALIAS from django.core.management import call_command from django.core.management.base import NoArgsCommand from django.utils.deprecation import RemovedInDjango19Warning +from django.utils.six.moves import input class Command(NoArgsCommand): @@ -22,3 +25,23 @@ class Command(NoArgsCommand): def handle_noargs(self, **options): warnings.warn("The syncdb command will be removed in Django 1.9", RemovedInDjango19Warning) call_command("migrate", **options) + + try: + apps.get_model('auth', 'Permission') + except LookupError: + return + + UserModel = get_user_model() + + if not UserModel._default_manager.exists() and options.get('interactive'): + msg = ("\nYou have installed Django's auth system, and " + "don't have any superusers defined.\nWould you like to create one " + "now? (yes/no): ") + confirm = input(msg) + while 1: + if confirm not in ('yes', 'no'): + confirm = input('Please enter either "yes" or "no": ') + continue + if confirm == 'yes': + call_command("createsuperuser", interactive=True, database=options['database']) + break diff --git a/docs/intro/tutorial01.txt b/docs/intro/tutorial01.txt index 37dfef0d0d..2ce4adbe97 100644 --- a/docs/intro/tutorial01.txt +++ b/docs/intro/tutorial01.txt @@ -206,40 +206,7 @@ The :djadmin:`migrate` command looks at the :setting:`INSTALLED_APPS` setting and creates any necessary database tables according to the database settings in your :file:`mysite/settings.py` file and the database migrations shipped with the app (we'll cover those later). You'll see a message for each -migration it applies, and you'll get a prompt asking you if you'd like to -create a superuser account for the authentication system. - -First, you'll be asked if you would like to create a superuser. Type the word -``yes`` and hit enter. - -.. code-block:: text - - You have installed Django's auth system, and don't have any superusers defined. - Would you like to create one now? (yes/no): yes - -Next, enter a username. By default, this will be your system username. Enter -your desired username and press enter. - -.. code-block:: text - - Username (leave blank to use 'your_username'): admin - -You will then be prompted for your desired email address: - -.. code-block:: text - - Email address: admin@example.com - -The final step is to enter your password. You will be asked to enter your -password twice, the second time as a confirmation of the first. - -.. code-block:: text - - Password: ********** - Password (again): ********* - Superuser created successfully. - -With that done, if you're interested, run the command-line client for your +migration it applies. If you're interested, run the command-line client for your database and type ``\dt`` (PostgreSQL), ``SHOW TABLES;`` (MySQL), or ``.schema`` (SQLite) to display the tables Django created. diff --git a/docs/intro/tutorial02.txt b/docs/intro/tutorial02.txt index 23f6440ea5..4c5e869f8d 100644 --- a/docs/intro/tutorial02.txt +++ b/docs/intro/tutorial02.txt @@ -21,6 +21,37 @@ automatically-generated admin site. The admin isn't intended to be used by site visitors. It's for site managers. +Creating an admin user +====================== + +First we'll need to create a user who can login to the admin site. Run the +following command: + +.. code-block:: bash + + $ python manage.py createsuperuser + +Enter your desired username and press enter. + +.. code-block:: text + + Username: admin + +You will then be prompted for your desired email address: + +.. code-block:: text + + Email address: admin@example.com + +The final step is to enter your password. You will be asked to enter your +password twice, the second time as a confirmation of the first. + +.. code-block:: text + + Password: ********** + Password (again): ********* + Superuser created successfully. + Start the development server ============================ @@ -59,10 +90,7 @@ browser's settings and on whether Django has a translation for this language. Enter the admin site ==================== -Now, try logging in. You created a superuser account in the first part of this -tutorial, remember? If you didn't create one or forgot the password you can -:ref:`create another one `. - +Now, try logging in with the superuser account you created in the previous step. You should see the Django admin index page: .. image:: _images/admin02.png diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt index 2296d2b422..f68157c2a9 100644 --- a/docs/ref/django-admin.txt +++ b/docs/ref/django-admin.txt @@ -1420,9 +1420,8 @@ This command is only available if Django's :doc:`authentication system ` (``django.contrib.auth``) is installed. Creates a superuser account (a user who has all permissions). This is -useful if you need to create an initial superuser account but did not -do so during the first :djadmin:`migrate`, or if you need to programmatically -generate superuser accounts for your site(s). +useful if you need to create an initial superuser account or if you need to +programmatically generate superuser accounts for your site(s). When run interactively, this command will prompt for a password for the new superuser account. When run non-interactively, no password diff --git a/docs/topics/auth/default.txt b/docs/topics/auth/default.txt index 7b89061a07..3fae92c662 100644 --- a/docs/topics/auth/default.txt +++ b/docs/topics/auth/default.txt @@ -66,9 +66,7 @@ interactively `. Creating superusers ------------------- -:djadmin:`manage.py migrate ` prompts you to create a superuser the -first time you run it with ``'django.contrib.auth'`` installed. If you need to -create a superuser at a later date, you can use a command line utility:: +Create superusers using the :djadmin:`createsuperuser` command:: $ python manage.py createsuperuser --username=joe --email=joe@example.com