app/django/contrib/auth/create_superuser.py
author Todd Larsen <tlarsen@google.com>
Wed, 24 Sep 2008 02:22:12 +0000
changeset 191 80f08751f1e5
parent 54 03e267d67478
child 323 ff1a9aa48cfd
permissions -rw-r--r--
These changes should have been in r620, but somehow I did not save them, or saved over them with an old copy in the editor. Not sure...

"""
Helper function for creating superusers in the authentication system.

If run from the command line, this module lets you create a superuser
interactively.
"""

from django.core import validators
from django.contrib.auth.models import User
import getpass
import os
import sys
import re

RE_VALID_USERNAME = re.compile('\w+$')

def createsuperuser(username=None, email=None, password=None):
    """
    Helper function for creating a superuser from the command line. All
    arguments are optional and will be prompted-for if invalid or not given.
    """
    try:
        import pwd
    except ImportError:
        default_username = ''
    else:
        # Determine the current system user's username, to use as a default.
        default_username = pwd.getpwuid(os.getuid())[0].replace(' ', '').lower()

    # Determine whether the default username is taken, so we don't display
    # it as an option.
    if default_username:
        try:
            User.objects.get(username=default_username)
        except User.DoesNotExist:
            pass
        else:
            default_username = ''

    try:
        while 1:
            if not username:
                input_msg = 'Username'
                if default_username:
                    input_msg += ' (Leave blank to use %r)' % default_username
                username = raw_input(input_msg + ': ')
            if default_username and username == '':
                username = default_username
            if not RE_VALID_USERNAME.match(username):
                sys.stderr.write("Error: That username is invalid. Use only letters, digits and underscores.\n")
                username = None
                continue
            try:
                User.objects.get(username=username)
            except User.DoesNotExist:
                break
            else:
                sys.stderr.write("Error: That username is already taken.\n")
                username = None
        while 1:
            if not email:
                email = raw_input('E-mail address: ')
            try:
                validators.isValidEmail(email, None)
            except validators.ValidationError:
                sys.stderr.write("Error: That e-mail address is invalid.\n")
                email = None
            else:
                break
        while 1:
            if not password:
                password = getpass.getpass()
                password2 = getpass.getpass('Password (again): ')
                if password != password2:
                    sys.stderr.write("Error: Your passwords didn't match.\n")
                    password = None
                    continue
            if password.strip() == '':
                sys.stderr.write("Error: Blank passwords aren't allowed.\n")
                password = None
                continue
            break
    except KeyboardInterrupt:
        sys.stderr.write("\nOperation cancelled.\n")
        sys.exit(1)
    u = User.objects.create_user(username, email, password)
    u.is_staff = True
    u.is_active = True
    u.is_superuser = True
    u.save()
    print "Superuser created successfully."

if __name__ == "__main__":
    createsuperuser()