U
    scf                     @   s  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mZ d dlmZ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$m%Z&m'Z( d dl)m*Z* d dl+m,Z,m-Z- d dl.m/Z/ eeZ0eeZ1ee/Z2ee1ddddee0e&j3ddG dd de	Z4ee1ddddee0e&j5ddee2e$j6ge*ddddG dd de	Z7ee1ddddee0e&j8ddG dd de	Z9ee1ddddee0e&j:ddG d d! d!e	Z;ee1ddddee0e&j<ddG d"d# d#e	Z=ee1ddddee0e&j>ddG d$d% d%e	Z?ee1ddddee0e&j@ddG d&d' d'e	ZAee1ddddee0e&jBddee2e$j6ge*ddddG d(d) d)e	ZCee1ddddee0e&jDddG d*d+ d+e	ZEee1ddddee0e&jFddG d,d- d-e	ZGee1ddddee0e&jHddG d.d/ d/e	ZId0S )1    )	timedelta)Q)timezonestatus)APIView)#decorator_from_middleware_with_args)method_decorator)google_recaptcha_helperGoogleRecaptchaException)AuthorizatorMiddleware)"AccessSerializerForAllCollabratorsInvitationSerializerAccessibleInstituteSerializer))invite_collaborator_email_content_buildersend_html_emailsend_sms_invite)SerializerValidationMiddleware)
MyResponse)check_institute_limitations)User)defined_rolesserializersutils)	Institute)AccessInviteAccess)CollaborationAccessMiddlewareT)accept_user_tokenpost)namec                   @   s   e Zd ZdZdd ZdS )Invitez
    This API class is responsible for handling incoming requests for inviting another user to a institute.
    We check access in the views level and not in middleware level,
    because it was based on input parameters of views.
    c              
   C   s  |j d}|j d}|r$| }|j d}|rRd}d}t||}||}|j d}|jd}	|j}
ztj	j|dd	}W n"   t
|d
ddtjd Y S X ztj	j|j|d}|j}W n"   t
|d
ddtjd Y S X tj	j|ddd }tj	j|d }|| |jkr@t
|d
d|j ddtjdS t||sdt
|d
ddtjdS tj	jtddtddB |jt tdd d }|dkrt
|d
ddtjdS tj	j|jt tdd d }|dkr$zt|	 W n. tk
r" } z|j W Y S d }~X Y nX d }|rPztj	j|d}W n   Y nX n&|rvztj	j|d}W n   Y nX tj	j|||ddd}t|dkrt
|d
d dtjdS |rtj	j||d!}t|dkrt
|d
d"dtjdS tj	j||||j||d#}d$}|
jr,|
j r,|
j d%|
j  }n|
jr<|
j}n|
j rJ|
j }|rlt!||j"|d&}t#|| n|rt$|||j"d' t%&|j'}t
|d(d)|d*tj(dS )+Ninstitute_idemailphoneu(   ۱۲۳۴۵۶۷۸۹۰١٢٣٤٥٦٧٨٩٠Z12345678901234567890roleszg-recaptcha-responseF)idsandboxerror	Forbiddenr   messager   user	institute)r.   rejectedcanceledr.   z8The capacity to send invitations to each institution is z peopleT)r/   )r0   H   )hours)modifirecreated_at__gt
         )r#   )r$   )r.   invited_emailinvited_phoner/   r0   r   zThis user is already invited)r.   r-   z#This user is already a collaborator)r.   r:   invited_userr4   r9   r%   - )institute_namecaller_full_name)tocaller_namer>   ok
Successful)r   r+   access))middleware_serializer_datagetlowerstr	maketrans	translatePOSTmiddleware_userr   objectsr   r   HTTP_403_FORBIDDENr   r%   r   filtercount$best_max_collaborators_per_institutecollaborators_utils,check_modify_collaborators_base_on_roles_catr   r   nowr   r
   r   my_responser   lencreate
first_name	last_namer   r    r   r   collaborators_serializersr   dataHTTP_200_OK)selfrequestr"   r#   r$   ZintabZouttabZtranslation_tabletarget_user_rolesg_recaptcha_responsecallerr.   Z
siu_accessZ	siu_rolesZother_invitation_countZother_access_countZfailed_invitation_attemptsattemptser;   Z9other_active_invitation_for_target_user_on_this_instituteZ.other_access_for_target_user_on_this_institute
invitation	full_namecontentZinvite_access_record_data rg   //var/www/wikiazma_server/collaborators/views.pyr   )   s    
 
  


 


      zInvite.postN__name__
__module____qualname____doc__r   rg   rg   rg   rh   r!      s   r!   r&   r"   c                   @   s   e Zd Zdd ZdS )ListInvitationsc           	      C   sz   |j d}|j d}|j}tjj|ddd}| }|d|||  }t|ddj	}t
|dd	||d
dtjdS )NskiptakeF)r.   r0   r/   
created_atTmanyrB   rC   Zinvitationstotal_countr   r+   r[   r   )rE   rF   middleware_model_recordr   rM   rO   rP   order_byr   r[   r   r   r\   )	r]   r^   ro   rp   r.   querysetru   invitations_queryinvitations_datarg   rg   rh   r      s$      zListInvitations.postNrj   rk   rl   r   rg   rg   rg   rh   rn      s   rn   c                   @   s   e Zd Zdd ZdS )ListMyInvitationsc           	      C   sz   |j d}|j d}|j}tjj|ddd}| }|d|||  }t|ddj	}t
|dd	||d
dtjdS )Nro   rp   F)r;   r0   r/   rq   Trr   rB   rC   rt   rv   r   )rE   rF   rL   r   rM   rO   rP   rx   r   r[   r   r   r\   )	r]   r^   ro   rp   ra   ry   ru   rz   r{   rg   rg   rh   r      s"       zListMyInvitations.postNr|   rg   rg   rg   rh   r}      s   r}   c                   @   s   e Zd ZdZdd ZdS )AcceptInvitationq
    This API class is responsible for handling incoming requests for accepting an invitaion to a institute.
    c                 C   s   |j d}ztjj|j|ddd}W n"   t|dddtjd Y S X tjj	|j|j
d}t|d	krt|dd
dtjdS tjj|j|j
|j|j
j|j
jd}|  t|dddtjdS )Ninvitation_idF)r;   r&   r0   r/   r(   0We cant find your invitation for this institute!r*   r   r,   r   z%You are a member of this institution!)r-   r.   r%   r>   institute_created_atrB   rC   )rE   rF   r   rM   rL   r   r   rN   r   rO   r.   rV   rW   r;   r%   r    rq   deleter\   )r]   r^   r   rd   Zaccess_queryrD   rg   rg   rh   r      s:       
 zAcceptInvitation.postNri   rg   rg   rg   rh   r~      s   r~   c                   @   s   e Zd ZdZdd ZdS )RejectInvitationr   c                 C   sn   |j d}ztjj|j|ddd}W n"   t|dddtjd Y S X d|_|	  t|d	d
dtj
dS )Nr   F)r;   r&   r/   r0   r(   r   r*   r   TrB   rC   )rE   rF   r   rM   rL   r   r   rN   r/   saver\   )r]   r^   r   rd   rg   rg   rh   r     s       
zRejectInvitation.postNri   rg   rg   rg   rh   r      s   r   c                   @   s   e Zd Zdd ZdS )RemoveInvitationc                 C   s   |j d}|j}ztjj|ddd}|j}W n"   t|dddtjd Y S X zt	jj||j
d}|j}W n"   t|d	d
dtjd Y S X t||st|d	d
dtjdS d|_||_|  t|dddtjdS )Nr   Fr&   r0   r/   	not_foundinvitation not foundr*   r   r,   r(   r)   TrB   rC   )rE   rF   rL   r   rM   r%   r   r   HTTP_404_NOT_FOUNDr   r.   rN   rR   rS   r0   r4   r   r\   )r]   r^   r   ra   rd   r_   caller_accesscaller_rolesrg   rg   rh   r     s2      
 
zRemoveInvitation.postNr|   rg   rg   rg   rh   r     s   r   c                   @   s   e Zd ZdZdd ZdS )RemoveAccesszt
    This API class is responsible for handling incoming requests for removing access of a user to a institute.
    c                 C   s   |j d}ztjj|d}|j}W n"   t|dddtjd Y S X ztjj|j|j	d}|j}W n"   t|dd	dtj
d Y S X t||st|dd	dtj
dS |  t|d
ddtjdS )N	access_idr&   r   Access not foundr*   r   r,   r(   r)   rB   rC   )rE   rF   r   rM   r%   r   r   r   rL   r.   rN   rR   rS   r   r\   )r]   r^   r   rD   r_   r   r   rg   rg   rh   r   B  s$    
 
zRemoveAccess.postNri   rg   rg   rg   rh   r   :  s   r   c                   @   s   e Zd ZdZdd ZdS )AllCollaboratorszt
    This API class is responsible for handling incoming requests for getting all collaborators of a institute.
    c           	      C   s   |j d}|j d}|j d}tjj|jd}|rf|t|dt|dB t|dB t|dB }| }||||  }t|d	d
j	}t
|dd||ddtjdS )Nro   rp   search_wordsr1   )Zuser__email__icontains)Zuser__phone__icontains)Zuser__first_name__icontains)Zuser__last_name__icontainsTrr   rB   rC   )collaboratorsru   rv   r   )rE   rF   r   rM   rO   rw   r   rP   r   r[   r   r   r\   )	r]   r^   ro   rp   r   Zaccess_listru   Zskipped_take_listZaccess_list_datarg   rg   rh   r   f  s.     zAllCollaborators.postNri   rg   rg   rg   rh   r   ]  s   r   c                   @   s   e Zd Zdd ZdS )LeaveCollaboratorc                 C   s   |j d}ztjj|j|d}W n"   t|dddtjd Y S X tj	|j
krht|dddtjdS |  t|dd	dtjdS )
Nr"   )r-   institute__idr(   r)   r*   r   zfYou can not leave your institute, you can delete this institute or transfer ownership to another user.rB   rC   )rE   rF   r   rM   rL   r   r   rN   dr__ROLE_OWNER__r%   HTTP_401_UNAUTHORIZEDr   r\   )r]   r^   r"   rD   rg   rg   rh   r     s      
zLeaveCollaborator.postNr|   rg   rg   rg   rh   r     s   r   c                   @   s   e Zd Zdd ZdS )EditInvitationc                 C   s
  |j d}|j d}ztjj|ddd}|j}W n"   t|dddtjd Y S X ztjj|j	|j
d	}|j}W n"   t|d
ddtjd Y S X t||st|d
ddtjdS t||st|d
ddtjdS ||_|j	|_|  t|dddtjdS )Nr   	new_rolesFr   r   r   r*   r   r,   r(   r)   rB   rC   )rE   rF   r   rM   r%   r   r   r   r   rL   r.   rN   rR   rS   r4   r   r\   )r]   r^   r   r   rd   r_   r   r   rg   rg   rh   r     s6      
 
zEditInvitation.postNr|   rg   rg   rg   rh   r     s   r   c                   @   s   e Zd Zdd ZdS )EditCollaboratorc                 C   s   |j d}|j d}ztjj|d}|j}W n"   t|dddtjd Y S X ztjj|j|j	d}|j}W n"   t|d	d
dtj
d Y S X t||st|d	d
dtj
dS t||st|d	d
dtj
dS ||_|  t|dddtjdS )Nr   r   r   r   r   r*   r   r,   r(   r)   rB   rC   )rE   rF   r   rM   r%   r   r   r   rL   r.   rN   rR   rS   r   r\   )r]   r^   r   r   Zaccess_recordr_   r   r   rg   rg   rh   r     s,    
 
zEditCollaborator.postNr|   rg   rg   rg   rh   r     s   r   N)Jdatetimer   django.db.modelsr   django.utilsr   rest_frameworkr   rest_framework.viewsr   django.utils.decoratorsr   r	   authenticate.attemp_recaptchar
   r   authenticate.middlewarer   Zcollaborators.serializersr   r   r   Zutils.pushersr   r   r   wikiazma.middlewarer   utils.myresponser   Zutils.limitationsr   authenticate.modelsr   r   r   r   r   rZ   r   rR   institute.modelsr   Zcollaborators.modelsr   r   Zcollaborators.middlewarer    serializer_validation_middlewareIuser_token_or_server_token_or_server_API_key_validation_and_authorizationZ"check_access_permission_middlewareZInviteInputSerializerr!   ZListInvitationInputSerializer!__PERMISSION_READ_COLLABORATORS__rn   ZListMyInvitationInputSerializerr}   ZAcceptInvitationInputSerializerr~   ZRejectInvitationInputSerializerr   ZRemoveInvitationInputSerializerr   ZRemoveAccessInputSerializerr   ZAllCollaboratorsInputSerializerr   Z LeaveCollaboratorInputSerializerr   ZEditInvitationInputSerializerr   ZEditCollaboratorInputSerializerr   rg   rg   rg   rh   <module>   s   
}


*


 


"
