Ë
    zàVfˆC  ã                   óþ  — 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' G d„ de«      Z( G d„ de«      Z) G d„ de«      Z* G d„ de«      Z+ G d„ de«      Z,d„ Z- G d„ d e«      Z. G d!„ d"e«      Z/ G d#„ d$e«      Z0 G d%„ d&e«      Z1 G d'„ d(e«      Z2 G d)„ d*e«      Z3 G d+„ d,e«      Z4y)-é    ©Ústatus)ÚAPIViewÚexception_handler)ÚResponse)ÚTokené   )Ú
CustomUserÚOTP)ÚCustomUserSerializerÚOTPSerializer)Úget_object_or_404)Útimezone)Úauthenticate)Ú	timedelta)Úapi_settings)ÚAuthenticationFailedÚNotAuthenticated)ÚJSONWebTokenAuthentication)ÚIsAuthenticatedN)Ú	send_mail)Úreverse)Úsettingsc                   ó   — e Zd ZdZd„ Zy)ÚAdminLoginAPIViewz?
    View to authenticate admin users and return JWT Token
    c                 óè  — |j                   j                  d«      }|j                   j                  d«      }	 t        ||¬«      }|�[|j                  rOt        j
                  }t        j                  } ||«      }	 ||	«      }
t        dd|
dœt        j                  ¬«      S t        dd	d
œt        j                  ¬«      S # t        $ r(}t        ddd
œt        j                  ¬«      cY d }~S d }~ww xY 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)ÚdataÚgetr   Úis_staffr   ÚJWT_PAYLOAD_HANDLERÚJWT_ENCODE_HANDLERr   r   ÚHTTP_200_OKÚHTTP_401_UNAUTHORIZEDÚ	ExceptionÚHTTP_400_BAD_REQUEST)ÚselfÚrequestÚargsÚkwargsr   r   ÚuserÚjwt_payload_handlerÚjwt_encode_handlerÚpayloadr    Úes               ú6C:\Users\user\Documents\project_loop\accounts\views.pyÚpostzAdminLoginAPIView.post   sê   € ØŸ™×(Ñ(¨Ó9ˆØ—<‘<×#Ñ# JÓ/ˆð	Ü¨mÀhÔOˆDØÐ D§M¢MÜ&2×&FÑ&FÐ#Ü%1×%DÑ%DÐ"á-¨dÓ3�Ù*¨7Ó3�äØ Ð-?È%ÑPÜ!×-Ñ-ôð ô
  à"#Ø#Pñô "×7Ñ7ôð øô ò 	ÜØÐ)FÑGÜ×2Ñ2ôõ ûð	ús$   ¸A)C  Â"C  Ã 	C1Ã	C,Ã&C1Ã,C1N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r5   © ó    r4   r   r      s   „ ñór<   r   c                   ó   — e Zd ZdZd„ Zy)ÚUserLoginViewz;
    View for user login (also used for registration).
    c                 ó†  — |j                   j                  d«      }t        j                  j	                  |¬«      \  }}t
        j                  j                  |¬«      j                  «        t        j                  dd«      }t
        j                  j                  ||¬«       t        dd|d	œt        j                  ¬
«      S )Nr   ©r   ©r/   iè  i'  )r/   Ú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   r/   ÚcreatedrB   s         r4   r5   zUserLoginView.post?   s›   € ØŸ™×(Ñ(¨Ó9ˆô #×*Ñ*×8Ñ8À}Ð8ÓU‰ˆˆgÜ�‰×Ñ ÐÓ%×,Ñ,Ô.Ü—>‘> $¨Ó-ˆÜ�‰×Ñ ¨xÐÔ8äØÐ%=ÀhÑOÜ×%Ñ%ô
ð 	
r<   Nr6   r;   r<   r4   r>   r>   :   s   „ ñó
r<   r>   c                   ó   — e Zd ZdZd„ Zy)ÚOTPVerificationViewz$
    View for OTP verification.
    c                 óä  — 	 |j                   j                  d«      }|j                   j                  d«      }t        j                  «       t	        d¬«      z
  }t
        j                  j                  |||¬«      j                  d«      j                  «       }|r†t        t        |¬«      }t        j                  j                  |¬«      \  }}|j                   }	|j                  «        t!        d	d
|j"                  |	|j$                  dœt&        j(                  ¬«      S t!        dddœt&        j(                  ¬«      S # t*        $ r(}
t!        dddœt&        j,                  ¬«      cY d }
~
S d }
~
ww xY w)Nr   rB   é   )Úminutes)Úuser__mobile_numberrB   Úcreated_at__gtez-created_atr@   rA   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   rD   rF   Úorder_byÚfirstr   r
   r   rE   Ú
first_namerG   r   ÚkeyrT   r   r'   r)   r*   )r+   r,   r   rB   Útwo_minutes_agorC   r/   r    rK   rS   r3   s              r4   r5   zOTPVerificationView.postS   sG  € ð(	Ø#ŸL™L×,Ñ,¨_Ó=ˆMØ—|‘|×'Ñ'¨
Ó3ˆHô 'Ÿl™l›n¬yÀÔ/CÑCˆOä—‘×"Ñ"Ø(5Ø%Ø$3ð #ó ÷
 ‘˜-Ó(ß‘“ð ñ Ü(¬À=ÔQ�Ü!&§¡×!<Ñ!<À$Ð!<Ó!G‘��wØ $§¡Ð0�Ø—
‘
”Üà"#Ø#?Ø!&§¡Ø$,Ø'+×'7Ñ'7ñô "×-Ñ-ô	ð 	ô  Ø Ð-FÑGÜ!×-Ñ-ôð øô ò 	ÜØÐ)HÑIÜ×2Ñ2ôõ ûð	ús$   ‚DD> Ä D> Ä>	E/ÅE*Å$E/Å*E/Nr6   r;   r<   r4   rM   rM   N   s   „ ñó)r<   rM   c                   ó   — e Zd ZdZd„ Zy)ÚUserIsVerifiedViewz0
    View to check if the user is verified.
    c                 óì  — |j                   j                  d«      j                  «       d   }	 t        j                  j                  |¬«      }|j
                  }|j                  rdddœ}ndddœ}t        |t        j                  ¬«      S # t        j                  $ r# dd	dœ}t        |t        j                  ¬«      cY S t        $ r*}dd
dœ}t        |t        j                  ¬«      cY d }~S d }~ww xY w)NÚHTTP_AUTHORIZATIONr	   ©rZ   zUser is verified.r!   r   zUser is not verifiedr   úInvalid or expired token.rU   )ÚMETAr#   Úsplitr   rD   r/   rT   r   r   r'   ÚDoesNotExistr(   r)   r*   )r+   r,   Ú	token_keyr    r/   Úresponse_datar3   s          r4   r#   zUserIsVerifiedView.get„   sÚ   € à—L‘L×$Ñ$Ð%9Ó:×@Ñ@ÓBÀ1ÑEˆ	ð	OÜ—M‘M×%Ñ%¨)Ð%Ó4ˆEØ—:‘:ˆDØ×ÒØ+,Ð9LÑ M‘à+,Ð9OÑ P�Ü˜M´&×2DÑ2DÔEÐEøÜ×!Ñ!ò 	PØ'(Ð5PÑQˆMÜ˜M´&×2NÑ2NÔOÒOÜò 	OØ'(Ð5TÑUˆMÜ˜M´&×2MÑ2MÔNÕNûð	Oús$   ®AB Â3C3ÃC3Ã	C.Ã(C3Ã.C3N©r7   r8   r9   r:   r#   r;   r<   r4   r]   r]      s   „ ñóOr<   r]   c                   ó   — e Zd ZdZd„ Zy)ÚUserUpdateViewz*
    View to update user information.
    c                 ó˜  — |j                   j                  d«      j                  «       d   }	 t        j                  j                  |¬«      }|j
                  }t        ||j                  d¬«      }|j                  «       r9|j                  «        t        dd|j                  dœt        j                  ¬«      S t        d	d
|j                  dœt        j                  ¬«      S # t        j                  $ r! t        d	ddœt        j                  ¬«      cY S t         $ r*}d	ddœ}t        |t        j"                  ¬«      cY d }~S d }~ww xY w)Nr_   r	   r`   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!   rU   )rb   r#   rc   r   rD   r/   r   r"   Úis_validÚsaver   r   r'   ro   rd   r(   r)   r*   )r+   r,   re   r    r/   Ú
serializerr3   rf   s           r4   ÚpatchzUserUpdateView.patchœ   s.  € à—L‘L×$Ñ$Ð%9Ó:×@Ñ@ÓBÀ1ÑEˆ	ð 	OÜ—M‘M×%Ñ%¨)Ð%Ó4ˆEØ—:‘:ˆDô .¨d¸¿¹ÈtÔTˆJØ×"Ñ"Ô$Ø—‘Ô!Üà"#Ø#KØ *§¡ñô
 "×-Ñ-ôð ô  à"#Ø#2Ø",×"3Ñ"3ñô
 "×-Ñ-ôð øô ×!Ñ!ò 	ÜØÐ)KÑLÜ×3Ñ3ôò ô ò 	OØ'(Ð5TÑUˆMÜ˜M´&×2MÑ2MÔNÕNûð	Oús*   ®BC$ Â;(C$ Ã$1E	ÄE	ÄEÄ>E	ÅE	N)r7   r8   r9   r:   rt   r;   r<   r4   ri   ri   —   s   „ ñó#Or<   ri   c                 óT   — t        | |«      }t        | t        «      rdddœ|_        |S y )Nr   ra   r!   )r   Ú
isinstancer   r"   )ÚexcÚcontextÚresponses      r4   Úcustom_exception_handlerrz   Â   s4   € Ü   gÓ.€HÜ�#Ô+Ô,àØ2ñ
ˆŒð ˆð -r<   c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚUserListViewz5
    View to list users with optional filtering.
    c                 ó.  — 	 |j                   }t        j                  j                  d
i |¤Ž}t	        |d¬«      }t        dd|j                   dœt        j                  ¬«      S # t        $ r(}t        ddd	œt        j                  ¬«      cY d }~S d }~ww xY w)NT)Úmanyr	   zUsers retrieved successfullyrm   r   r   úAn unexpected error occurredr!   r;   )
r"   r
   rD   rF   r   r   r   r'   r)   ÚHTTP_500_INTERNAL_SERVER_ERROR)r+   r,   Úfilter_paramsÚusersrs   r3   s         r4   r5   zUserListView.postÔ   s�   € ð	Ø#ŸL™LˆMÜ×&Ñ&×-Ñ-Ñ>°Ñ>ˆEÜ-¨e¸$Ô?ˆJÜàØ=Ø&ŸO™Oñô
 ×)Ñ)ôð øô ò 	ÜØÐ)GÑHÜ×<Ñ<ôõ ûð	ús   ‚A A# Á#	BÁ,BÂ	BÂBN©	r7   r8   r9   r:   r   Úauthentication_classesr   Úpermission_classesr5   r;   r<   r4   r|   r|   Ì   ó    „ ñð 9Ð9ÐØ)Ð*Ðór<   r|   c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚCreateDriverViewz&
    View to create a new driver.
    c                 ón  — 	 t        |j                  ¬«      }|j                  «       r0|j                  d¬«       t	        dddœt
        j                  ¬«      S t	        dd	|j                  d
œt
        j                  ¬«      S # t        $ r*}dddœ}t	        |t
        j                  ¬«      cY d }~S d }~ww xY w)N)r"   T)Ú	is_driverr	   zDriver created successfullyr!   r   r   úInvalid datarn   úAn unexpected error occured.)
r   r"   rq   rr   r   r   ÚHTTP_201_CREATEDro   r*   r)   )r+   r,   rs   r3   Úrespose_datas        r4   r5   zCreateDriverView.postð   s¯   € ð	Ü-°7·<±<Ô@ˆJØ×"Ñ"Ô$Ø—‘¨$�Ô/ÜØ Ð-JÑKÜ!×2Ñ2ôð ô
  Ø ¨^Àz×GXÑGXÑYÜ!×6Ñ6ôð øô ò 	Ø$%Ø%CñˆLô Ø¤V×%@Ñ%@ôõ ûð		ús$   ‚AB Á(B Â	B4Â
B/Â)B4Â/B4Nrƒ   r;   r<   r4   rˆ   rˆ   è   s    „ ñð 9Ð9ÐØ)Ð*Ðór<   rˆ   c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚDeleteDriverViewz(
    View to delete a driver by ID.
    c                 ól  — 	 t         j                  j                  |¬«      }|j                  «        t	        dddœt
        j                  ¬«      S # t         j                  $ r! t	        dddœt
        j                  ¬«      cY S t        $ r(}t	        dddœt
        j                  ¬«      cY d }~S d }~ww xY w)	N©Úidr	   zDriver deleted successfullyr!   r   r   úDriver not foundr   )r
   rD   r#   rG   r   r   r'   rd   ÚHTTP_404_NOT_FOUNDr)   r€   )r+   r,   Ú	driver_idÚdriverr3   s        r4   rG   zDeleteDriverView.delete  s¨   € ð	Ü×'Ñ'×+Ñ+¨yÐ+Ó9ˆFØ�M‰MŒOÜØÐ)FÑGÜ×)Ñ)ôð øô ×&Ñ&ò 	ÜØÐ);Ñ<Ü×0Ñ0ôò ô ò 	ÜØÐ)GÑHÜ×<Ñ<ôõ ûð	ús$   ‚AA Á1B3ÂB3ÂB.Â(B3Â.B3N)	r7   r8   r9   r:   r   r„   r   r…   rG   r;   r<   r4   r�   r�     r†   r<   r�   c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚUpdateDriverViewz2
    View to update driver information by ID.
    c                 ó(  — 	 t         j                  j                  |¬«      }t        ||j                  d¬«      }|j                  «       r9|j                  «        t        dd|j                  dœt        j                  ¬«      S t        dd	|j                  d
œt        j                  ¬«      S # t         j                  $ r! t        dddœt        j                  ¬«      cY S t        $ r*}dddœ}t        |t        j                  ¬«      cY d }~S d }~ww xY w)Nr’   Trk   r	   z'Driver information updated successfullyrm   r   r   r‹   rn   r”   r!   rŒ   )r
   rD   r#   r   r"   rq   rr   r   r   r'   ro   r*   rd   r•   r)   )r+   r,   r–   r—   rs   r3   rŽ   s          r4   rt   zUpdateDriverView.patch+  s	  € ð"	Ü×'Ñ'×+Ñ+¨yÐ+Ó9ˆFÜ-¨f¸7¿<¹<ÐQUÔVˆJØ×"Ñ"Ô$Ø—‘Ô!Üà"#Ø#LØ)Ÿ™ñô
 "×-Ñ-ôð ô  à Ø .Ø)×0Ñ0ñô
 "×6Ñ6ôð øô ×&Ñ&ò 	ÜàØ0ñô  ×2Ñ2ô	ò ô ò 	Ø$%Ð0NÑOˆLÜØ¤V×%@Ñ%@ôõ ûð	ús*   ‚B B, Â(B, Â,1DÃDÃ'DÄDÄDN)	r7   r8   r9   r:   r   r„   r   r…   rt   r;   r<   r4   r™   r™   #  s    „ ñð 9Ð9ÐØ)Ð*Ðó#r<   r™   c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚDriverDetailViewz4
    View to retrieve driver information by ID.
    c                 óx  — 	 t         j                  j                  |¬«      }t        |«      }t	        dd|j
                  dœt        j                  ¬«      S # t         j                  $ r! t	        dddœt        j                  ¬«      cY S t        $ r(}t	        dd	dœt        j                  ¬«      cY d }~S d }~ww xY w)
Nr’   r	   z)Driver information retrieved successfullyrm   r   r   r”   r!   r   )r
   rD   r#   r   r   r"   r   r'   rd   r•   r)   r€   )r+   r,   r–   r—   rs   r3   s         r4   r#   zDriverDetailView.getY  s´   € ð	Ü×'Ñ'×+Ñ+¨yÐ+Ó9ˆFÜ-¨fÓ5ˆJÜàØJØ&ŸO™Oñô
 ×)Ñ)ôð øô ×&Ñ&ò 	ÜØÐ);Ñ<Ü×0Ñ0ôò ô ò 	ÜØÐ)GÑHÜ×<Ñ<ôõ ûð	ús$   ‚AA Á1B9Â	B9ÂB4Â.B9Â4B9N)	r7   r8   r9   r:   r   r„   r   r…   r#   r;   r<   r4   rœ   rœ   Q  s    „ ñð 9Ð9ÐØ)Ð*Ðór<   rœ   c                   ó   — e Zd ZdZd„ Zy)ÚSendVerificationEmailViewz8
    View to send a verification email to the user.
    c                 ó
  — |j                   j                  d«      j                  «       d   }	 t        j                  j                  |¬«      }|j
                  }t        j                  «       }t        |«      |_	        t        j                  «       |_        |j                  ddg¬«       |j                  t        d|g¬«      «      }t!        d	d
|› �t"        j$                  |j&                  gd¬«       t)        dd|dœt*        j,                  ¬«      S # t        j.                  $ r! t)        dddœt*        j0                  ¬«      cY S t2        $ r4}ddt        |«      dœ}t)        |t*        j4                  ¬«      cY d }~S d }~ww xY w)Nr_   r	   r`   Ú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   rp   r!   rU   ©r   r   Ú	exception)rb   r#   rc   r   rD   r/   ÚuuidÚuuid4Ústrr¡   r   rV   r¢   rr   Úbuild_absolute_urir   r   r   ÚDEFAULT_FROM_EMAILÚemailr   r   r'   rd   r(   r)   r*   )	r+   r,   re   r    r/   r¡   Úverification_linkr3   rf   s	            r4   r5   zSendVerificationEmailView.postv  si  € Ø—L‘L×$Ñ$Ð%9Ó:×@Ñ@ÓBÀ1ÑEˆ	ð$	OÜ—M‘M×%Ñ%¨)Ð%Ó4ˆEØ—:‘:ˆDÜ!%§¡£ÐÜ&)Ð*<Ó&=ˆDÔ#Ü$,§L¡L£NˆDÔ!Ø�I‰IÐ%9Ð;MÐ$NˆIÔOØ '× :Ñ :Ü˜Ð.@Ð-AÔBó!Ðô Ø%ØCÐDUÐCVÐWÜ×+Ñ+Ø—‘�Ø#õô àØFØ):ñô
 ×)Ñ)ôð øô ×!Ñ!ò 	ÜØÐ)KÑLÜ×3Ñ3ôò ô ò 	OàØ:Ü  ›VñˆMô
 ˜M´&×2MÑ2MÔNÕNûð	Oús$   ®C$D Ä1FÅFÅ)E=Å7FÅ=FNr6   r;   r<   r4   rŸ   rŸ   q  s   „ ñó&Or<   rŸ   c                   ó   — e Zd ZdZd„ Zy)ÚVerifyEmailViewzH
    View to handle email verification with token expiration check.
    c                 ó¦  — 	 t         j                  j                  |¬«      }t        j                  «       |j
                  z
  }|t        d¬«      kD  rt        dddœt        j                  ¬«      S |rS|j                  sGd|_
        d |_        d |_        |j                  g d	¢¬
«       t        dddœt        j                  ¬«      S t        dddœt        j                  ¬«      S # t         j                  $ r! t        dddœt        j                  ¬«      cY S t        $ r2}t        ddt!        |«      dœt        j                  ¬«      cY d }~S d }~ww xY w)N)r¡   r	   )Údaysr   zVerification token has expired.r!   r   T)rT   r¡   r¢   r£   zEmail verified successfully.zEmail is already verified.zInvalid verification token.rU   r¦   )r
   rD   r#   r   rV   r¢   r   r   r   r*   rT   r¡   rr   r'   rd   r)   rª   )r+   r,   r¡   r/   Ú	token_ager3   s         r4   r#   zVerifyEmailView.get¤  sM  € ð.	ä×%Ñ%×)Ñ)Ð=OÐ)ÓPˆDô !Ÿ™›¨×)>Ñ)>Ñ>ˆIØœ9¨!Ô,Ò,ÜØ Ð-NÑOÜ!×6Ñ6ôð ñ ˜D×,Ò,Ø#'�Ô Ø*.�Ô'Ø(,�Ô%Ø—	‘	ò#ð ô ô  Ø Ð-KÑLÜ!×-Ñ-ôð ô
  Ø Ð-IÑJÜ!×-Ñ-ôð øô ×&Ñ&ò 	ÜØÐ)FÑGÜ×2Ñ2ôò ô ò 	ÜàØ>Ü!$ Q£ñô
 ×2Ñ2ôõ ûð	ús1   ‚A-C# Á0AC# ÃC# Ã#1EÄEÄ'EÅEÅENrg   r;   r<   r4   r°   r°   Ÿ  s   „ ñó/r<   r°   )5Ú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_jwt.settingsr   Úrest_framework.exceptionsr   r   Ú!rest_framework_jwt.authenticationr   Úrest_framework.permissionsr   rH   Údjango.core.mailr   Údjango.urlsr   Údjango.confr   r¨   r   r>   rM   r]   ri   rz   r|   rˆ   r�   r™   rœ   rŸ   r°   r;   r<   r4   ú<module>rÅ      sß   ðÝ !ß ;Ý ,Ý 1ß #ß <Ý .Ý !Ý ,Ý Ý 4ß LÝ HÝ 6Û Ý &Ý Ý  Û ô!˜ô !ôH
�Gô 
ô(.˜'ô .ôbO˜ô Oô0(O�Wô (OòVô�7ô ô8�wô ô>�wô ô8+�wô +ô\�wô ô@+O ô +Oô\4�gõ 4r<   