o
    gk                     @   s  d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZ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 d d
lmZ ddlmZ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$m%Z%m&Z& d dl'm(Z( e Zd dl)Z)d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl*m2Z2 d dlm3Z3 d dl4m5Z5 d dl6m7Z7 d dl.m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z> d dl?Z?d dl@mAZA d dlBmCZC d dlDmEZE d d l9mFZF d d!lGmHZH d d"lImJZJ e+d# ZKd$d% ZLd&d' ZMd(d) ZNG d*d+ d+eZOG d,d- d-eZPG d.d/ d/eZQG d0d1 d1eZRG d2d3 d3eZSG d4d5 d5eZTG d6d7 d7eZUG d8d9 d9eZVG d:d; d;eZWG d<d= d=ejXZYG d>d? d?ejXZZG d@dA dAeZ[G dBdC dCeZ\G dDdE dEeZ]dS )F    )Responsestatus)APIView)UserRegistrationSerializerUserLoginSerializerUserChangePasswordSerializer SendPasswordResetEmailSerializerUserPasswordResetSerializerUserTypeSerializerUserDetailSerializersend_verification_email)UserRenderer)RefreshToken)TokenRefreshView)IsAuthenticated)generics)get_user_model   )UserusertypeCodeConfirmationEmailVerification)ValidationError)success_responsefailed_responsegenerate_random_text)JWTAuthenticationN)logger_settings)validate_email)validate_required_params)record)validation_msg)AllowAny)settings)render_to_stringis_emailrender)
strip_tags)EmailMultiAlternatives)urlsafe_base64_encode)default_token_generator)force_bytes)get_object_or_404)	timedelta)timezonemsgc                 C   s   t | }t|t|jdS )N)refreshaccess)r   for_userstraccess_token)userr3    r9   ;/var/www/html/authentication-server/authentication/views.pyget_tokens_for_user6   s   
r;   c                 C   
   t | dS )Nz
login.htmlr(   requestr9   r9   r:   
login_page=      
r?   c                 C   r<   )Nzregister.htmlr(   r=   r9   r9   r:   register_page@   r@   rA   c                   @      e Zd Zdd ZdS )CustomTokenRefreshViewc              
   O   sn   |j d}zt|}|j}tdt|itjdW S  ty6 } ztdt|itj	dW  Y d }~S d }~ww )Nr3   r4   r   detail)
datagetr   r7   r   r6   r   HTTP_200_OK	ExceptionHTTP_400_BAD_REQUEST)selfr>   argskwargsrefresh_tokenr3   new_access_tokener9   r9   r:   postD   s   "zCustomTokenRefreshView.postN__name__
__module____qualname__rP   r9   r9   r9   r:   rC   C       rC   c                   @   rB   )UserRegistrationViewc           
   
   O   s   t d}z;t|jd}| r7| }t d}t tdd }tj	j
|||d t|j| tdtjdW S t|jtjdW S  tyZ }	 ztt|	tjdW  Y d }	~	S d }	~	ww )N   rE      minutesr8   code
expires_atzGRegistration successful. Please check your email for verification code.r2   r]   )r   r   rE   is_validsaver1   nowr0   r   objectscreater   emailr   r   HTTP_201_CREATEDr   errorsrI   rH   r6   HTTP_500_INTERNAL_SERVER_ERROR)
rJ   r>   rK   rL   process_code
serializerr8   verification_coder^   rO   r9   r9   r:   rP   N   s8   zUserRegistrationView.postNrQ   r9   r9   r9   r:   rV   M   rU   rV   c                   @   rB   )VerifyEmailViewc                 C   s   |j d}|j d}z:tjj|d}tjj||dt d }|s,t	dt
jdW S d|_t |_|  d|_|  td	t
jdW S  tjyW   t	d
t
jd Y S w )Nre   r]   re   F)r8   r]   is_usedexpires_at__gtz$Invalid or expired verification coder_   Tz/Email verified successfully. You can now login.User not found)rE   rF   r   rc   r   filterr1   rb   firstr   r   rI   	is_activeemail_verified_atra   rn   r   rG   DoesNotExistHTTP_404_NOT_FOUND)rJ   r>   re   rk   r8   verificationr9   r9   r:   rP   s   s@   

zVerifyEmailView.postNrQ   r9   r9   r9   r:   rl   r   rU   rl   c                   @   rB   )ResendVerificationCodeViewc                 C   s   |j d}zAtjj|d}|jrtdtjdW S td}t	
 tdd }tjj|djd	d
 tjj|||d t|j| tdtjdW S  tjyX   tdtjd Y S w )Nre   rm   zEmail is already verifiedr_   rW   rY   rZ   )r8   T)rn   r\   z4New verification code sent. Please check your email.rp   )rE   rF   r   rc   rs   r   r   rI   r   r1   rb   r0   r   rq   updaterd   r   re   r   rG   ru   rv   )rJ   r>   re   r8   rk   r^   r9   r9   r:   rP      s6   
zResendVerificationCodeView.postNrQ   r9   r9   r9   r:   rx      rU   rx   c                   @      e Zd ZdddZdS )UserLoginViewNc              
   C   sT  t d}td| dtd  d zt|jd}|jddrtd| dtd	   |jd
}|jd}|jd}d }|rbtjj	|d
 }|satd| dtd   ttd tjdW S n#|rtjj	|d
 }|std| dtd   ttd tjdW S |r||std| dtd   ttd tjdW S |jstdtjdW S t|}	td| dtd  d td|	iddW S td| d|j  t|jtjdW S  ty }
 ztd| dt|
 d tt|
tjdW  Y d }
~
S d }
~
w ty) }
 ztd| dt|
 d tdtjdW  Y d }
~
S d }
~
ww )NrW   info: startedz - User Login StartedrX   Traise_exception	validatedusernamere   passwordrm   warninvalid_emailr_   r   invalid_usernamez+Please verify your email before logging in.main_processz - User login successfultokenzLogin Success)rE   r2   errorz - ValidationError occurredz - Unexpected error occurredzAn unexpected error occurred)r   r!   log_msgr   rE   r`   rF   r   rc   rq   rr   r"   r   r   rI   check_passwordrs   HTTP_403_FORBIDDENr;   r   rg   DjangoValidationErrorr6   rH   rh   )rJ   r>   formatri   rj   r   re   r   r8   r   rO   r9   r9   r:   rP   a  s   
zUserLoginView.postNrQ   r9   r9   r9   r:   r{   `      r{   c                   @   s"   e Zd ZegZegZdddZdS )UserChangePasswordViewNc              
   C   s   t d}td| dtd  d z7t|jd|jid}|jdd	r5td| dtd
  d tddW S td| d|j d t	dt
jdW S  tys } ztd| dt| d t	dt| t
jdW  Y d }~S d }~ww )NrW   r|   r}   r~   z. - UserChangePasswordView POST request startedr8   rE   contextTr   	completedz  - Password changed successfullyzPassword Changed Successfullyr2   r   z+ - Validation errors during password changez1Validation errors occurred during password changer_   r   z3 - Unexpected error occurred during password changeAn unexpected error occurred: )r   r!   r   r   rE   r8   r`   r   rg   r   r   rI   rH   r6   rh   )rJ   r>   r   ri   rj   rO   r9   r9   r:   rP     sH   zUserChangePasswordView.postr   )rR   rS   rT   r   authentication_classesr   permission_classesrP   r9   r9   r9   r:   r     s    r   c                   @   s*   e Zd ZegZegZdddZdd ZdS )SendPasswordResetEmailViewNc              
   C   s0  t d}td| dtd  d z[t|jd}|jddrY|jd	 }tjj	|d
}t
|}tt|j}d| d| }	| ||	 td| dtd  d|  tddW S td| d|j d tdtjdW S  ty }
 ztd| dt|
 d tdt|
 tjdW  Y d }
~
S d }
~
ww )NrW   r|   r}   r~   z2 - SendPasswordResetEmailView POST request startedrX   Tr   re   rm   z/http://127.0.0.1:8000/user-auth/reset-password//r   z- - Password reset email sent successfully to z2Password Reset Link Sent. Please check your email.r   r   z8 - Validation errors during password reset email requestz>Validation errors occurred during password reset email requestr_   r   z. - Please try again with a valid email addressr   )r   r!   r   r	   rE   r`   validated_datar   rc   rF   r-   
make_tokenr,   r.   pksend_password_reset_emailr   rg   r   r   rI   rH   r6   rh   )rJ   r>   r   ri   rj   re   r8   r   uid
reset_linkrO   r9   r9   r:   rP     sP   

zSendPasswordResetEmailView.postc                 C   sR   d}t dd|i}t|}tjd}t||||g}||d |jdd d S )NzYour Password Reset Linkzpassword_reset.htmlr   
EMAIL_USERz	text/htmlF)fail_silently)r%   r*   osenvironrF   r+   attach_alternativesend)rJ   re   r   subjecthtml_messageplain_message
from_emailemail_messager9   r9   r:   r     s   z4SendPasswordResetEmailView.send_password_reset_emailr   )	rR   rS   rT   r   renderer_classesr#   r   rP   r   r9   r9   r9   r:   r     s
    
+r   c                   @   s   e Zd ZegZdddZdS )UserPasswordResetViewNc              
   C   s   t d}td| dtd  d zC|r|stdtjdW S t|j||dd	}|jd
drAtd| dtd  d t	ddW S td| d|j
 d tdtjdW S  ty } ztd| dt| d tdt| tjdW  Y d }~S d }~ww )NrW   r|   r}   r~   z- - UserPasswordResetView POST request startedz#Missing token or uid in the requestr_   )r   r   r   Tr   r   z - Password reset successfullyzPassword Reset Successfullyr   r   z2 - Validation errors during password reset requestz8Validation errors occurred during password reset requestr   z: - Unexpected error occurred during password reset requestr   )r   r!   r   r   r   rI   r
   rE   r`   r   rg   rH   r6   rh   )rJ   r>   r   r   r   ri   rj   rO   r9   r9   r:   rP   	  sR   zUserPasswordResetView.postr   )rR   rS   rT   r   r   rP   r9   r9   r9   r:   r     s    r   c                   @   rB   )
LogoutViewc              
   O   s   t d}td| dtd  d |jd}|s(td| d td	tjd
S zt|}|	  td| dtd  d tdtj
d
W S  typ } ztd| dt| d tdt| tjd
W  Y d }~S d }~ww )NrW   r|   r}   r~   z" - LogoutView POST request startedrM   r   z: Refresh token is missingzRefresh token is required.r_   r   z - Logout successfulzLogout successful.r   z* - Unexpected error occurred during logoutz#An internal server error occurred: )r   r!   r   rE   rF   r   r   rI   r   	blacklistrG   rH   r6   r   )rJ   r>   rK   rL   ri   rM   r   rO   r9   r9   r:   rP   7  s6   $zLogoutView.postNrQ   r9   r9   r9   r:   r   6  rU   r   c                   @   s    e Zd ZeZdd Zdd ZdS )UserTypeListViewc                 C   s2   t j }| jjdd }|d ur|j|d}|S )Nsubtyper   )r   rc   allr>   query_paramsrF   rq   )rJ   querysetr   r9   r9   r:   get_querysetU  s
   
zUserTypeListView.get_querysetc                 O   sn   t d}|  }| j|dd}| r(td| dtd  d t|jtj	dS td	| d
 t
dtjdS )NrW   Tmanyr|   r}   r   z" - User Types fetched successfullyr_   r   z+: No user types found for the given subtypez%No user types found for given subtype)r   r   get_serializerexistsr!   r   r   rE   r   rG   r   rI   )rJ   r>   rK   rL   ri   r   rj   r9   r9   r:   list\  s   zUserTypeListView.listN)rR   rS   rT   r   serializer_classr   r   r9   r9   r9   r:   r   R  s    r   c                   @   s   e Zd ZeZdd ZdS )UserTypeBySubtypeViewc                 C   sT   t d}tjj|d}| j|dd}td| dtd  d| d	 t|jt	j
d
S )NrW   r   Tr   r|   r}   r   z% - f"User types fetched for subtype: "r_   )r   r   rc   rq   r   r!   r   r   rE   r   rG   )rJ   r>   r   ri   
user_typesrj   r9   r9   r:   rF   m  s   zUserTypeBySubtypeView.getN)rR   rS   rT   r   r   rF   r9   r9   r9   r:   r   j  s    r   c                   @   s   e Zd Zdd Zdd ZdS )!CheckUniqueUsernameOrEmailAPIViewc           	   
   O   s$  t d}zc|j}d|v r@|d}| |r0tjj|d r/td| d t	dt
jdW S ntd| d t	d	t
jdW S d
|v rb|d
}tjj|d rbtd| d t	dt
jdW S tddW S  ty } ztd| dt|  t	dt| t
jdW  Y d }~S d }~ww )NrW   re   rm   r   z: Email is already registeredzEmail is already registered.r_   z: Invalid email formatzInvalid email format.r   r   z: Username is already takenzUsername is already taken.z&Both email and username are available.r   r   z: Unexpected error occurred: r   )r   rE   rF   r'   r   rc   rq   r   r!   r   r   rI   r   rH   r6   rh   )	rJ   r>   rK   rL   ri   rE   re   r   rO   r9   r9   r:   rP   w  s.   


$z&CheckUniqueUsernameOrEmailAPIView.postc                 C   s   t |S r   r&   )rJ   valuer9   r9   r:   r'     s   z*CheckUniqueUsernameOrEmailAPIView.is_emailN)rR   rS   rT   rP   r'   r9   r9   r9   r:   r   v  s    r   c                   @   rz   )UserCheckViewNc              	   C   s   t d}ztjj|d}td| d| d td|jdtjdW S  tj	yA   td	| d| d
 tdddtj
d Y S w )NrW   )idr|   z: User with ID z foundT)r   user_idr   r   z
 not foundFrp   )r   message)r   r   rc   rF   r!   r   r   r   rG   ru   rv   )rJ   r>   r   r   ri   r8   r9   r9   r:   rF     s   zUserCheckView.getr   )rR   rS   rT   rF   r9   r9   r9   r:   r     r   r   c                   @   s   e Zd ZegZdd ZdS )UserDetailViewc                 O   sB   t d}|jd}|st S tt|d}t|}t|jtjdS )NrW   re   rm   r   )	r   rE   rF   r   r/   r   r   r   rG   )rJ   r>   rK   rL   ri   re   r8   rj   r9   r9   r:   rP     s   zUserDetailView.postN)rR   rS   rT   r   r   rP   r9   r9   r9   r:   r     s    r   )^rest_framework.responser   rest_frameworkr   rest_framework.viewsr   authentication.serializersr   r   r   r	   r
   r   r   r   authentication.renderersr   rest_framework_simplejwt.tokensr   rest_framework_simplejwt.viewsr   rest_framework.permissionsr   r   django.contrib.authr   modelsr   r   r   r   django.core.exceptionsr   r   utils.exceptionutils.helperr   r   r   'rest_framework_simplejwt.authenticationr   re
utils.datar   django.core.validatorsr   utils.validationr    utils.loggerr!   r"   r#   django.confr$   django.template.loaderr%   r'   django.shortcutsr)   django.utils.htmlr*   django.core.mailr+   r   django.utils.httpr,   django.contrib.auth.tokensr-   django.utils.encodingr.   r/   datetimer0   django.utilsr1   r   r;   r?   rA   rC   rV   rl   rx   r{   r   r   r   r   ListAPIViewr   r   r   r   r   r9   r9   r9   r:   <module>   sp    (

%' HD)90