
    zVfC                        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/	mhODDMM&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                         }|rt        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   (	#LL,,_=M||''
3H 'llny/CCO""(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    LL$$%9:@@B1E		OMM%%)%4E::D+,9L M+,9O PM&2D2DEE!! 	P'(5PQMM&2N2NOO 	O'(5TUMM&2M2M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.   LL$$%9:@@B1E	 	OMM%%)%4E::D .dtTJ""$!"##K *
 "--   "##2","3"3
 "--  !! 	)KL33   	O'(5TUMM&2M2M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    	#LLM&&-->>E-e$?J=&OO
 ))   	)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 
   ^zGXGX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+9FMMO)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+9F-f7<<QUVJ""$!"##L)
 "--     .)00
 "66  && 	0  22	   	$%0NOL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+9F-f5JJ&OO
 ))  && 	);<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   LL$$%9:@@B1E	$	OMM%%)%4E::D!%&)*<&=D#$,LLND!II%9;M$NIO ' : :.@-AB! %CDUCVW++# F):
 ))  !! 	)KL33   	O: VM
 M&2M2M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)PD !)>)>>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<   