
v^,                 @   s   d  Z  d d l Z d d l Z d d l Z d d l m Z d d l m Z d d l m	 Z	 d d l
 m Z d d l m Z m Z d d l m Z d d	 l m Z Gd
 d   d e  Z d Z Gd d   d e  Z d S)z*
Management utility to create superusers.
    N)get_user_model)get_default_username)validate_password)
exceptions)BaseCommandCommandError)DEFAULT_DB_ALIAS)capfirstc               @   s   e  Z d  Z d S)NotRunningInTTYExceptionN)__name__
__module____qualname__ r   r   Y/tmp/pip-build-8lau8j11/django/django/contrib/auth/management/commands/createsuperuser.pyr
      s   r
   passwordc                   s   e  Z d  Z d Z d Z d Z   f d d   Z d d   Z   f d d	   Z d
 d   Z	 d d d  Z
 d d d  Z d d   Z   S)CommandzUsed to create a superuser.Tstdinc                sA   t    j | |   t   |  _ |  j j j |  j j  |  _ d  S)N)super__init__r   	UserModel_meta	get_fieldUSERNAME_FIELDusername_field)selfargskwargs)	__class__r   r   r      s    zCommand.__init__c          
   C   s  | j  d |  j j d d | j  d d d d d d	 d d
 |  j j | j  d d t d d x |  j j D] } |  j j j |  } | j r | j j	 r | j j	 j j
 r t d |   q| j  d | d d d d | f qo | j  d | d d | qo Wd  S)Nz--%shelpz&Specifies the login for the superuser.z	--noinputz
--no-inputactionstore_falsedestinteractivezTells Django to NOT prompt the user for input of any kind. You must use --%s with --noinput, along with an option for any other required field. Superusers created with --noinput will not be able to log in until they're given a valid password.z
--databasedefaultz4Specifies the database to use. Default is "default".z\Required field '%s' specifies a many-to-many relation through model, which is not supported.appendz?Specifies the %s for the superuser. Can be used multiple times.z#Specifies the %s for the superuser.)add_argumentr   r   r   REQUIRED_FIELDSr   r   many_to_manyremote_fieldZthroughZauto_createdr   )r   parser
field_namefieldr   r   r   add_arguments"   s2    	
zCommand.add_argumentsc                s+   | j  d t j  |  _ t   j | |   S)Nr   )getsysr   r   execute)r   r   options)r   r   r   r/   M   s    zCommand.executec             O   s  | |  j  j } | d } i  } |  j j } y |  j  j j t  Wn t j k
 rZ Yn Xd  | t <y| d ri  } t	 |  j
 d  r |  j
 j   r t  t   } | r |  j | | |  }	 |	 r|  j j |	  d  } n" | d k rt d t |    xw | d  k r~|  j |  j |  }
 |  j |  j |
 |  } | r|  j | | |  }	 |	 r|  j j |	  d  } qqW| | |  j  j <|  j j r|  j j j |  n | | |  j  j <x|  j  j D] } |  j  j j |  } | | | | <x | | d  k r|  j |  }
 |  j | |
  } | | | <| j r| r| j   sld  | | <|  j j d  qd d   | j d	  D | | <| j s| | | <| j r| j j |  | | <qWqWxHt | k r| t d  k rt j   } t j d
  } | | k r|  j j d  q| j   d k rD|  j j d  qy t | |  j  |    Wne t j k
 r} zB |  j j d j | j    t! d  } | j"   d k rwWYd  d  } ~ Xn X| | t <qWn:t | k rd t# j$ k rt# j$ d | t <| d  k r1t# j$ j% d |  j  j j&    } | d  k rVt d |  j  j   n' |  j | | |  }	 |	 r}t |	   | | |  j  j <x |  j  j D]s } d | j&   } | | pt# j$ j% |  } | st d |   |  j  j j |  } | j' | d   | | <qW|  j  j( j) |  j* |   | d d k rM|  j+ j d  Wn t, k
 r|  j j d  t- j. d  Yna t j k
 r} z t d j | j     WYd  d  } ~ Xn" t k
 r|  j+ j d  Yn Xd  S)Ndatabaser"   isatty z%s cannot be blank.z"Error: This field cannot be blank.c             S   s   g  |  ] } | j     q Sr   )strip).0pkr   r   r   
<listcomp>   s   	 z"Command.handle.<locals>.<listcomp>,zPassword (again): z#Error: Your passwords didn't match.z&Error: Blank passwords aren't allowed.
z:Bypass password validation and create user anyway? [y/N]: yZDJANGO_SUPERUSER_PASSWORDZDJANGO_SUPERUSER_z!You must use --%s with --noinput.	verbosity   zSuperuser created successfully.z
Operation cancelled.z; zSuperuser creation skipped due to not running in a TTY. You can run `manage.py createsuperuser` in your project to create one manually.)/r   r   r   verbose_namer   r   PASSWORD_FIELDr   ZFieldDoesNotExisthasattrr   r2   r
   r   _validate_usernamestderrwriter   r	   _get_input_messageget_input_datar(   modelr&   r'   r4   splitZmany_to_onegetpassr   ValidationErrorjoinmessagesinputlowerosenvironr-   upperclean_default_manager
db_managerZcreate_superuserstdoutKeyboardInterruptr.   exit)r   r   r0   usernamer1   Z	user_dataverbose_field_nameZfake_user_dataZdefault_usernameZ	error_msgmessager*   r+   Zinput_valuer   Z	password2errresponseZenv_varvalueer   r   r   handleQ   s    


"		1

 	
	"*	zCommand.handleNc             C   s   t  |  } | r$ | d k r$ | } y | j | d  } WnN t j k
 r } z+ |  j j d d j | j   d } WYd d } ~ Xn X| S)zm
        Override this method if you want to customize data inputs or
        validation exceptions.
        r3   Nz	Error: %sz; )rK   rP   r   rH   rA   rB   rI   rJ   )r   r+   rX   r#   Z	raw_valuevalr\   r   r   r   rD      s     zCommand.get_input_datac             C   sj   d t  | j  | r d | n d | j rb d | j j j j | j rR | j   n	 | j j f n d f S)Nz%s%s%s: z (leave blank to use '%s')r3   z (%s.%s))	r	   r=   r(   rE   r   Zobject_namer'   Zm2m_target_field_namer*   )r   r+   r#   r   r   r   rC      s    zCommand._get_input_messagec             C   s   |  j  j rO y  |  j j j |  j |  Wn |  j j k
 rF Yn	 Xd | S| sc d t |  Sy |  j  j | d  Wn8 t	 j
 k
 r } z d j | j  SWYd d } ~ Xn Xd S)z=Validate username. If invalid, return a string error message.z Error: That %s is already taken.z%s cannot be blank.Nz; )r   uniquer   rQ   rR   Zget_by_natural_keyZDoesNotExistr	   rP   r   rH   rI   rJ   )r   rV   rW   r1   r\   r   r   r   r@      s     zCommand._validate_username)zstdin)r   r   r   r   Zrequires_migrations_checksZstealth_optionsr   r,   r/   r]   rD   rC   r@   r   r   )r   r   r      s   +{
r   )__doc__rG   rM   r.   Zdjango.contrib.authr   Zdjango.contrib.auth.managementr   Z'django.contrib.auth.password_validationr   Zdjango.corer   Zdjango.core.management.baser   r   Z	django.dbr   Zdjango.utils.textr	   	Exceptionr
   r>   r   r   r   r   r   <module>   s   