B
    £0H[i  ã               @   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}y|  ¡  dd¡\}}W n tk
r4   Y nX |d | ¡  }|S )zS
        Normalize the email address by lowercasing the domain part of it.
        Ú ú@é   )ÚstripÚrsplitÚ
ValueErrorÚlower)ÚclsÚemailZ
email_nameZdomain_part© r   úaC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\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 f | jj|iŽS )N)Ú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dd„ Zdd„ Z‡ f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)ZblankÚnullNc               @   s   e Zd ZdZdS )zAbstractBaseUser.MetaTN)r"   r#   r$   Zabstractr   r   r   r   ÚMeta;   s   r+   c             C   s   t | | jƒS )z-Return the identifying username for this User)Úgetattrr   )r   r   r   r   Úget_username>   s    zAbstractBaseUser.get_usernamec             C   s   |   ¡ S )N)r-   )r   r   r   r   Ú__str__B   s    zAbstractBaseUser.__str__c             C   s   t | | j|  |  ¡ ¡ƒ d S )N)Úsetattrr   Únormalize_usernamer-   )r   r   r   r   ÚcleanE   s    zAbstractBaseUser.cleanc                s0   t ƒ j||Ž | jd k	r,t | j| ¡ d | _d S )N)ÚsuperÚsaveÚ	_passwordr   Zpassword_changed)r   ÚargsÚkwargs)Ú	__class__r   r   r3   H   s    
zAbstractBaseUser.savec             C   s
   |   ¡ fS )N)r-   )r   r   r   r   Únatural_keyN   s    zAbstractBaseUser.natural_keyc             C   s   dS )zj
        Always return False. This is a way of comparing User objects to
        anonymous users.
        Fr   )r   r   r   r   Úis_anonymousQ   s    zAbstractBaseUser.is_anonymousc             C   s   dS )zt
        Always return True. This is a way to tell if the user has been
        authenticated in templates.
        Tr   )r   r   r   r   Úis_authenticatedY   s    z!AbstractBaseUser.is_authenticatedc             C   s   t |ƒ| _|| _d S )N)r   r'   r4   )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'   )Zupdate_fields)r<   r4   r3   )r;   )r   r   r   Úsetterj   s    
z/AbstractBaseUser.check_password.<locals>.setter)r   r'   )r   r;   r=   r   )r   r   r   e   s    zAbstractBaseUser.check_passwordc             C   s   t d ƒ| _d S )N)r   r'   )r   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'   )r   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   Zkey_saltr   r   r   Úget_session_auth_hash{   s    z&AbstractBaseUser.get_session_auth_hashc             C   s    y| j S  tk
r   dS X d S )Nr   )Z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   r0   ‰   s    z#AbstractBaseUser.normalize_username)r"   r#   r$   r   Z	CharFieldÚ_r'   ZDateTimeFieldZ
last_loginZ	is_activeZREQUIRED_FIELDSr4   r+   r-   r.   r1   r3   r8   Úpropertyr9   r:   r<   r   r>   r?   rA   r%   rC   r0   Ú__classcell__r   r   )r7   r   r&   /   s(   r&   )Ú__doc__rG   Zdjango.contrib.authr   Zdjango.contrib.auth.hashersr   r   r   Z	django.dbr   Zdjango.utils.cryptor   r   Zdjango.utils.translationr	   rI   ÚManagerr
   ZModelr&   r   r   r   r   Ú<module>   s   