o
    	èFhî@  ã                   @   sÀ  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
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 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 Z d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl'Z'd dl(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d„ Z.G d d!„ d!eƒZ/G d"d#„ d#eƒZ0G d$d%„ d%eƒZ1G d&d'„ d'eƒZ2G d(d)„ d)eƒZ3G d*d+„ d+eƒZ4G d,d-„ d-eƒZ5dS ).é    ©Ústatus)ÚAPIViewÚexception_handler)ÚResponse)ÚTokené   )Ú
CustomUserÚOTP)ÚCustomUserSerializerÚOTPSerializer)Úget_object_or_404)Útimezone)Úauthenticate)Ú	timedelta)ÚAccessToken)ÚAuthenticationFailedÚNotAuthenticated)ÚJWTAuthentication)ÚIsAuthenticatedN)Ú	send_mail)Úreverse)Úsettingsc                   @   ó   e Zd ZdZdd„ ZdS )ÚAdminLoginAPIViewz?
    View to authenticate admin users and return JWT Token
    c           	   
   O   s´   |j  d¡}|j  d¡}z+t||d�}|d ur-|jr-t |¡}tddt|ƒdœtj	d�W S tdd	d
œtj
d�W S  tyY } ztddt|ƒt ¡ dœtjd�W  Y d }~S d }~ww )NÚmobile_numberÚpassword)r   r   r   zLogin successful)r   ÚmessageÚtokenr   r   z+Invalid credentials or user is not an admin©r   r   zAn unexpected error occured)r   r   ÚexcÚ	traceback)ÚdataÚgetr   Úis_staffr   Úfor_userr   Ústrr   ÚHTTP_200_OKÚHTTP_401_UNAUTHORIZEDÚ	Exceptionr!   Ú
format_excÚHTTP_400_BAD_REQUEST)	ÚselfÚrequestÚargsÚkwargsr   r   Úuserr   Úe© r2   ú$/var/www/html/loop/accounts/views.pyÚpost   s.   
þþûþ€ÿzAdminLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   r2   r2   r2   r3   r      ó    r   c                   @   r   )ÚUserLoginViewz;
    View for user login (also used for registration).
    c                 C   sb   |j  d¡}tjj|d�\}}tjj|d� ¡  t 	dd¡}tjj
||d� tdd|d	œtjd
�S )Nr   ©r   ©r0   iè  i'  )r0   Úotp_coder   zOTP sent successfully!)r   r   Úotpr   )r"   r#   r	   ÚobjectsÚget_or_creater
   ÚfilterÚdeleteÚrandomÚrandintÚcreater   r   r'   )r,   r-   r   r0   Úcreatedr>   r2   r2   r3   r4   <   s   
þzUserLoginView.postNr5   r2   r2   r2   r3   r;   7   r:   r;   c                   @   r   )ÚOTPVerificationViewz$
    View for OTP verification.
    c              
   C   sè   zW|j  d¡}|j  d¡}t ¡ tdd� }tjj|||d� d¡ 	¡ }|rMt
t|d�}tjj|d�\}}|j }	| ¡  td	d
|j|	|jdœtjd�W S tdddœtjd�W S  tys }
 ztdddœtjd�W  Y d }
~
S d }
~
ww )Nr   r>   é   )Úminutes)Úuser__mobile_numberr>   Úcreated_at__gtez-created_atr<   r=   r   zOTP verified successfully!)r   r   r   Únew_userÚis_verifiedr   r   zInvalid or expired OTP.r   úAn unexpected error occurred.)r"   r#   r   Únowr   r
   r@   rB   Úorder_byÚfirstr   r	   r   rA   Ú
first_namerC   r   ÚkeyrN   r   r'   r)   r+   )r,   r-   r   r>   Útwo_minutes_agor?   r0   r   rG   rM   r1   r2   r2   r3   r4   P   sJ   ýù
ûøþþ€ÿzOTPVerificationView.postNr5   r2   r2   r2   r3   rH   K   r:   rH   c                   @   r   )ÚUserIsVerifiedViewz0
    View to check if the user is verified.
    c              
   C   s¼   |j  d¡ ¡ d }z tjj|d�}|j}|jrdddœ}ndddœ}t|tj	d�W S  tj
y@   dd	dœ}t|tjd� Y S  ty] } zdd
dœ}t|tjd�W  Y d }~S d }~ww )NÚHTTP_AUTHORIZATIONr   ©rT   zUser is verified.r   r   zUser is not verifiedr   úInvalid or expired token.rO   )ÚMETAr#   Úsplitr   r@   r0   rN   r   r   r'   ÚDoesNotExistr(   r)   r+   )r,   r-   Ú	token_keyr   r0   Úresponse_datar1   r2   r2   r3   r#   �   s    


€þzUserIsVerifiedView.getN©r6   r7   r8   r9   r#   r2   r2   r2   r3   rV   |   r:   rV   c                   @   r   )ÚUserUpdateViewz*
    View to update user information.
    c              
   C   sà   |j  d¡ ¡ d }z4tjj|d�}|j}t||jdd�}| ¡ r2| 	¡  t
dd|jdœtjd�W S t
d	d
|jdœtjd�W S  tjyR   t
d	ddœtjd� Y S  tyo } zd	ddœ}t
|tjd�W  Y d }~S d }~ww )NrW   r   rX   T©r"   Úpartialz&User information updated successfully.©r   r   r"   r   r   zInvalid data.©r   r   Úerrorsú Bad request: Token is not valid.r   rO   )rZ   r#   r[   r   r@   r0   r   r"   Úis_validÚsaver   r   r'   re   r\   r(   r)   r+   )r,   r-   r]   r   r0   Ú
serializerr1   r^   r2   r2   r3   Úpatch™   s>   ýú	ýú
þ
€þzUserUpdateView.patchN)r6   r7   r8   r9   rj   r2   r2   r2   r3   r`   ”   r:   r`   c                 C   s(   t | |ƒ}t| tƒrdddœ|_|S d S )Nr   rY   r   )r   Ú
isinstancer   r"   )r    ÚcontextÚresponser2   r2   r3   Úcustom_exception_handler¿   s   

þûrn   c                   @   ó$   e Zd ZdZegZegZdd„ ZdS )ÚUserListViewz5
    View to list users with optional filtering.
    c              
   C   sx   z|j }tjjd
i |¤Ž}t|dd�}tdd|j dœtjd�W S  ty; } ztddd	œtj	d�W  Y d }~S d }~ww )NT)Úmanyr   zUsers retrieved successfullyrc   r   r   úAn unexpected error occurredr   r2   )
r"   r	   r@   rB   r   r   r   r'   r)   ÚHTTP_500_INTERNAL_SERVER_ERROR)r,   r-   Úfilter_paramsÚusersri   r1   r2   r2   r3   r4   Ñ   s$   ýúþ€ÿzUserListView.postN©	r6   r7   r8   r9   r   Úauthentication_classesr   Úpermission_classesr4   r2   r2   r2   r3   rp   É   ó
    rp   c                   @   ro   )ÚCreateDriverViewz&
    View to create a new driver.
    c              
   C   sŽ   z(t |jd�}| ¡ r|jdd� tdddœtjd�W S tdd	|jd
œtjd�W S  t	yF } zdddœ}t|tjd�W  Y d }~S d }~ww )N)r"   T)Ú	is_driverr   zDriver created successfullyr   r   r   úInvalid datard   úAn unexpected error occured.)
r   r"   rg   rh   r   r   ÚHTTP_201_CREATEDre   r+   r)   )r,   r-   ri   r1   Úrespose_datar2   r2   r3   r4   í   s*   þþÿÿ€üzCreateDriverView.postNrv   r2   r2   r2   r3   rz   å   ry   rz   c                   @   ro   )ÚDeleteDriverViewz(
    View to delete a driver by ID.
    c              
   C   sŒ   zt jj|d�}| ¡  tdddœtjd�W S  t jy*   tdddœtjd� Y S  t	yE } ztdddœtj
d�W  Y d }~S d }~ww )	N©Úidr   zDriver deleted successfullyr   r   r   úDriver not foundrr   )r	   r@   r#   rC   r   r   r'   r\   ÚHTTP_404_NOT_FOUNDr)   rs   )r,   r-   Ú	driver_idÚdriverr1   r2   r2   r3   rC     s&   þ
þþ€ÿzDeleteDriverView.deleteN)	r6   r7   r8   r9   r   rw   r   rx   rC   r2   r2   r2   r3   r€     ry   r€   c                   @   ro   )ÚUpdateDriverViewz2
    View to update driver information by ID.
    c              
   C   sÆ   z1t jj|d�}t||jdd�}| ¡ r%| ¡  tdd|jdœtj	d�W S tdd	|j
d
œtjd�W S  t jyE   tdddœtjd� Y S  tyb } zdddœ}t|tjd�W  Y d }~S d }~ww )Nr�   Tra   r   z'Driver information updated successfullyrc   r   r   r|   rd   rƒ   r   r}   )r	   r@   r#   r   r"   rg   rh   r   r   r'   re   r+   r\   r„   r)   )r,   r-   r…   r†   ri   r1   r   r2   r2   r3   rj   (  sB   ýú	ýúþ
ü
ÿ€þzUpdateDriverView.patchN)	r6   r7   r8   r9   r   rw   r   rx   rj   r2   r2   r2   r3   r‡      ry   r‡   c                   @   ro   )ÚDriverDetailViewz4
    View to retrieve driver information by ID.
    c              
   C   s�   zt jj|d�}t|ƒ}tdd|jdœtjd�W S  t jy,   tdddœtj	d� Y S  t
yG } ztdd	dœtjd�W  Y d }~S d }~ww )
Nr�   r   z)Driver information retrieved successfullyrc   r   r   rƒ   r   rr   )r	   r@   r#   r   r   r"   r   r'   r\   r„   r)   rs   )r,   r-   r…   r†   ri   r1   r2   r2   r3   r#   V  s,   ýú
þþ€ÿzDriverDetailView.getN)	r6   r7   r8   r9   r   rw   r   rx   r#   r2   r2   r2   r3   rˆ   N  ry   rˆ   c                   @   r   )ÚSendVerificationEmailViewz8
    View to send a verification email to the user.
    c           	   
   C   s  |j  d¡ ¡ d }zEtjj|d�}|j}t ¡ }t|ƒ|_	t
 ¡ |_|jddgd� | td|gd�¡}td	d
|› �tj|jgdd� tdd|dœtjd�W S  tjyc   tdddœtjd� Y S  tyƒ } zddt|ƒdœ}t|tjd�W  Y d }~S d }~ww )NrW   r   rX   Úverification_tokenÚtoken_created_at©Úupdate_fieldszverify-email)r.   zVerify your accountz1Please click on the link to verify your account: F)Úfail_silentlyz%Verification email sent successfully.)r   r   zverification linkr   r   rf   r   rO   ©r   r   Ú	exception)rZ   r#   r[   r   r@   r0   ÚuuidÚuuid4r&   rŠ   r   rP   r‹   rh   Úbuild_absolute_urir   r   r   ÚDEFAULT_FROM_EMAILÚemailr   r   r'   r\   r(   r)   r+   )	r,   r-   r]   r   r0   rŠ   Úverification_linkr1   r^   r2   r2   r3   r4   s  sL   

ÿûýú
þý€úzSendVerificationEmailView.postNr5   r2   r2   r2   r3   r‰   n  r:   r‰   c                   @   r   )ÚVerifyEmailViewzH
    View to handle email verification with token expiration check.
    c              
   C   sþ   zLt jj|d�}t ¡ |j }|tdd�kr!tdddœtj	d�W S |rB|j
sBd|_
d |_d |_|jg d	¢d
� tdddœtjd�W S tdddœtjd�W S  t jy`   tdddœtj	d� Y S  ty~ } ztddt|ƒdœtj	d�W  Y d }~S d }~ww )N)rŠ   r   )Údaysr   zVerification token has expired.r   r   T)rN   rŠ   r‹   rŒ   zEmail verified successfully.zEmail is already verified.zInvalid verification token.rO   r�   )r	   r@   r#   r   rP   r‹   r   r   r   r+   rN   rŠ   rh   r'   r\   r)   r&   )r,   r-   rŠ   r0   Ú	token_ager1   r2   r2   r3   r#   ¡  sL   þ
ÿþþ
þýú€ÿzVerifyEmailView.getNr_   r2   r2   r2   r3   r—   œ  r:   r—   )6Úrest_frameworkr   Úrest_framework.viewsr   r   Úrest_framework.responser   Úrest_framework.authtoken.modelsr   Úmodelsr	   r
   Úserializersr   r   Údjango.shortcutsr   Údjango.utilsr   Údjango.contrib.authr   Údatetimer   Úrest_framework_simplejwt.tokensr   Úrest_framework.exceptionsr   r   Ú'rest_framework_simplejwt.authenticationr   Úrest_framework.permissionsr   rD   Údjango.core.mailr   Údjango.urlsr   Údjango.confr   r‘   r!   r   r;   rH   rV   r`   rn   rp   rz   r€   r‡   rˆ   r‰   r—   r2   r2   r2   r3   Ú<module>   sB     1+
. .