U
    [be                     @   s   d Z ddl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mZmZmZmZ G dd deZG d	d
 d
eZG dd de
ZG dd deZG dd deZG dd deZdS )z!Django ORM models for Social Auth    N)FieldDoesNotExist)routertransaction)IntegrityError)AssociationMixinBaseStorage	CodeMixin
NonceMixinPartialMixin	UserMixinc                       s   e Zd ZdZedd Zd fdd	ZedddZed	d
 Zedd Z	edd Z
edd Zedd ZedddZedd Zedd Zed ddZedd Z  ZS )!DjangoUserMixinzSocial Auth association modelc                 C   s   |   d S N)saveclsuser r   W/var/www/html/services/stratfitenv/lib/python3.8/site-packages/social_django/storage.pychanged   s    zDjangoUserMixin.changedNc                    s   t  |r|   d S r   )superset_extra_datar   )self
extra_data	__class__r   r   r      s    zDjangoUserMixin.set_extra_datac                 C   sV   |d k	r| j j|d}n| j j|d}|j|d}t|drF| }nd}|pT| S )Nidproviderr   has_usable_passwordT)objectsexcludefilterhasattrr    exists)r   r   backend_nameZassociation_idqsZvalid_passwordr   r   r   allowed_to_disconnect   s    

z%DjangoUserMixin.allowed_to_disconnectc                 C   s   |   d S r   delete)r   entryr   r   r   
disconnect*   s    zDjangoUserMixin.disconnectc                 C   s   t |  ddS )NZUSERNAME_FIELDusername)getattr
user_model)r   r   r   r   username_field.   s    zDjangoUserMixin.username_fieldc                 O   s0   d|kr| d||  < |  jj|| S )z
        Return True/False if a User instance exists with the given arguments.
        Arguments are directly passed to filter() manager method.
        r-   )popr0   r/   _default_managerr#   r%   r   argskwargsr   r   r   user_exists2   s    zDjangoUserMixin.user_existsc                 C   s   t ||  d S r   )r.   r0   r   r   r   r   get_username<   s    zDjangoUserMixin.get_usernamec                 O   s0  |   }d|kr\||kr(|d||< n4z|  jd W n tk
rZ   |d Y nX zZttdrt	|  }tj
|d |  jj||}W 5 Q R X n|  jj||}W nt tk
r* } zT|ddd krd|d< z|  jj||}W n  |  jk
r   |Y nX W 5 d }~X Y nX |S )Nr-   atomicusingemailT )r0   r1   r/   _meta	get_fieldr   r$   r   r   db_for_writer8   r2   create_userr   getDoesNotExist)r   r4   r5   r0   r:   r   excr   r   r   r@   @   s2    

 zDjangoUserMixin.create_userc              	   K   sB   |rd|i}z|   jjf |W S  |   jk
r<   Y d S X d S )Npk)r/   r2   rA   rB   )r   rD   r5   r   r   r   get_userd   s    zDjangoUserMixin.get_userc                 C   s*   |   }t|dd}|jjf |d |iS )NZEMAIL_FIELDr;   Z__iexact)r/   r.   r2   r#   )r   r;   r/   Zemail_fieldr   r   r   get_users_by_emailm   s    z"DjangoUserMixin.get_users_by_emailc                 C   sB   t |tst|}z| jj||dW S  | jk
r<   Y d S X d S )N)r   uid)
isinstancestrr!   rA   rB   )r   r   rG   r   r   r   get_social_auths   s    
zDjangoUserMixin.get_social_authc                 C   s2   | j j|d}|r|j|d}|r.|j|d}|S )Nr   r   r   r!   r#   )r   r   r   r   r'   r   r   r   get_social_auth_for_user|   s    z(DjangoUserMixin.get_social_auth_for_userc              	   C   sh   t |tst|}ttdrRt| }tj|d | jj|||d}W 5 Q R X n| jj|||d}|S )Nr8   r9   )r   rG   r   )	rH   rI   r$   r   r   r?   r8   r!   create)r   r   rG   r   r:   Zsocial_authr   r   r   create_social_auth   s    


z"DjangoUserMixin.create_social_auth)N)N)N)NN)__name__
__module____qualname____doc__classmethodr   r   r(   r,   r0   r6   r7   r@   rE   rF   rJ   rL   rN   __classcell__r   r   r   r   r      s4   



	

#


r   c                   @   s0   e Zd Zedd Zedd Zedd ZdS )DjangoNonceMixinc                 C   s   | j j|||dd S )N)
server_url	timestampsalt   )r!   Zget_or_create)r   rV   rW   rX   r   r   r   use   s      zDjangoNonceMixin.usec                 C   s   | j j||dS )N)rV   rX   )r!   rA   )r   rV   rX   r   r   r   rA      s    zDjangoNonceMixin.getc                 C   s   |   d S r   r)   )r   noncer   r   r   r*      s    zDjangoNonceMixin.deleteN)rO   rP   rQ   rS   rZ   rA   r*   r   r   r   r   rU      s   

rU   c                   @   s0   e Zd Zedd Zedd Zedd ZdS )DjangoAssociationMixinc                 C   s   z| j j||jd}W n$ | jk
r:   | ||jd}Y nX zt|j |_W n& tk
rx   t	|j |_Y nX |j
|_
|j|_|j|_|  d S )N)rV   handle)r!   rA   r]   rB   base64encodebytessecretdecodeAttributeErrorencodestringZissuedZlifetimeZ
assoc_typer   )r   rV   associationassocr   r   r   store   s    zDjangoAssociationMixin.storec                 O   s   | j j||S r   rK   r3   r   r   r   rA      s    zDjangoAssociationMixin.getc                 C   s   | j j|d  d S )N)Zpk__in)r!   r#   r*   )r   Zids_to_deleter   r   r   remove   s    zDjangoAssociationMixin.removeN)rO   rP   rQ   rS   rf   rA   rg   r   r   r   r   r\      s   

r\   c                   @   s   e Zd Zedd ZdS )DjangoCodeMixinc                 C   s.   z| j j|dW S  | jk
r(   Y d S X d S )N)coder!   rA   rB   )r   ri   r   r   r   get_code   s    zDjangoCodeMixin.get_codeN)rO   rP   rQ   rS   rk   r   r   r   r   rh      s   rh   c                   @   s$   e Zd Zedd Zedd ZdS )DjangoPartialMixinc                 C   s.   z| j j|dW S  | jk
r(   Y d S X d S )N)tokenrj   )r   rm   r   r   r   load   s    zDjangoPartialMixin.loadc                 C   s   |  |}|r|  d S r   )rn   r*   )r   rm   partialr   r   r   destroy   s    
zDjangoPartialMixin.destroyN)rO   rP   rQ   rS   rn   rp   r   r   r   r   rl      s   
rl   c                   @   s   e Zd ZeZeZeZe	Z
dS )BaseDjangoStorageN)rO   rP   rQ   r   r   rU   r[   r\   rd   rh   ri   r   r   r   r   rq      s   rq   )rR   r^   Zdjango.core.exceptionsr   Z	django.dbr   r   Zdjango.db.utilsr   Zsocial_core.storager   r   r   r	   r
   r   r   rU   r\   rh   rl   rq   r   r   r   r   <module>   s    
 	