o
    Mf                     @   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	 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)settings)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   _/var/www/html/analyze/labelStudio/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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    r0   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 r1   )supersave	_passwordr   password_changed)r   argskwargs	__class__r   r   r7   B   s
   

zAbstractBaseUser.savec                 C   s   t | | jS )z"Return the username for this User.)getattrr"   r4   r   r   r   r3   H   s   zAbstractBaseUser.get_usernamec                 C   s   t | | j| |   d S r1   )setattrr"   normalize_usernamer3   r4   r   r   r   cleanL   s   zAbstractBaseUser.cleanc                 C   s
   |   fS r1   r2   r4   r   r   r   natural_keyO   s   
zAbstractBaseUser.natural_keyc                 C      dS )zj
        Always return False. This is a way of comparing User objects to
        anonymous users.
        Fr   r4   r   r   r   is_anonymousR      zAbstractBaseUser.is_anonymousc                 C   rC   )zt
        Always return True. This is a way to tell if the user has been
        authenticated in templates.
        Tr   r4   r   r   r   is_authenticatedZ   rE   z!AbstractBaseUser.is_authenticatedc                 C   s   t || _|| _d S r1   )r   r*   r8   )r   raw_passwordr   r   r   set_passwordb   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)rH   r8   r7   )rG   r4   r   r   setterk   s   
z/AbstractBaseUser.check_password.<locals>.setter)r   r*   )r   rG   rJ   r   r4   r   r   f   s   zAbstractBaseUser.check_passwordc                 C   s   t d | _d S r1   )r   r*   r4   r   r   r   set_unusable_passwordr   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*   r4   r   r   r   has_usable_passwordv   s   
z$AbstractBaseUser.has_usable_passwordc                 C   s   d}t || jdd S )NAdjango.contrib.auth.models.AbstractBaseUser.get_session_auth_hashsha1	algorithm)r	   r*   	hexdigestr   key_saltr   r   r   _legacy_get_session_auth_hash|   s   z.AbstractBaseUser._legacy_get_session_auth_hashc                 C   s   d}t || jtjd S )z7
        Return an HMAC of the password field.
        rM   rO   )r	   r*   r   DEFAULT_HASHING_ALGORITHMrQ   rR   r   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_FIELDSr8   r0   r5   r7   r3   rA   rB   propertyrD   rF   rH   r   rK   rL   rT   rV   r(   rY   r@   __classcell__r   r   r<   r   r)   0   s4    


r)   )__doc__r]   django.confr   django.contrib.authr   django.contrib.auth.hashersr   r   r   	django.dbr   django.utils.cryptor   r	   django.utils.translationr
   r`   Managerr   Modelr)   r   r   r   r   <module>   s    