o
    uvXjb  ã                   @   s|   d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	 ddl
mZmZ ddlmZ G dd	„ d	e	jƒZG d
d„ de	jƒZdS )zg
This module allows importing AbstractBaseUser even when django.contrib.auth is
not in INSTALLED_APPS.
é    N)Úpassword_validation)Úcheck_passwordÚis_password_usableÚmake_password)Úmodels)Úget_random_stringÚsalted_hmac)Úgettext_lazyc                   @   s.   e Zd Zedd„ ƒZ		d
dd„Zdd„ Zd	S )ÚBaseUserManagerc                 C   sJ   |pd}z|  ¡  dd¡\}}W n
 ty   Y |S w |d | ¡  }|S )zS
        Normalize the email address by lowercasing the domain part of it.
        Ú ú@é   )ÚstripÚrsplitÚ
ValueErrorÚlower)ÚclsÚemailÚ
email_nameÚdomain_part© r   úZ/var/www/html/myproject/venv/lib/python3.10/site-packages/django/contrib/auth/base_user.pyÚnormalize_email   s   üzBaseUserManager.normalize_emailé
   Ú7abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789c                 C   s
   t ||ƒS )zë
        Generate a random password with the given length and given
        allowed_chars. The default value of allowed_chars does not have "I" or
        "O" or letters and digits that look similar -- just to avoid confusion.
        )r   )ÚselfÚlengthÚallowed_charsr   r   r   Úmake_random_password    s   
	z$BaseUserManager.make_random_passwordc                 C   s   | j di | jj|i¤ŽS )Nr   )ÚgetÚmodelÚUSERNAME_FIELD)r   Úusernamer   r   r   Úget_by_natural_key+   s   z"BaseUserManager.get_by_natural_keyN)r   r   )Ú__name__Ú
__module__Ú__qualname__Úclassmethodr   r   r#   r   r   r   r   r
      s    

ÿr
   c                       sÔ   e Zd Zejedƒdd�Zejedƒddd�ZdZ	g Z
dZG dd	„ d	ƒZd
d„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zed"d#„ ƒZed$d%„ ƒZ‡  ZS )&ÚAbstractBaseUserÚpasswordé€   )Ú
max_lengthz
last loginT)ÚblankÚnullNc                   @   s   e Zd ZdZdS )zAbstractBaseUser.MetaTN)r$   r%   r&   Úabstractr   r   r   r   ÚMeta;   s    r/   c                 C   s   |   ¡ S ©N©Úget_username©r   r   r   r   Ú__str__>   s   zAbstractBaseUser.__str__c                    s8   t ƒ j|i |¤Ž | jd urt | j| ¡ d | _d S d S r0   )ÚsuperÚsaveÚ	_passwordr   Úpassword_changed)r   ÚargsÚkwargs©Ú	__class__r   r   r6   A   s
   

þzAbstractBaseUser.savec                 C   s   t | | jƒS )z"Return the username for this User.)Úgetattrr!   r3   r   r   r   r2   G   s   zAbstractBaseUser.get_usernamec                 C   s   t | | j|  |  ¡ ¡ƒ d S r0   )Úsetattrr!   Únormalize_usernamer2   r3   r   r   r   ÚcleanK   s   zAbstractBaseUser.cleanc                 C   s
   |   ¡ fS r0   r1   r3   r   r   r   Únatural_keyN   s   
zAbstractBaseUser.natural_keyc                 C   ó   dS )zj
        Always return False. This is a way of comparing User objects to
        anonymous users.
        Fr   r3   r   r   r   Úis_anonymousQ   ó   zAbstractBaseUser.is_anonymousc                 C   rB   )zt
        Always return True. This is a way to tell if the user has been
        authenticated in templates.
        Tr   r3   r   r   r   Úis_authenticatedY   rD   z!AbstractBaseUser.is_authenticatedc                 C   s   t |ƒ| _|| _d S r0   )r   r)   r7   )r   Úraw_passwordr   r   r   Úset_passworda   s   

zAbstractBaseUser.set_passwordc                    s   ‡ fdd„}t |ˆ j|ƒS )z~
        Return a boolean of whether the raw_password was correct. Handles
        hashing formats behind the scenes.
        c                    s"   ˆ   | ¡ d ˆ _ˆ jdgd� d S )Nr)   )Úupdate_fields)rG   r7   r6   )rF   r3   r   r   Úsetterj   s   
z/AbstractBaseUser.check_password.<locals>.setter)r   r)   )r   rF   rI   r   r3   r   r   e   s   zAbstractBaseUser.check_passwordc                 C   s   t d ƒ| _d S r0   )r   r)   r3   r   r   r   Úset_unusable_passwordq   s   z&AbstractBaseUser.set_unusable_passwordc                 C   s
   t | jƒS )zX
        Return False if set_unusable_password() has been called for this user.
        )r   r)   r3   r   r   r   Úhas_usable_passwordu   s   
z$AbstractBaseUser.has_usable_passwordc                 C   s   d}t || jƒ ¡ S )z7
        Return an HMAC of the password field.
        zAdjango.contrib.auth.models.AbstractBaseUser.get_session_auth_hash)r   r)   Ú	hexdigest)r   Úkey_saltr   r   r   Úget_session_auth_hash{   s   z&AbstractBaseUser.get_session_auth_hashc                 C   s   z| j W S  ty   Y dS w )Nr   )ÚEMAIL_FIELDÚAttributeError)r   r   r   r   Úget_email_field_name‚   s
   ÿz%AbstractBaseUser.get_email_field_namec                 C   s   t |tƒrt d|¡S |S )NÚNFKC)Ú
isinstanceÚstrÚunicodedataÚ	normalize)r   r"   r   r   r   r?   ‰   s   z#AbstractBaseUser.normalize_username)r$   r%   r&   r   Ú	CharFieldÚ_r)   ÚDateTimeFieldÚ
last_loginÚ	is_activeÚREQUIRED_FIELDSr7   r/   r4   r6   r2   r@   rA   ÚpropertyrC   rE   rG   r   rJ   rK   rN   r'   rQ   r?   Ú__classcell__r   r   r;   r   r(   /   s2    


r(   )Ú__doc__rU   Údjango.contrib.authr   Údjango.contrib.auth.hashersr   r   r   Ú	django.dbr   Údjango.utils.cryptor   r   Údjango.utils.translationr	   rX   ÚManagerr
   ÚModelr(   r   r   r   r   Ú<module>   s    