3
(h                 @   s   d Z ddlm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mZ dd	lmZmZ dd
lmZ G dd dejZe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.
    )unicode_literalsN)password_validation)check_passwordis_password_usablemake_password)models)get_random_stringsalted_hmac)CallableFalseCallableTrue)
force_textpython_2_unicode_compatible)ugettext_lazyc               @   s*   e Zd Zedd Zd
ddZdd Zd	S )BaseUserManagerc             C   sL   |pd}y|j  jdd\}}W n tk
r4   Y nX dj||j g}|S )zS
        Normalize the email address by lowercasing the domain part of it.
         @   )striprsplit
ValueErrorjoinlower)clsemailZ
email_nameZdomain_part r   A/tmp/pip-install-q3hcpn_q/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
G dd dZd	d
 Z f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d#d$ Zd%d& Zed'd( Z  ZS ))AbstractBaseUserpassword   )
max_lengthz
last loginT)Zblanknullc               @   s   e Zd ZdZdS )zAbstractBaseUser.MetaTN)r(   r)   r*   Zabstractr   r   r   r   Meta<   s   r1   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                s   t t| j|| d | _d S )N)superr,   __init__	_password)r   argskwargs)	__class__r   r   r5   C   s    zAbstractBaseUser.__init__c             C   s   | j  S )N)r3   )r   r   r   r   __str__I   s    zAbstractBaseUser.__str__c             C   s   t | | j| j| j  d S )N)setattrr%   normalize_usernamer3   )r   r   r   r   cleanL   s    zAbstractBaseUser.cleanc                s4   t t| j|| | jd k	r0tj| j|  d | _d S )N)r4   r,   saver6   r   Zpassword_changed)r   r7   r8   )r9   r   r   r>   O   s    
zAbstractBaseUser.savec             C   s
   | j  fS )N)r3   )r   r   r   r   natural_keyU   s    zAbstractBaseUser.natural_keyc             C   s   t S )zj
        Always return False. This is a way of comparing User objects to
        anonymous users.
        )r
   )r   r   r   r   is_anonymousX   s    zAbstractBaseUser.is_anonymousc             C   s   t S )zt
        Always return True. This is a way to tell if the user has been
        authenticated in templates.
        )r   )r   r   r   r   is_authenticated`   s    z!AbstractBaseUser.is_authenticatedc             C   s   t || _|| _d S )N)r   r-   r6   )r   raw_passwordr   r   r   set_passwordh   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"    j |  d  _ jdgd d S )Nr-   )Zupdate_fields)rC   r6   r>   )rB   )r   r   r   setterq   s    
z/AbstractBaseUser.check_password.<locals>.setter)r   r-   )r   rB   rD   r   )r   r   r   l   s    zAbstractBaseUser.check_passwordc             C   s   t d | _d S )N)r   r-   )r   r   r   r   set_unusable_passwordx   s    z&AbstractBaseUser.set_unusable_passwordc             C   s
   t | jS )N)r   r-   )r   r   r   r   has_usable_password|   s    z$AbstractBaseUser.has_usable_passwordc             C   s   t dd S )NzDsubclasses of AbstractBaseUser must provide a get_full_name() method)NotImplementedError)r   r   r   r   get_full_name   s    zAbstractBaseUser.get_full_namec             C   s   t dd S )NzFsubclasses of AbstractBaseUser must provide a get_short_name() method.)rG   )r   r   r   r   get_short_name   s    zAbstractBaseUser.get_short_namec             C   s   d}t || j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   t jdt|S )NNFKC)unicodedata	normalizer   )r   r&   r   r   r   r<      s    z#AbstractBaseUser.normalize_username)r(   r)   r*   r   Z	CharField_r-   ZDateTimeFieldZ
last_loginZ	is_activeZREQUIRED_FIELDSr1   r3   r5   r:   r=   r>   r?   propertyr@   rA   rC   r   rE   rF   rH   rI   rK   r+   r<   __classcell__r   r   )r9   r   r,   3   s*   r,   )__doc__
__future__r   rM   Zdjango.contrib.authr   Zdjango.contrib.auth.hashersr   r   r   Z	django.dbr   Zdjango.utils.cryptor   r	   Zdjango.utils.deprecationr
   r   Zdjango.utils.encodingr   r   Zdjango.utils.translationr   rO   Managerr   ZModelr,   r   r   r   r   <module>   s   