o
    ˷e9                     @   s  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
mZ d dlm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mZ d dlmZ d dlmZ d dlmZmZm Z m!Z! dd Z"d;ddZ#d<ddZ$da%dd Z&dd Z'dd Z(dd Z)dd  Z*d!d" Z+d=d#d$Z,				d>d%d&Z-d=d'd(Z.d)d* Z/d+d, Z0d?d-d.Z1d/d0 Z2d1d2 Z3d=d3d4Z4d5d6 Z5d7d8 Z6d9d: Z7dS )@    N)OrderedDict)settings)messages)update_session_auth_hash)FieldDoesNotExistValidationError)models)Q)	force_str)base36_to_intint_to_base36	urlencode)app_settingssignals)get_adapter)ImmediateHttpResponse)get_request_paramget_user_modelimport_callablevalid_email_or_nonec                 C   s(   t d|  }t d| }||kS )z
    Perform case-insensitive comparison of two identifiers, using the
    recommended algorithm from Unicode Technical Report 36, section
    2.11.2(B)(2).
    NFKC)unicodedata	normalizecasefold)s1s2norm_s1norm_s2 r   L/var/www/ideatree/venv/lib/python3.10/site-packages/allauth/account/utils.py_unicode_ci_compare   s   r    nextc                 C   s    t | |}t| |sd}|S )z_
    Returns the next URL to redirect to, if it was explicitly passed
    via the request.
    N)r   r   is_safe_url)requestredirect_field_nameredirect_tor   r   r   get_next_redirect_url#   s   
r&   Fc                 C   sR   |}|rt |r| }|st| |d}|s'|r t| | }|S t| | }|S )N)r$   )callabler&   r   get_signup_redirect_urlget_login_redirect_url)r#   urlr$   signupretr   r   r   r)   .   s   r)   c                 C   s   t js
t| | d S d S N)r   LOGOUT_ON_PASSWORD_CHANGEr   )r#   userr   r   r   logout_on_password_changeA   s   r0   c                 C   s   t jr	t| t jS t| S r-   )r   USER_MODEL_USERNAME_FIELDgetattrr
   r/   r   r   r   default_user_displayI   s   r4   c                 C   s    t sttdt}t|a t | S )NACCOUNT_USER_DISPLAY)_user_display_callabler2   r   r4   r   )r/   fr   r   r   user_displayP   s   r8   c                 G   s   |sdS t  }z|j|}|j}W n ty%   t| |s!Y dS d}Y nw |r<|d }|r4|d| }t| || dS t| |S )zR
    Gets or sets (optional) user model fields. No-op if fields do not exist.
    Nr   )r   _meta	get_field
max_lengthr   hasattrsetattrr2   )r/   fieldargsUser
field_metar;   vr   r   r   
user_fieldX   s"   


rC   c                 G   s4   |rt js|d r|d  g}t| t jg|R  S )Nr   )r   PRESERVE_USERNAME_CASINGlowerrC   r1   r/   r?   r   r   r   user_usernameq   s   rG   c                 G   s   t | tjg|R  S r-   )rC   r   USER_MODEL_EMAIL_FIELDrF   r   r   r   
user_emailw   s   rI   c                 C   sb   ddl m} d }|r%d}z|j| |}|j}W |S  |jy$   Y |S w |jj| dd }|S )N   EmailAddressFT)r/   verified)r   rL   objectsget_for_userrM   DoesNotExistfilterexists)r/   emailrL   emailaddressr,   r   r   r   has_verified_email{   s   rU   c              
   C   s   t | }z0t|||||d}|j| |fi |}	|	r|	W S || | |j| |fi |}	|	r2|	W S W |	S  tyJ }
 z
|
j}	W Y d}
~
|	S d}
~
ww )z
    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).
    )email_verificationredirect_urlsignal_kwargsr+   rS   N)r   dict	pre_loginlogin
post_loginr   response)r#   r/   rV   rW   rX   r+   rS   adapterhook_kwargsr]   er   r   r   perform_login   s.   ra   c                 C   s<   |d u ri }t jjd|j| |d| t| ||d||dS )N)senderr#   r/   T)rV   r+   rW   rX   r   )r   user_signed_upsend	__class__ra   )r#   r/   rV   success_urlrX   r   r   r   complete_signup   s   rg   c                 C   sT  ddl m} t| }t }g }g }g }|D ]Z}t|j}	|	sqtjr,|jj	|	d
 r,q||	 }
|
rD|
jp:|j|
_|
jpA|j|
_n|}
|
jpO|| |
j|
_|
||	 < |
jrg||
 |
jrg||
 |
jro||
 q|rw|d }n|r~|d }n|r|d }n|r| d }nd}| D ]}
|j |
j k|
_qt| |fS )a  
    Takes a list of EmailAddress instances and cleans it up, making
    sure only valid ones remain, without multiple primaries etc.

    Order is important: e.g. if multiple primary e-mail addresses
    exist, the first one encountered will be kept as primary.
    rJ   rK   email__iexactr   N)r   rL   r   r   r   rS   r   UNIQUE_EMAILrN   rQ   rR   getrE   primaryrM   is_email_verifiedappendkeysvalueslist)r#   	addressesrL   r^   e2aprimary_addressesverified_addressesprimary_verified_addressesaddressrS   aprimary_addressr   r   r   cleanup_email_addresses   sR   






rz   c           
      C   s   ddl m} |jj|d rJ g }t| }|| }|r)||||ddd t|}|r:||||ddd t	| || \}}|D ]	}	||	_
|	  qE|j|| |rm|rm| |j krmt||j |  |S )z
    Creates proper EmailAddress for the user that was just signed
    up. Only sets up, doesn't do any other handling such as sending
    out email confirmation mails etc.
    rJ   rK   r3   T)r/   rS   rl   rM   F)r   rL   rN   rQ   rR   r   unstash_verified_emailrn   rI   rz   r/   savefill_cache_for_userrE   rS   )
r#   r/   rr   rL   priority_addressesr^   stashed_emailrS   rl   rx   r   r   r   setup_user_email  s2   

r   c              
   C   s   ddl m} t| }|st|}|rYz|j||}|js-|| |}|r,|j| |d nd}W n |j	yK   d}|jj
| |||dd}|sIJ Y nw |rY|| tjdd|i |re|| t| d	S d	S )
a  
    E-mail verification mails are sent:
    a) Explicitly: when a user signs up
    b) Implicitly: when a user attempts to log in using an unverified
    e-mail while EMAIL_VERIFICATION is mandatory.

    Especially in case of b), we want to limit the number of mails
    sent (consider a user retrying a few times), which is why there is
    a cooldown period before sending a new mail. This cooldown period
    can be configured in ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN setting.
    rJ   rK   )r+   FT)r+   confirmz,account/messages/email_confirmation_sent.txtrS   N)r   rL   r   rI   rN   rO   rM   should_send_confirmation_mailsend_confirmationrP   	add_emailadd_messager   INFO
stash_useruser_pk_to_url_str)r#   r/   r+   rS   rL   r^   email_address
send_emailr   r   r   send_email_confirmation%  sB   
r   c                 C   sl   ddl m} t| }|r2|jj| |d s4tjr$|jj|d r$dS |jj| |dddd dS dS dS )	z
    Keep user.email in sync with user.emailaddress_set.

    Under some circumstances the user.email may not have ended up as
    an EmailAddress record, e.g. in the case of manually created admin
    users.
    rJ   rK   )r/   ri   rh   NF)rl   rM   )r/   rS   defaults)	r   rL   rI   rN   rQ   rR   r   rj   get_or_create)r/   rL   rS   r   r   r   sync_user_email_addressesT  s   
r   c                  G   st   t jr$dd | D }|d }|dd  D ]}||B }qt j|}|S t jjdi t jd dd | D i}|S )Nc                 S   s$   g | ]}t di tjd  |iqS )__iexactr   )r	   r   r1   .0ur   r   r   
<listcomp>q  s    z,filter_users_by_username.<locals>.<listcomp>r   rJ   __inc                 S   s   g | ]}|  qS r   )rE   r   r   r   r   r   }  s    r   )r   rD   r   _default_managerrQ   r1   )usernameqlistqq2r,   r   r   r   filter_users_by_usernameo  s"   
r   c                 C   s   ddl m} t }|jj| d}|dur|j|d}g }|dD ]}t|j| r/||j	 q!t
jrdt
jd | i}|jjd	i |}|durM|j|d}| D ]}	t|	t
j}
t|
| rc||	 qQtt|S )
zReturn list of users by email address

    Typically one, at most just a few in length.  First we look through
    EmailAddress table, than customisable User model table. Add results
    together avoiding SQL joins and deduplicate.
    rJ   rK   rh   N)user__is_activer/   r   )	is_activer   )r   rL   r   rN   rQ   prefetch_relatedr    rS   rn   r/   r   rH   iteratorr2   rq   set)rS   r   rL   r@   mailsusersr`   q_dictuser_qsr/   rI   r   r   r   filter_users_by_email  s*   

r   c                 C   s8   | ddk s	J t| |}|r|d t||i }|S )N?r   )findr&   r   )r#   r*   r$   next_urlr   r   r   passthrough_next_redirect_url  s
   
r   c                 C   sV   t  }tt|jjtjrt| jtr| jS | jj	S | j}t|t
r't| j}t|S )z&
    This should return a string.
    )r   
issubclasstyper9   pkr   	UUIDField
isinstancestrhexintr   )r/   r@   r,   r   r   r   r     s   

r   c                 C   s   t  }t|jjdd }|rt|dd r|jjjjjj}n|jj}tt|tj	r-|
| S z
|
d | }W |S  tyE   t| }Y |S w )Nremote_fieldtorx   )r   r2   r9   r   r   r   r   r   r   r   	to_pythonr   r   )sr@   r   pk_fieldr   r   r   r   url_str_to_user_pk  s   


r   )r!   )Nr!   Fr-   )NNFN)FN)8r   collectionsr   django.confr   django.contribr   django.contrib.authr   django.core.exceptionsr   r   	django.dbr   django.db.modelsr	   django.utils.encodingr
   django.utils.httpr   r   r   allauth.accountr   r   allauth.account.adapterr   allauth.exceptionsr   allauth.utilsr   r   r   r   r    r&   r)   r6   r0   r4   r8   rC   rG   rI   rU   ra   rg   rz   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sP    




)>
#/
