U
    9dF                     @   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 ZUserName   FT)
max_lengthuniqueblanknullZ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userZusersN)__name__
__module____qualname___verbose_nameverbose_name_plural r   r   8/var/www/html/UseVoiceDocker/src/apps/accounts/models.pyMeta"   s   r   c                 C   s   | j  d| j S N r   r   selfr   r   r   __str__&   s    zUser.__str__c                 C   s   | j  d| j S r   r!   r"   r   r   r   get_full_name)   s    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)Zdjango.contrib.auth.hashersr(   password)r#   Z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.confr,   Tokencreate_tokenTOKEN_EXPIRY_SECONDS)r*   r,   responser+   r"   r   r   generateToken;   s    z!User.token.<locals>.generateTokenr   )r#   r2   r   r"   r   r+   6   s    c                 C   s&   t jj| | j|d || _|   d S )N)r   	old_email	new_email)EmailHistoryobjectscreater   save)r#   r4   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)PasswordHistoryr6   r7   r)   Zset_passwordr8   )r#   r;   r   r   r   update_passwordJ   s    
zUser.update_passwordNc                 K   s   t |||| jgf| 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_user)N)r   r   r   __doc__r   	CharFieldr   username
EmailFieldr   BooleanFieldZis_verifiedUSERNAME_FIELDREQUIRED_FIELDSr	   r6   r   r$   r%   r'   r(   propertyr+   r9   r=   rB   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 )LoginInUserFZ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   rD   r   Zsession_keyGenericIPAddressField
ip_addressr$   r   r   r   r   rK   X   s   rK   c                   @   s   e Zd ZdZdZdZdS )	TokenType)Zemail_verificationzEmail Verification)Zpassword_resetzPassword Reset)Z
other_typez
Other TypeN)r   r   r   ZEmailVerificationZPasswordResetZ	OtherTyper   r   r   r   rV   a   s   rV   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 )r.   tokens)rM   rL      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 )r*   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 }|rH|	  |j
||d}tj||dd}	| jj|t|	|||d	 d
dd|	fS )Nr   )	timedelta)seconds    )r   r*   )user_idexpr*   ZHS256)	algorithm)r   r+   
expires_atr*   
secret_keyzToken created successfullysuccess)r?   status)datetimer]   r   nowsecrets	token_hexr6   filterfirstdeleter   jwtencoder7   str)
clsr   r*   Z
expires_inr]   rc   rd   Zexisting_tokenpayloadr+   r   r   r   r/   r   s    
zToken.create_tokenN)r\   )r   r   r   r   
ForeignKeyr
   rS   r   rD   r+   rd   DateTimeField
created_atrc   rV   r[   r*   r$   classmethodr/   r   r   r   r   r.   g   s   r.   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 )r5   rM   Fr   editablec                 C   s   | j  d| j S Nz - r   	timestampr"   r   r   r   r$      s    zEmailHistory.__str__N)r   r   r   r   rs   r
   rS   r   rF   r3   r4   rt   r   rh   r|   r$   r   r   r   r   r5      s
   r5   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 )	r<   rw   r   )r   Frx   c                 C   s   | j  d| j S rz   r{   r"   r   r   r   r$      s    zPasswordHistory.__str__N)r   r   r   r   rs   r
   rS   r   rD   r:   r;   rt   r   rh   r|   r$   r   r   r   r   r<      s
   r<   )rn   ri   logging	django.dbr   django.utilsr   django.core.mailr   django.core.exceptionsr   django.contrib.auth.modelsr   django.utils.translationr   r   managersr	   	getLogger__file__loggerr
   ModelrK   TextChoicesrV   r.   r5   r<   r   r   r   r   <module>   s    
C	
