o
    —¨ÊhÎ3  ã                   @   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   úi/var/www/html/env/lib/python3.10/site-packages/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                    s2   t ƒ j|i |¤Ž 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 ]5}| jj |¡}|jrO|jj	rA|jj	jj
sAtd| ƒ‚|j d| dd| fd� q%|j d| d| d� q%d S )Nz--%sz&Specifies the login for the superuser.)Úhelpz	--noinputz
--no-inputÚstore_falseÚinteractivezòTells 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_fieldÚthroughÚauto_createdr   )r   ÚparserÚ
field_nameÚfieldr   r   r   Úadd_arguments%   sV   
þüúýÿ
þÿÿÿÿý	þëzCommand.add_argumentsc                    s"   |  dtj¡| _tƒ j|i |¤ŽS )Nr   )ÚgetÚsysr   r   Úexecute)r   r   Úoptionsr   r   r   r4   V   s   zCommand.executec              
   O   s  || j j }|d }i }| jj}z	| j j t¡ W n
 tjy#   Y nw d |t< �z"|d �r�i }t	| j
dƒr>| j
 ¡ s>t‚t|d�}|rW|  |||¡}	|	rV| j |	¡ d }n|dkrctdt|ƒ ƒ‚|d u rŽ|  | j|¡}
|  | j|
|¡}|rŠ|  |||¡}	|	rŠ| j |	¡ d }qc|d u sg||| j j< | jjrŸ| jj |¡n||| j j< | j jD ]s}| j j |¡}|| ||< || d urÈ| || d ¡||< || d u �r|  |¡}
|  ||
¡}|||< |jrþ|rþ| ¡ sòd ||< | j d¡ qÈdd	„ | d
¡D ƒ||< || d u sÏ|j�s|| ||< |j�r|j || ¡||< q©t|v �rœ|t d u �rœt ¡ }t d¡}||k�r?| j d¡ �q| ¡ dk�rN| j d¡ �qzt|| j di |¤Žƒ W n0 tj�y‹ } z"| j d  |j!¡¡ t"dƒ}| #¡ dk�r�W Y d }~�qW Y d }~nd }~ww ||t< t|v �rœ|t d u �s)n�t|v �r¯dt$j%v �r¯t$j%d |t< |d u �rÀt$j% &d| j j '¡  ¡}|d u �rÍtd| j j ƒ‚|  |||¡}	|	�rÛt|	ƒ‚||| j j< | j jD ]F}d| '¡  }|| �p÷t$j% &|¡}|�std| ƒ‚| j j |¡}| |d ¡||< |j�r*t(|| t)ƒ�r*dd	„ ||  d
¡D ƒ||< �qå| j j* +|¡j,di |¤Ž |d dk�rI| j- d¡ W d S W d S  t.�ya   | j d¡ t/ 0d¡ Y d S  tj�yv } ztd  |j!¡ƒ‚d }~w t�y†   | j- d¡ Y d S w )NÚdatabaser#   Úisatty)r6   Ú ú%s cannot be blank.z"Error: This field cannot be blank.c                 S   ó   g | ]}|  ¡ ‘qS r   ©Ústrip©Ú.0Úpkr   r   r   Ú
<listcomp>ž   ó    ÿ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]: ÚyÚDJANGO_SUPERUSER_PASSWORDÚDJANGO_SUPERUSER_z!You must use --%s with --noinput.c                 S   r:   r   r;   r=   r   r   r   r@   å   rA   Ú	verbosityé   zSuperuser created successfully.z
Operation cancelled.ú; z‡Superuser creation skipped due to not running in a TTY. You can run `manage.py createsuperuser` in your project to create one manually.r   )1r   r   r   Úverbose_namer   r   ÚPASSWORD_FIELDr   ÚFieldDoesNotExistÚhasattrr   r7   r   r   Ú_validate_usernameÚstderrÚwriter   r
   Ú_get_input_messageÚget_input_datar+   Úmodelr)   Úcleanr*   r<   ÚsplitÚmany_to_oneÚgetpassr   ÚValidationErrorÚjoinÚmessagesÚinputÚlowerÚosÚenvironr2   ÚupperÚ
isinstanceÚstrÚ_default_managerÚ
db_managerÚcreate_superuserÚstdoutÚKeyboardInterruptr3   Úexit)r   r   r5   Úusernamer6   Ú	user_dataÚverbose_field_nameÚfake_user_dataÚdefault_usernameÚ	error_msgÚmessager/   r0   Úinput_valuer   Ú	password2ÚerrÚresponseÚenv_varÚvalueÚer   r   r   ÚhandleZ   s(  ÿ

ÿ€
ÿÿÿÿòÿ
ý


ÿ÷ÿ€

ÿÿ€ûì€

ÿ
ÿÿÿÿ
ÿ€ÿÿ€
ÿÿzCommand.handleNc              
   C   sp   t |ƒ}|r|dkr|}z	| |d¡}W |S  tjy7 } z| j dd |j¡ ¡ d}W Y d}~|S d}~ww )zm
        Override this method if you want to customize data inputs or
        validation exceptions.
        r8   Nz	Error: %srI   )r[   rT   r   rX   rO   rP   rY   rZ   )r   r0   rn   r&   Ú	raw_valueÚvalru   r   r   r   rR   ú   s   ü€üzCommand.get_input_datac                 C   sP   dt |jƒ|rd| nd|jr$d|jjjj|jr| ¡ n|jjf f S df S )Nz%s%s%s: z (leave blank to use '%s')r8   z (%s.%s))	r
   rJ   r+   rS   r   Úobject_namer*   Úm2m_target_field_namer/   )r   r0   r&   r   r   r   rQ   
  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 )NTrH   r   F)r   Úuniquer   r   Útotal_unique_constraintsÚlenÚfieldsÚname)r   Úunique_constraintr   r   r   Úusername_is_unique  s   €zCommand.username_is_uniquec              
   C   s”   | j rz| jj |¡ |¡ W d| S  | jjy   Y nw |s&dt|ƒ S z
| j |d¡ W dS  t	j
yI } zd |j¡W  Y d}~S d}~ww )z=Validate username. If invalid, return a string error message.z Error: That %s is already taken.r9   NrI   )r�   r   rb   rc   Úget_by_natural_keyÚDoesNotExistr
   r   rT   r   rX   rY   rZ   )r   rh   rj   r6   ru   r   r   r   rN   %  s"   ÿýÿ€ÿzCommand._validate_usernamer   )r   r   r   r!   Úrequires_migrations_checksÚstealth_optionsr   r1   r4   rv   rR   rQ   r	   r�   rN   Ú__classcell__r   r   r   r   r      s    1 
!

r   )Ú__doc__rW   r]   r3   Údjango.contrib.authr   Údjango.contrib.auth.managementr   Ú'django.contrib.auth.password_validationr   Údjango.corer   Údjango.core.management.baser   r   Ú	django.dbr   Údjango.utils.functionalr	   Údjango.utils.textr
   Ú	Exceptionr   rK   r   r   r   r   r   Ú<module>   s    