o
    [h                     @   s   d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddl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)settings)password_validation)acheck_passwordcheck_passwordis_password_usablemake_password)models)salted_hmac)gettext_lazyc                   @   s(   e Zd Zedd Z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emailZ
email_nameZdomain_part r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/contrib/auth/base_user.pynormalize_email   s   zBaseUserManager.normalize_emailc                 C   s   | j di | jj|iS Nr   )getmodelUSERNAME_FIELDselfusernamer   r   r   get_by_natural_key$   s   z"BaseUserManager.get_by_natural_keyc                    s    | j di | jj|iI d H S r   )Zagetr   r   r   r   r   r   aget_by_natural_key'   s   z#BaseUserManager.aget_by_natural_keyN)__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d"d# Zd$d% Zd,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   Meta7   s    r,   c                 C      |   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 r.   )supersave	_passwordr   Zpassword_changed)r   argskwargs	__class__r   r   r4   @   s
   

zAbstractBaseUser.savec                 C   s   t | | jS )z"Return the username for this User.)getattrr   r1   r   r   r   r0   F   s   zAbstractBaseUser.get_usernamec                 C   s   t | | j| |   d S r.   )setattrr   normalize_usernamer0   r1   r   r   r   cleanJ   s   zAbstractBaseUser.cleanc                 C   s
   |   fS r.   r/   r1   r   r   r   natural_keyM   s   
zAbstractBaseUser.natural_keyc                 C      dS )zj
        Always return False. This is a way of comparing User objects to
        anonymous users.
        Fr   r1   r   r   r   is_anonymousP      zAbstractBaseUser.is_anonymousc                 C   r?   )zt
        Always return True. This is a way to tell if the user has been
        authenticated in templates.
        Tr   r1   r   r   r   is_authenticatedX   rA   z!AbstractBaseUser.is_authenticatedc                 C   s   t || _|| _d S r.   )r   r&   r5   )r   raw_passwordr   r   r   set_password`   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)rD   r5   r4   rC   r1   r   r   setterj   s   
z/AbstractBaseUser.check_password.<locals>.setter)r   r&   r   rC   rG   r   r1   r   r   d   s   zAbstractBaseUser.check_passwordc                    s"    fdd}t | j|I dH S )zSee check_password().c                    s*     |  d  _ jdgdI d H  d S rE   )rD   r5   ZasaverF   r1   r   r   rG   u   s   
z0AbstractBaseUser.acheck_password.<locals>.setterN)r   r&   rH   r   r1   r   r   r   s   z AbstractBaseUser.acheck_passwordc                 C   s   t d | _d S r.   )r   r&   r1   r   r   r   set_unusable_password}   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&   r1   r   r   r   has_usable_password   s   
z$AbstractBaseUser.has_usable_passwordc                 C   r-   )z7
        Return an HMAC of the password field.
        )_get_session_auth_hashr1   r   r   r   get_session_auth_hash   s   z&AbstractBaseUser.get_session_auth_hashc                 c   s     t jD ]	}| j|dV  qd S )N)secret)r   ZSECRET_KEY_FALLBACKSrK   )r   Zfallback_secretr   r   r   get_session_auth_fallback_hash   s   
z/AbstractBaseUser.get_session_auth_fallback_hashc                 C   s   d}t || j|dd S )NzAdjango.contrib.auth.models.AbstractBaseUser.get_session_auth_hashsha256)rM   	algorithm)r	   r&   	hexdigest)r   rM   Zkey_saltr   r   r   rK      s   z'AbstractBaseUser._get_session_auth_hashc                 C   s   z| j W S  ty   Y dS w )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   r<      s
   z#AbstractBaseUser.normalize_usernamer.   )!r!   r"   r#   r   Z	CharField_r&   ZDateTimeFieldZ
last_loginZ	is_activeZREQUIRED_FIELDSr5   r,   r2   r4   r0   r=   r>   propertyr@   rB   rD   r   r   rI   rJ   rL   rN   rK   r$   rS   r<   __classcell__r   r   r8   r   r%   +   s8    


	
r%   )__doc__rW   Zdjango.confr   Zdjango.contrib.authr   Zdjango.contrib.auth.hashersr   r   r   r   Z	django.dbr   Zdjango.utils.cryptor	   Zdjango.utils.translationr
   rY   Managerr   ZModelr%   r   r   r   r   <module>   s    