o
    cF                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ dd	lmZ eeZG d
d deZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZdS )    N)models)timezone)	send_mail)ValidationError)AbstractUser)gettext_lazy   )UserManagerc                   @   s   e Zd ZdZejeddddddZejedddded	id
Z	ej
edddZdZddgZe ZG dd dZ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"d#Zd!S )%Userz Custom User Model UserName   FT)
max_lengthuniqueblanknullEmailr   z.A user with that email address already exists.)r   r   error_messageszVerified Account)defaultemail
first_name	last_namec                   @   s   e Zd ZedZedZdS )z	User.MetauserusersN)__name__
__module____qualname___verbose_nameverbose_name_plural r   r   9/var/www/html/docker_usevoice/src/apps/accounts/models.pyMeta"   s    r!   c                 C      | j  d| j S N r   r   selfr   r   r    __str__&      zUser.__str__c                 C   r"   r#   r%   r&   r   r   r    get_full_name)   r)   zUser.get_full_namec                 C   s   | j S N)r   r&   r   r   r    get_short_name,   s   zUser.get_short_namec                 C   s   ddl m} ||| jS )Nr   )check_password)django.contrib.auth.hashersr-   password)r'   raw_passwordr-   r   r   r    r-   /   s   zUser.check_passwordc                 C   s   dS )z:  Allows us to get a user's token by calling `user.token` Nr   )r'   
token_typer   r   r    token3   s    z
User.tokenc                    s    fdd}|S )zQ
        Allows us to get a user's token by calling `request.user.token`
        c                    s$   ddl m} t | |j\}}|S )Nr   )settings)django.confr3   Tokencreate_tokenTOKEN_EXPIRY_SECONDS)r1   r3   responser2   r&   r   r    generateToken;   s   z!User.token.<locals>.generateTokenr   )r'   r9   r   r&   r    r2   6   s   c                 C   s&   t jj| | j|d || _|   d S )N)r   	old_email	new_email)EmailHistoryobjectscreater   save)r'   r;   r   r   r    update_emailA   s   zUser.update_emailc                 C   s*   t jj| | j|d | | |   d S )N)r   old_passwordnew_password)PasswordHistoryr=   r>   r/   set_passwordr?   )r'   rB   r   r   r    update_passwordJ   s   
zUser.update_passwordNc                 K   s   t |||| jgfi | dS )z Sends an email to this User. N)r   r   )r'   subjectmessage
from_emailkwargsr   r   r    
email_userS   s   zUser.email_userr+   )r   r   r   __doc__r   	CharFieldr   username
EmailFieldr   BooleanFieldis_verifiedUSERNAME_FIELDREQUIRED_FIELDSr	   r=   r!   r(   r*   r,   r-   propertyr2   r@   rE   rJ   r   r   r   r    r
      s(    


		r
   c                   @   sT   e Zd ZejeddejdZeje	dddddZ
eje	ddd	dd
Zdd ZdS )LoginInUserFlogin_in_user)r   related_name	on_deletezSession keyT6   )r   r   r   z
IP Addressboth)r   protocolunpack_ipv4c                 C   s
   | j j S r+   )r   r   r&   r   r   r    r(   ]   s   
zLoginInUser.__str__N)r   r   r   r   OneToOneFieldr
   CASCADEr   rL   r   session_keyGenericIPAddressField
ip_addressr(   r   r   r   r    rT   X   s
    rT   c                   @   s   e Zd ZdZdZdZdS )	TokenType)email_verificationzEmail Verification)password_resetzPassword Reset)
other_typez
Other TypeN)r   r   r   EmailVerificationPasswordReset	OtherTyper   r   r   r    ra   a   s    ra   c                   @   st   e Zd ZejeejddZejdddZ	ejdddZ
ejddZe Zejdejd	Zd
d ZedddZdS )r5   tokens)rW   rV      T)r   r   )r   r   )auto_now_addd   )r   choicesc                 C   s   d| j  d| jj S )NzToken With Type z
 For User )r1   r   r   r&   r   r   r    r(   o   s   zToken.__str__  c           
      C   s   ddl m} t ||d }td}| jj||d }|r$|	  |j
||d}tj||dd}	| jj|t|	|||d	 d
dd|	fS )Nr   )	timedelta)seconds    )r   r1   )user_idexpr1   HS256)	algorithm)r   r2   
expires_atr1   
secret_keyzToken created successfullysuccess)rG   status)datetimern   r   nowsecrets	token_hexr=   filterfirstdeleter   jwtencoder>   str)
clsr   r1   
expires_inrn   ru   rv   existing_tokenpayloadr2   r   r   r    r6   r   s   
zToken.create_tokenN)rm   )r   r   r   r   
ForeignKeyr
   r]   r   rL   r2   rv   DateTimeField
created_atru   ra   rl   r1   r(   classmethodr6   r   r   r   r    r5   g   s    r5   c                   @   sD   e Zd ZejeejdZe Z	e Z
ejejddZdd ZdS )r<   rW   Fr   editablec                 C   r"   Nz - r   	timestampr&   r   r   r    r(      r)   zEmailHistory.__str__N)r   r   r   r   r   r
   r]   r   rN   r:   r;   r   r   rz   r   r(   r   r   r   r    r<      s    r<   c                   @   sL   e Zd ZejeejdZejddZ	ejddZ
ejejddZdd ZdS )	rC   r   r   )r   Fr   c                 C   r"   r   r   r&   r   r   r    r(      r)   zPasswordHistory.__str__N)r   r   r   r   r   r
   r]   r   rL   rA   rB   r   r   rz   r   r(   r   r   r   r    rC      s    rC   )r   r{   logging	django.dbr   django.utilsr   django.core.mailr   django.core.exceptionsr   django.contrib.auth.modelsr   django.utils.translationr   r   managersr	   	getLogger__file__loggerr
   ModelrT   TextChoicesra   r5   r<   rC   r   r   r   r    <module>   s"    
C	
