app/django/contrib/auth/create_superuser.py
author Todd Larsen <tlarsen@google.com>
Wed, 24 Sep 2008 02:27:01 +0000 (2008-09-24)
changeset 194 8bdb1d2d0c36
parent 54 03e267d67478
child 323 ff1a9aa48cfd
permissions -rw-r--r--
Change indentation level to 2 (from 4) and rename MCE_DEF_SETTINGS to DEF_MCE_SETTINGS to match the "default constant" naming convention elsewhere in the code.
"""
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()