o
    "4g*                     @   s  d dl Z d dlZd dlmZ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 d d	lmZ d d
lmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ G dd dej Z!G dd dZ"G dd de"ej Z#G dd de"Z$G dd dZ%dd Z&dS )    N)DictOptional)settings)get_user_model)AbstractBaseUser)signing)models)Q)UniqueConstraint)timezone)gettext_lazy)app_settingssignals)get_adapter)EmailAddressManagerEmailConfirmationManagerc                       s   e Zd ZejejedejdZ	ej
dejeddZejedddZejed	ddZe ZG d
d dZdd Z fddZdd ZdddZdddZdddZdd Z  ZS )EmailAddressuserverbose_name	on_deleteTemail address)db_index
max_lengthr   verifiedFr   defaultprimaryc                   @   sb   e Zd ZedZedZdgZeddgdeddd	gZ	e
jr/e	ed
gdeddd	 dS dS )zEmailAddress.Metar   zemail addresses)r   emailr   r   unique_primary_emailT)r   )fieldsname	conditionr   unique_verified_email)r   N)__name__
__module____qualname___r   verbose_name_pluralunique_togetherr
   r	   constraintsr   UNIQUE_EMAILappend r-   r-   _/var/www/html/authentication-server/venv/lib/python3.10/site-packages/allauth/account/models.pyMeta'   s&    r/   c                 C   s   | j S N)r   selfr-   r-   r.   __str__;   s   zEmailAddress.__str__c                    s   t    | j | _d S r0   )supercleanr   lowerr1   	__class__r-   r.   r5   >   s   
zEmailAddress.cleanc                 C   s:   | j rdS d}tjrtjj| jdjd| jd	 }| S )NTFpk)r   r   )
r   r   r+   r   objectsexcluder:   filterr   exists)r2   conflictr-   r-   r.   can_set_verifiedB   s   zEmailAddress.can_set_verifiedc                 C   s0   | j rdS |  rd| _ |r| jdgd | j S )NTr   )update_fields)r   r@   save)r2   commitr-   r-   r.   set_verifiedN   s   zEmailAddress.set_verifiedc                 C   sX   ddl m} tj| j}|r|rdS d|_|  d| _|   || j| jdd dS )zMarks the email address as primary. In case of `conditional`, it is
        only marked as primary if there is no other primary email address set.
        r   
user_emailFTrC   )	allauth.account.utilsrF   r   r;   get_primaryr   r   rB   r   )r2   conditionalrF   old_primaryr-   r-   r.   set_as_primaryW   s   zEmailAddress.set_as_primaryNc                 C   s"   t  }|| }|j||d |S )N)signup)get_emailconfirmation_modelcreatesend)r2   requestrM   modelconfirmationr-   r-   r.   send_confirmationh   s   
zEmailAddress.send_confirmationc                 C   sd   ddl m} |   || j| jkr0tjj| jdd	 }d}|r&|j}|| j|dd d S d S )Nr   rE   )r   z	-verified TrG   )
rH   rF   deleter   r   r   r;   r=   order_byfirst)r2   rF   alt	alt_emailr-   r-   r.   removen   s   zEmailAddress.remove)T)FNF)r$   r%   r&   r   
ForeignKeyr   AUTH_USER_MODELr'   CASCADEr   
EmailFieldr   EMAIL_MAX_LENGTHr   BooleanFieldr   r   r   r;   r/   r3   r5   r@   rD   rL   rT   r[   __classcell__r-   r-   r7   r.   r      s,    

	
r   c                   @   s   e Zd Zdd ZdddZdS )EmailConfirmationMixinc                 C   s*   | j }|jst ||}|r|S d S d S r0   )email_addressr   r   confirm_email)r2   rQ   re   	confirmedr-   r-   r.   confirm   s   zEmailConfirmationMixin.confirmNFc                 C   s*   t  || | tjj| j|| |d d S )N)senderrQ   rS   rM   )r   send_confirmation_mailr   email_confirmation_sentrP   r8   r2   rQ   rM   r-   r-   r.   rP      s   
zEmailConfirmationMixin.sendr\   )r$   r%   r&   rh   rP   r-   r-   r-   r.   rd   ~   s    rd   c                       s   e Zd ZejeedejdZej	ede
jdZej	edddZejedd	dd
Ze ZG dd dZdd Zedd Zedd Zdd Zde_ fddZd fdd	Z  ZS )EmailConfirmationr   r   createdr   sentT)r   nullkey@   )r   r   uniquec                   @   s   e Zd ZedZedZdS )zEmailConfirmation.Metazemail confirmationzemail confirmationsN)r$   r%   r&   r'   r   r(   r-   r-   r-   r.   r/      s    r/   c                 C   s
   d| j  S )Nzconfirmation for %sre   r1   r-   r-   r.   r3         
zEmailConfirmation.__str__c                 C   s   t  |j}| jj||dS )N)re   rq   )r   generate_emailconfirmation_keyr   _default_managerrO   )clsre   rq   r-   r-   r.   rO      s   zEmailConfirmation.createc                 C   s,   t j }|d}|j| d }|S )Nemail_address__user)rq   )rm   r;   	all_validselect_relatedr=   r6   rX   )rx   rq   qsemailconfirmationr-   r-   r.   from_key   s   

zEmailConfirmation.from_keyc                 C   s    | j tjtjd }|t kS )N)days)ro   datetime	timedeltar   EMAIL_CONFIRMATION_EXPIRE_DAYSr   now)r2   expiration_dater-   r-   r.   key_expired   s   zEmailConfirmation.key_expiredc                    s   |   s
t |S d S r0   )r   r4   rh   )r2   rQ   r7   r-   r.   rh      s   zEmailConfirmation.confirmNFc                    s&   t  j||d t | _|   d S )N)rQ   rM   )r4   rP   r   r   ro   rB   rl   r7   r-   r.   rP      s   
zEmailConfirmation.sendr\   )r$   r%   r&   r   r]   r   r'   r_   re   DateTimeFieldr   r   rn   ro   	CharFieldrq   r   r;   r/   r3   classmethodrO   r~   r   booleanrh   rP   rc   r-   r-   r7   r.   rm      s(    

rm   c                   @   s@   e Zd Zdd Zedd Zedd Zedd Zd	d
 Z	dS )EmailConfirmationHMACc                 C   s
   || _ d S r0   rt   )r2   re   r-   r-   r.   __init__   ru   zEmailConfirmationHMAC.__init__c                 C   s   t |S r0   )r   )rx   re   r-   r-   r.   rO      s   zEmailConfirmationHMAC.createc                 C   s   t j| jjtjdS )N)objsalt)r   dumpsre   r:   r   SALTr1   r-   r-   r.   rq      s   zEmailConfirmationHMAC.keyc              
   C   s\   zdt j }tj||t jd}ttjj|dd}W |S  tj	tj
tjfy-   d }Y |S w )NiQ )max_ager   F)r:   r   )r   r   r   loadsr   r   r   r;   getSignatureExpiredBadSignatureDoesNotExist)rx   rq   r   r:   retr-   r-   r.   r~      s   

zEmailConfirmationHMAC.from_keyc                 C   s   dS r\   r-   r1   r-   r-   r.   r      s   z!EmailConfirmationHMAC.key_expiredN)
r$   r%   r&   r   r   rO   propertyrq   r~   r   r-   r-   r-   r.   r      s    


r   c                   @   s   e Zd ZU dZee ed< ejed< ee	 ed< e
ed< ee ed< e	ed< eed< ee ed	< 	
	
	
		
	
	
ddeej d	ee dee	 de
dee dee	 dee fddZdd Zedd Zd
S )Logina  
    Represents a user that is in the process of logging in.

    Keyword arguments:

    signup -- Indicates whether or not sending the
    email is essential (during signup), or if it can be skipped (e.g. in
    case email verification is optional and we are only logging in).
    r   email_verificationsignal_kwargsrM   r   stateinitiated_atredirect_urlNFc	           	      C   s\   || _ |stj}|| _|| _|| _|| _|| _|d u ri n|| _|r'|| _
d S t		 | _
d S r0   )r   r   EMAIL_VERIFICATIONr   r   r   rM   r   r   timer   )	r2   r   r   r   r   rM   r   r   r   r-   r-   r.   r      s   zLogin.__init__c              	   C   sv   ddl m} | j}|d ur |d}|d ur | }| |d< | jr(|| jnd | j| j| j	| j
|| j| jd}|S )Nr   )user_pk_to_url_strsociallogin)user_pkr   rM   r   r   r   r   r   )rH   r   r   r   copy	serializer   r   rM   r   r   r   r   )r2   r   r   r   datar-   r-   r.   r     s"   

zLogin.serializec              	   C   s   ddl m} d }|d }|d urt jj||d }z8|d }|d ur?|d}|d ur?ddlm} |	 }|
||d< t||d |d	 |d
 ||d |d dW S  ty^   t w )Nr   )url_str_to_user_pkr   r9   r   r   )SocialLoginr   r   rM   r   r   )r   r   r   rM   r   r   r   )rH   r   r   r;   r=   rX   r   allauth.socialaccount.modelsr   r   deserializer   KeyError
ValueError)rx   r   r   r   r   r   r   r   r-   r-   r.   r   "  s4   
	zLogin.deserialize)NNNFNNN)r$   r%   r&   __doc__r   r   __annotations__r   EmailVerificationMethodr   boolstrfloatr   r   r   r   r-   r-   r-   r.   r      sF   
 
	
r   c                  C   s,   t jrddlm}  | S t jrt}|S t}|S )Nr   )EmailVerificationModel)r   "EMAIL_VERIFICATION_BY_CODE_ENABLED9allauth.account.internal.flows.email_verification_by_coder   EMAIL_CONFIRMATION_HMACr   rm   )r   rR   r-   r-   r.   rN   D  s   rN   )'r   r   typingr   r   django.confr   django.contrib.authr   django.contrib.auth.modelsr   django.corer   	django.dbr   django.db.modelsr	   django.db.models.constraintsr
   django.utilsr   django.utils.translationr   r'   allauth.accountr   r   allauth.account.adapterr   allauth.account.managersr   r   Modelr   rd   rm   r   r   rN   r-   r-   r-   r.   <module>   s*    g1e