o
    Ci                     @   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 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 d dlmZmZ d dlm Z m!Z!m"Z"m#Z# d dl$m%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.Z.d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; e'j'<e%Z=e'j'<e%Z>e'j'< e'j?dd Z@e+ dd ZAG dd  d eZBG d!d" d"eZCG d#d$ d$eZDG d%d& d&eZEG d'd( d(eZFG d)d* d*eZGG d+d, d,eZHG d-d. d.eZIG d/d0 d0eZJG d1d2 d2eZKG d3d4 d4eZLG d5d6 d6eZMG d7d8 d8eZNd dlOZOd dlPZPd dlQZQd d9lmRZR G d:d; d;eZSd d<lTmUZU d d=lVm<Z< d d>l'm?Z? d d?lTmUZUmWZWmXZX eUd@geWg eXg dAdB ZYG dCdD dDeZZG dEdF dFeZ[dS )G    )APIView)transaction)csrf_exempt)models)get_random_string)render_to_string)settings)Responsestatus)	send_mail)authenticatelogin)serializers)AccessTokenRefreshToken)make_passwordcheck_password)get_access_tokentoken_functionapp_login_check
app_create)utcN)swagger_auto_schema)protected_resource)JsonResponseceil)CustomPaginator)timezone)require_permissionCustomIsAuthenticated)method_decorator)OAuth2Authentication   )daysc                 C   s:   | j }t|j|j|j|jt|dr|jjdS ddS )Nrolestandard_user)usernameemail
first_name	last_namer&   )	resource_ownerr   r(   r)   r*   r+   hasattrr&   name)requestuser r1   +/var/www/Datamplify/authentication/views.pyuser_info_view&   s   r3   c                   @   s:   e Zd Zg Zg ZejZeejde	
 edd ZdS )SignUprequest_bodyc              
   C   s@  | j |jd}|jddr|jd }|jd }|jd }zLtdd}ttj}d	}t	d
d}	|	||||d}
t
d|
}d}d}tj}| g}t|||||d tjjj|||dd}tjjj|||	|d W n ty } zt| tdditjdW  Y d }~S d }~ww d| |d}t|tjdS tdditjdS )NdataTraise_exceptionr(   r)   password@   lengthz authentication/email-activation/i'  i )Gotpapi	unique_idcurrent_siter(   zregistration.htmlzHello, welcome to our website!z*Welcome to Datamplify: Verify your account)html_messageF)r(   r;   r)   	is_active)r0   keyotpr)   messagez
SMTP Errorr
   zAccount Activation Email Sent)rG   r)   emailActivationTokenSerializer Value Error)serializer_classr8   is_validvalidated_datar   strr   Link_urlrandomrandintr   EMAIL_HOST_USERlowerr   auth_modelsUserProfileobjectscreate_userAccount_Activationcreate	Exceptionprintr	   r   HTTP_400_BAD_REQUESTHTTP_201_CREATED)selfr/   
serializerur)   pwdrA   rB   r@   r?   contextrC   rG   subject
from_emailto_emailadtber8   r1   r1   r2   post5   s<   






zSignUp.postN)__name__
__module____qualname__authentication_classespermission_classesr   RegisterSerializerrJ   r   r   atomicr   rg   r1   r1   r1   r2   r4   1   s    
r4   c                   @   s8   e Zd Zg Zg ZejZeejde	e
jdd ZdS )AccountActivater5   c           
      C   s@  z
t jjj|d}W n   tdditjd Y S |jtj	t
kr| j|jd}|jddr|jj}|j}|jd }tt|d	k rLtdd
itjdS ||krt jjj|d}t jjj|d  t jjjdd}|}	d|	_d|	_|	  |	j| tdditjdS tdditjdS tdditj dS tdditjdS )NrE   rG   zInvalid Token in URLr
   r7   Tr9   rF      zOTP field cannot be emptyidr0   Adminr.   zAccount successfully activatedzIncorrect OTP, Please try againz	Enter OTPzActivation Token/ OTP Expired)!rS   rW   rU   getr	   r   HTTP_404_NOT_FOUNDexpiry_datedatetimenowr   rJ   r8   rK   r0   rs   rF   rL   lenrM   HTTP_406_NOT_ACCEPTABLErT   filterdeleteRolerD   is_superusersaverolesaddHTTP_200_OKHTTP_401_UNAUTHORIZEDr[   )
r]   r/   tokenr^   u_id	otp_validrF   	token_obj
admin_roler0   r1   r1   r2   rg   ^   s2   
zAccountActivate.postN)rh   ri   rj   rk   rl   r   ActivationSerializerrJ   r   r   r   rn   rg   r1   r1   r1   r2   ro   Z   s    
ro   c                   @   s2   e Zd Zg Zg ZejZeejde	dd Z
dS )Loginr5   c                 C   s  dd l }|  }| j|jd}|jddr|jd }|jd }zdd l }tjjj|d}W n t	yH } zt
dd	itjd
W  Y d }~S d }~ww |jdu rWt
dditjd
S zt||d}	W n t	yz } zt
dditjd
W  Y d }~S d }~ww |	d urt|}
ttjjj|	jd jddd}|
d dkr|
d |j|j|j|j|j|j|j|jr|jjnd t|d
}t
|tjd
S t
|
|
d d
S t
dditjd
S t
dditjd
S )Nr   r7   Tr9   r)   r;   email__iexactrG   z9You do not have an account, Please SIGNUP with Datamplifyr
   Fz5Account is in In-Active, please Activate your account)r)   r;   zIncorrect Passwordroles__usersrs   flatr      access_token)
accessTokenr(   r)   r*   r+   rD   
created_atzis Super user
created_bypermissionszIncorrect passwordzEnter Email and Password) timerJ   r8   rK   rL   rS   rT   rU   rw   rY   r	   r   r   rD   r}   r   r   list
Permissionr~   rs   distinctvalues_listr(   r)   r*   r+   r   r   r   r   r[   )r]   r/   r   startr^   r)   r;   r8   rf   r0   r   r   r1   r1   r2   rg      s\   



,z
Login.postN)rh   ri   rj   rk   rl   r   LoginSerializerrJ   r   r   rg   r1   r1   r1   r2   r      s    
r   c                   @   "   e Zd Zg Zg ZejZdd ZdS )ForgotPasswordViewc              
   C   sP  | j |jd}|jddr|jd }tjjj|d rn	t	ddit
jdS tjjj|d}|j}tjjj|d	  zDtd
d}ttj}tjjj||td d}d}	|j|	||d}
td|
}t|d|j||	|tj|g|d d|d}t	|t
jdW S  ty } zt| t	ddit
jdW  Y d }~S d }~ww t	ddit
jdS )Nr7   Tr9   r)   r   rG   z8You do not have an account, Please SIGNUP with Analytifyr
   rt       r=   )r0   rE   r   z$Datamplify Reset Password Assistancezauthentication/reset-password/)r(   r@   reset_tokenrB   zreset_password.htmlzHi {}, 

There was a request to change your password! 

If you did not make this request then please ignore this email. 

Your password reset link 
 {}{}{}rb   rG   rc   recipient_listrC   zPassword reset email sent)rG   Passwordresettoken
SMTP errorrI   ) rJ   r8   rK   rL   rS   rT   rU   r~   existsr	   r   rx   rw   rs   Reset_Passwordr   r   rM   r   rN   rX   r   r(   r   r   formatrQ   r   rY   rZ   r   r[   )r]   r/   r^   r)   r.   r   rA   rB   rb   r@   ra   rC   r8   rf   r1   r1   r2   rg      sD   



zForgotPasswordView.postN)	rh   ri   rj   rk   rl   r   ForgetPasswordSerializerrJ   rg   r1   r1   r1   r2   r     
    r   c                   @   r   )ConfirmPasswordViewc                 C   s  z
t jjj|d}W n   tdditjd Y S | j|jd}|j	ddr|j
}t jjj|d}|j}|jd	 }|jd
 }d}	t|	|}
|
sSddi}t|tjdS ||kr`tdditjdS 	 zntj  }tjt|d}|d }tj  }t|dd }|j||dd}td|}d}t|d|j||tj |g|d t jjj!|dj"t#|tj d t jjj!|j$d%  tdditj&dW S    tdditjd Y S tdditj'dS )Nrp   rG   zToken Doesn't Existsr
   r7   Tr9   rr   r;   confirmPasswordzF^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@#$!%*?&])[A-Za-z\d@#$!%*?&]{8,}$zPassword is invalid.Min 8 character. Password must contain at least :one small alphabet one capital alphabet one special character 
numeric digit.zPasssword did not matchedz%Y-%m-%dz%d %b %Y.r   z*http://202.65.155.119/authentication/login)r(   dater   	login_urlzreset_password_success.htmlz%Password change alert AcknowledgementzHi {}, 
You have successfully changed your Analytify Login password on {} at {} . Do not share with anyone..
Do not disclose any confidential information such as Username, Password, OTP etc. to anyone.

Best regards,
The Analytify Teamr   )r;   
updated_atrt   z+Password changed Successfully, Please Loginr   zPassword Fields didn't Match)(rS   r   rU   rw   r	   r   rx   rJ   r8   rK   r0   rT   r)   rL   refindallr}   r   rz   r{   r   strptimerM   strftimeupperr   splitr(   r   r   r   r   rQ   r~   updater   rs   r   r   r[   )r]   r/   r   r^   r.   user)   r`   cnfpwdpatternrr8   date_stringdate_objr   time_stringr   ra   rC   rb   r1   r1   r2   putP  sT   


$zConfirmPasswordView.putN)	rh   ri   rj   rk   rl   r   ConfirmPasswordSerializerrJ   r   r1   r1   r1   r2   r   K  r   r   c                   @   sH   e Zd ZegZegZejZ	e
edeejdeejdd ZdS )
InviteUserzuser.creater5   c                 C   s  t |}|d dkrtd|d itjdS tjjj|d d}|js4|j	j
dd s4tdd	itjdS | j|jd
}|jddr|jd }|jd }|jdd}|jd }|jdd}	tjjj
|d rqtdditjdS tjjj
|dt d }
|
rtdditjdS tdd}tj d| }tjjj||||||d d}td||j|j|d}|	st|dtj|g|d td|d tj dS t|j!tjdS )!Nr   r   rG   r
   user_idrr   ru   rv   zOnly Admins can invite usersr7   Tr9   r)   r&    r(   generate_linkFr)   zUser already exists)r)   is_usedexpires_at__gtz.An active invite already exists for this emailr<   r=   z/authentication/set-password/)r)   r(   r&   
invited_byr   rG   z#You have been invited to Datamplifyzinvite_user.html)invite_linkr   r&   rG   r   zInvite sent successfully)rG   r   )"r   r	   r   r   rS   rT   rU   rw   r   r   r~   r   HTTP_403_FORBIDDENrJ   r8   rK   rL   HTTP_409_CONFLICT
UserInviter   r{   firstr[   r   r   rN   rX   r   r(   r.   r   rQ   r\   errors)r]   r/   tokr0   r^   r)   r&   rG   r(   r   existing_inviter   r   rb   rC   r1   r1   r2   rg     sZ   



	zInviteUser.postN)rh   ri   rj   r#   rk   r!   rl   r   UserInviteSerializerrJ   r"   r    r   r   r   rn   rg   r1   r1   r1   r2   r     s    

r   c                   @   s(   e Zd Zg Zg Zeejddd ZdS )SetPasswordr5   c                 C   s$  t jjj|d }|stdditjdS |jr!tdditjdS |	 r.tdditjdS t j
jj|jd rBtdditjdS tj|jd	}| r|jd
 }|jd }||krdtdditjdS t j
jj|j|j|d|jd}|j|j d|_|  tdditjdS t|jtjdS )N)r   rG   zInvalid invitation linkr
   z&This invite link has already been usedzThis invite link has expiredr   z&Account with this email already existsr7   r;   r   z*Password and Confirm Password Should matchT)r)   r(   r;   rD   r   zAccount activated successfully)rS   r   rU   r~   r   r	   r   r[   r   
is_expiredrT   r)   r   r   r   r   r8   rK   rL   rV   r(   r   r   r   r&   r   r\   r   )r]   r/   r   inviter^   r;   r   r0   r1   r1   r2   rg     s6   

zSetPassword.postN)	rh   ri   rj   rk   rl   r   r   r   rg   r1   r1   r1   r2   r     s
    
r   c                   @   s<   e Zd ZdZegZegZee	de
e dd ZdS )	UsersListzY
    List all users invited by the logged-in Admin with pagination and status filter
    z	user.viewc                 C   s  |j j}ddlm} t }t|j|jd}t|j|j	|j
}t||j}|jdd}tjjj|d}tjjj||d}	|	 }
||
| }|	d|d | ||  }tjjj|jd	d
dddd	d}dd |D }tj|d
d|id}t|j||
||dtjdS )Nr   r      searchr   rr   )r   username__icontainsz-created_atr)   Tr   )	email__inrs   r(   c                 S   s   i | ]}|j |qS r1   r   ).0r_   r1   r1   r2   
<dictcomp>  s    z!UsersList.get.<locals>.<dictcomp>user_map)manyra   )r8   total_pagestotal_recordspage_number	page_sizer
   )r0   rs   mathr   r   intquery_paramsrw   page_query_parampage_size_query_paramr   minmax_page_sizerS   rT   rU   r   r~   countorder_byr   onlyr   InvitedUserStatusSerializerr	   r8   r   r   )r]   r/   r   r   	paginatorr   r   r   
admin_user
invites_qsr   r   invitesuser_profilesr   r^   r1   r1   r2   rw      s8   
zUsersList.getN)rh   ri   rj   __doc__r#   rk   r!   rl   r"   r    r   r   rn   rw   r1   r1   r1   r2   r     s    
r   c                   @   sJ   e Zd ZegZegZejZ	e
edeejdee dd ZdS )EditUserz	user.editr5   c           	      C   s  |j j}tjjj|d}|js!|jjdd	 s!t
dditjdS | j|jd}|jdd	r|jd
 }|jd}ztjjj|d}t| W n tjjy[   t
dditjd Y S w tjjj|j|d	 st|jstt
dditjdS |rz%tjjj|jd}tjjj|d}|j  |j| ||_|  W n tjjy   t
dditjd Y S w |  t
dt|jdtjdS t
|jtjdS )Nrr   ru   rv   rG   zOnly Admins can edit usersr
   r7   Tr9   r   role_idUser not found)r)   r   z(You cannot edit a user you didn't inviter   Invalid Role IDUser updated successfullyrG   r   )r0   rs   rS   rT   rU   rw   r   r   r~   r   r	   r   r   rJ   r8   rK   rL   rZ   DoesNotExistrx   r   r)   r   clearr   r&   r   rM   r   r   r[   )	r]   r/   r   r   r^   r   r0   user_inviter&   r1   r1   r2   r   /  sB   

zEditUser.putN)rh   ri   rj   r#   rk   r!   rl   r   UserEditSerializerrJ   r"   r    r   r   r   rn   r   r1   r1   r1   r2   r   +  s    

r   c                   @   sD   e Zd ZegZegZeede	e
jdee dd ZdS )DeleteInviteUserzuser.deleter5   c           	   
   C   s   |j }|j}|g}t|dr|jr||jj z
tjjj|d}W n t	y= } zt
dditjdW  Y d }~S d }~ww |jrYtjjj|jd }|  t
dditjdS |  t
dditjdS )Nr   rr   rG   zUser Not Foundr
   r   zUser Deleted sucessfully)r0   rs   r-   r   appendrS   r   rU   rw   rY   r	   r   rx   r   rT   r)   r   r   )	r]   r/   rs   r0   r   accessible_user_idsr   rf   	user_datar1   r1   r2   r   i  s"   zDeleteInviteUser.deleteN)rh   ri   rj   r#   rk   r!   rl   r"   r    r   r   r   r   r   rn   r   r1   r1   r1   r2   r   f  s    

r   c                   @   s>   e Zd ZegZegZejZ	e
ejdee dd ZdS )Get_previlagesr5   c                 C   s.   t jj }tj|dd}td|jitj	dS )NT)r   r8   r
   )
rS   r   rU   allr   previlage_serializerr	   r8   r   r   )r]   r/   r   r^   r1   r1   r2   rw     s   zGet_previlages.getN)rh   ri   rj   r#   rk   r!   rl   r   r  rJ   r   r   r   rn   rw   r1   r1   r1   r2   r    s    
r  c                   @   s   e Zd Zg Zg Zdd ZdS )user_deletec                 C   s    t jjj|d  tddiS )Nr   rG   zdeleted Succesfully)rS   rT   rU   rw   r   r	   )r]   r/   r)   r1   r1   r2   r     s   zuser_delete.deleteN)rh   ri   rj   rk   rl   r   r1   r1   r1   r2   r    s    r  c                   @   s(   e Zd Zg Zg Zee dd ZdS )Activateoldusersc                 C   s   zt jjj|d}t| W n t jjy"   tdditjd Y S w zt j	jjdd}|j
  |j
| W n t j	jyL   tdditjd Y S w d|_|  tdt|jd	tjdS )
Nrr   rG   r   r
   r$   r   Tr   r   )rS   rT   rU   rw   rZ   r   r	   r   rx   r   r   r   r   r   r   rM   rs   r   )r]   r/   r   r0   r&   r1   r1   r2   r     s&   
zActivateoldusers.putN)	rh   ri   rj   rk   rl   r   r   rn   r   r1   r1   r1   r2   r    s    r  )Applicationc                   @   s8   e Zd ZegZegZdd Zdd Zdd Z	dd Z
d	S )
RegisterApplicationc                 C   s8  |j }|jd}|jdg }|jdd}tjj|d}| }|dkr.tddid	d
S |j|d r>tddidd
S |sHtddidd
S |	 dkrRtj
}ntj}d}d}	d }
|	|k rt|||j|\}}|tj
krtt||}
nd}
|
dkr{n|	d7 }	|	|k s_|
dkrtdditjd
S t||||ddgdS )Nr.   redirect_uristypeclient-credentialsr   
   rG   zlimit exceededi  r
   rv   zname existsi  errorzInvalid data  authorization-code   r   r   r   zFailed to create an appreadwrite)	client_idclient_secretr  grant_typesscopes)r0   r8   rw   r	  rU   r~   r   r	   r   rR   GRANT_AUTHORIZATION_CODEGRANT_CLIENT_CREDENTIALSr   rs   r   r   r   )r]   r/   r0   r.   r  r  apps
apps_countMAX_RETRIESattempts
app_statusr  r  r1   r1   r2   rg   D  sH   

zRegisterApplication.postc                 C   s   |j }|jdd }tjj|d}|r7| dkr!|jtjd}n| dkr/|jtjd}nt	ddidd	S |
d
dddd}t	dt|itjd	S )Nr  r  r  )authorization_grant_typer  r  zInvalid type parameterr  r
   r  r.   r  r!  createdr8   )r0   r   rw   r	  rU   r~   rR   r  r  r	   valuesr   r   r   )r]   r/   r   grant_type_param
apps_queryr  r1   r1   r2   rw   n  s"   
zRegisterApplication.getc                 C   sZ   |j }|stddiddS tjj||d }|s!tddiddS |  tdd	id
dS )Nr  zclient_id is requiredr  r
   r   r  rG   Application not found  z Application deleted successfullyr   )r0   r	   r	  rU   r~   r   r   )r]   r/   r  r   appr1   r1   r2   r     s   zRegisterApplication.deletec                 C   s   |j }|jd}td}|stddiddS tjj||d	 }|s,tdd	id
dS ||_
|jdgd td||dddS )Nr  r   r  z client_id  requiredr  r
   r&  rG   r'  r(  r  )update_fieldsz"Client secret updated successfully)rG   r  r  r   )r0   r8   rw   secretstoken_urlsafer	   r	  rU   r~   r   r  r   )r]   r/   r   r  
new_secretr)  r1   r1   r2   r     s(   
zRegisterApplication.putN)rh   ri   rj   r#   rk   r!   rl   rg   rw   r   r   r1   r1   r1   r2   r
  @  s    *r
  )api_view)r{   )	timedelta)r.  rk   rl   POSTc           	      C   s
  dt jd< | jd}| jd}| jd}|s"tdditjdS d	}d|d
}tj||||fddidd}z|	 }W n t
yQ   td|jdtjd Y S w |jdkratd|dtjdS t t|d d }t|d |d||d |d |ddtjdS )z7
    Exchange refresh_token for a new access_token
    1OAUTHLIB_INSECURE_TRANSPORTrefresh_tokenr  r  r  zrefresh_token is requiredr
   z5http://127.0.0.1:8000/v1/authentication/oauth2/token/)
grant_typer3  zContent-Typez!application/x-www-form-urlencoded   )r8   authheaderstimeoutzInvalid token response)rG   rawr   zToken refresh failed)rG   details
expires_in)secondsr   
token_typescope)r   r3  r;  r=  r>  )osenvironr8   rw   r	   r   r[   requestsrg   jsonrY   textHTTP_502_BAD_GATEWAYstatus_coder{   r/  r   )	r/   r3  r  r  	token_urlr8   responsetoken_response
expires_atr1   r1   r2   refresh_access_token  s\   




rJ  c                   @   s   e Zd ZegZg Zdd ZdS )validate_oauth_clientc                 C   s   |j d}|j d}|j d}t|||gs"tdditjdS ztjj|||jj	d}W n tj
yB   tdditjd Y S w t||jsRtdd	itjdS t|j|jd
tjdS )zn
    Validates client_id, client_secret and app_name
    Returns app_name and authorization_type if valid
    r  r  app_namerG   z2client_id, client_secret and app_name are requiredr
   )r  r.   r   zInvalid client or app namezInvalid client secret)rL  r  )r8   rw   r  r	   r   r[   r	  rU   r0   rs   r   r   r   r  r.   r!  r   )r]   r/   r  r  rL  r)  r1   r1   r2   rg     s>   

zvalidate_oauth_client.postN)rh   ri   rj   r#   rk   rl   rg   r1   r1   r1   r2   rK    s    rK  c                   @   s    e Zd ZegZegZdd ZdS )User_detailsc                 C   s<   |j j}ttjjj|d jddd}t	d|it
jdS )Nr   rs   Tr   
privilegesr
   )r0   rs   r   rS   r   rU   r~   r   r   r	   r   r   )r]   r/   r   r   r1   r1   r2   rw   3  s   zUser_details.getN)rh   ri   rj   r#   rk   r!   rl   rw   r1   r1   r1   r2   rM  /  s    rM  )\rest_framework.viewsr   	django.dbr   django.views.decorators.csrfr   authenticationr   rS   django.utils.cryptor   django.template.loaderr   
Datamplifyr   rest_framework.responser	   rest_frameworkr   django.core.mailr   django.contrib.authr   r   r   oauth2_provider.modelsr   r   django.contrib.auth.hashersr   r   authentication.utilsr   r   r   r   pytzr   rO   rz   drf_yasg.utilsr   oauth2_provider.decoratorsr   django.httpr   r   r   r   Service.utilsr   django.utilsr   authentication.permissionsr    r!   django.utils.decoratorsr"   &oauth2_provider.contrib.rest_frameworkr#   r{   r   r   r/  
expired_atr3   r4   ro   r   r   r   r   r   r   r   r   r  r  r  r+  r?  rA  r	  r
  rest_framework.decoratorsr.  django.utils.timezonerk   rl   rJ  rK  rM  r1   r1   r1   r2   <module>   sv    

)- 08F/3;;d-oF1