U
    mf3                     @   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 dd
lmZ G dd deZdZG d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)cached_property)capfirstc                   @   s   e Zd ZdS )NotRunningInTTYExceptionN)__name__
__module____qualname__ r   r   [/tmp/pip-unpacked-wheel-siwebuq3/django/contrib/auth/management/commands/createsuperuser.pyr      s   r   passwordc                       sl   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edd Zdd Z  ZS )CommandzUsed to create a superuser.T)stdinc                    s.   t  j|| t | _| 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| jj d	 |j d
tdd | jjD ]l}| jj|}|jr|jj	r|jj	jj
std| q|j d| dd| fd qJ|j d| d| d qJd S )Nz--%sz&Specifies the login for the superuser.)helpz	--noinputz
--no-inputstore_false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.)actiondestr    z
--databasez4Specifies the database to use. Default is "default".)defaultr    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.)r#   r    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%   sT    

	zCommand.add_argumentsc                    s   | dtj| _t j||S )Nr   )getsysr   r   execute)r   r   optionsr   r   r   r1   V   s    zCommand.executec              
   O   s  || j j }|d }i }| jj}z| j jt W n tjk
rH   Y n
X d |t< z |d r"i }t	| j
dr~| j
 s~tt|d}|r| |||}	|	r| j|	 d }n|dkrtdt| |d kr| | j|}
| | j|
|}|r| |||}	|	r| j|	 d }qq||| j j< | jjr>| jj|n||| j j< | j jD ]}| j j|}|| ||< || d k	r||| d ||< || d kr
| |}
| ||
}|||< |jr|r| sd ||< | jd qdd	 |d
D ||< q|js|| ||< |jrR|j|| ||< qRt|krB|t d krBt }td}||kr| jd q>| dkr| jd q>zt|| j f | W nZ tjk
r } z8| jd |j! t"d}|# dkr W Y q>W 5 d }~X Y nX ||t< q>n t|krFdt$j%krFt$j%d |t< |d krht$j%&d| j j'  }|d krtd| j j n| |||}	|	rt|	||| j j< | j jD ]}d|'  }|| pt$j%&|}|std| | j j|}||d ||< |jrt(|| t)rdd	 || d
D ||< q| j j*+|j,f | |d dkrr| j-d W n t.k
r   | jd t/0d Y nV tjk
r } ztd |j!W 5 d }~X Y n" tk
r   | j-d Y nX d S )Ndatabaser"   isatty)r3    %s cannot be blank.z"Error: This field cannot be blank.c                 S   s   g | ]}|  qS r   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.c                 S   s   g | ]}|  qS r   r7   r9   r   r   r   r<      s    	verbosity   zSuperuser created successfully.z
Operation cancelled.; zSuperuser creation skipped due to not running in a TTY. You can run `manage.py createsuperuser` in your project to create one manually.)1r   r   r   verbose_namer   r   PASSWORD_FIELDr   ZFieldDoesNotExisthasattrr   r4   r   r   _validate_usernamestderrwriter   r
   _get_input_messageget_input_datar*   modelr(   cleanr)   r8   splitZmany_to_onegetpassr   ValidationErrorjoinmessagesinputlowerosenvironr/   upper
isinstancestr_default_manager
db_managerZcreate_superuserstdoutKeyboardInterruptr0   exit)r   r   r2   usernamer3   	user_dataverbose_field_nameZfake_user_dataZdefault_username	error_msgmessager,   r-   Zinput_valuer   Z	password2errresponseenv_varvalueer   r   r   handleZ   s"   

  

     






   zCommand.handleNc              
   C   sn   t |}|r|dkr|}z||d}W n@ tjk
rh } z | jdd|j  d}W 5 d}~X Y nX |S )zm
        Override this method if you want to customize data inputs or
        validation exceptions.
        r5   Nz	Error: %srB   )rR   rL   r   rO   rG   rH   rP   rQ   )r   r-   rb   r%   Z	raw_valuevalrg   r   r   r   rJ      s    zCommand.get_input_datac                 C   sL   dt |j|rd| nd|jrDd|jjjj|jr8| n|jjf ndf S )Nz%s%s%s: z (leave blank to use '%s')r5   z (%s.%s))	r
   rC   r*   rK   r   Zobject_namer)   Zm2m_target_field_namer,   )r   r-   r%   r   r   r   rI   
  s    

zCommand._get_input_messagec                 C   sF   | j jrdS | jjjD ]*}t|jdkr|jd | j jkr dS qdS )NTrA   r   F)r   uniquer   r   Ztotal_unique_constraintslenfieldsname)r   Zunique_constraintr   r   r   username_is_unique  s    zCommand.username_is_uniquec              
   C   s   | j r@z| jj|| W n | jjk
r6   Y n
X d| S |sPdt| S z| j|d W n4 t	j
k
r } zd|j W Y S d}~X Y nX dS )z=Validate username. If invalid, return a string error message.z Error: That %s is already taken.r6   NrB   )rn   r   rY   rZ   Zget_by_natural_keyZDoesNotExistr
   r   rL   r   rO   rP   rQ   )r   r^   r`   r3   rg   r   r   r   rF   %  s    zCommand._validate_username)N)N)r   r   r   r    Zrequires_migrations_checksZstealth_optionsr   r.   r1   rh   rJ   rI   r	   rn   rF   __classcell__r   r   r   r   r      s   1 !


r   )__doc__rN   rT   r0   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.functionalr	   Zdjango.utils.textr
   	Exceptionr   rD   r   r   r   r   r   <module>   s   