
    5h                     8   d dl mZmZ d dlmZ d dl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 d dlmZ d dl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!m"Z" d dl!m#Z# d dl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-Z-d dl.Z.d dl/Z/d dl0m1Z1 d dl2m3Z3 d dl2m4Z4 d dl5m6Z6 d dl7m8Z8mZ d dl9m:Z: d dl;m<Z< d dl7m8Z8  e/jz                  e>      Z? ede>      Z@ ee@      ZA G d de      ZBeAj                  eBd         G d! d"e      ZDeAj                  eDd#        G d$ d%e      ZEeAj                  eEd&        G d' d(e      ZFeAj                  eFd)        G d* d+e      ZGeAj                  eGd,        G d- d.e      ZHeAj                  eHd/       d d0lImJZJ  G d1 d2e      ZKeAj                  eKd3        G d4 d5e      ZLeAj                  eLd6        G d7 d8e      ZMeAj                  eMd9       e@j                  d:d;g<      d=        ZOy)>    )ObjectIderrors)	Blueprint)ResourceApireqparse)User)Image)UserReferral)	QuizShare)SECRET)send_sms)
send_email)generate_password_hashN)datetime)ValidationError)check_password_hash)generate_token)jwt_required)requestcurrent_appjsonify)secure_filename)Sliderurlparse)Exam)StudyMaterial)Notification)NotUniqueErrorr   )EdurubyConfiguration)TransactionHistory)r    authc                      e Zd Z ej                         Zej                  ded       ej                  ded       ej                  ded       ej                  ded       ej                  ded       ej                  ded	d
       ej                  ded       ej                  ded       d ZddZ	d Z
y)Register	mobile_noFtyperequirednameemailpasswordconfirm_passwordregister_typeTSelect user typer(   r)   helprefer_byshared_quiz_idc                 D    d}t        t        j                  ||            S )Nz0^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)boolrematch)selfr+   email_regexs      '/var/www/html/eduruby.in/routes/auth.pyvalidate_emailzRegister.validate_email:   s    IBHH[%011    c                    t        |      D ]o  }dj                  t        j                  t        j
                  t        j                  z   |            }t        j                  |      j                         rm|c S  t        d      )N )kreferral_codez'Failed to generate unique referral code)rangejoinrandomchoicesstringascii_uppercasedigitsr	   objectsfirst	Exception)r8   lengthmax_attempts_codes        r:   generate_referral_codezRegister.generate_referral_code>   sg    |$ 	A776>>&*@*@6==*PTZ[\D<<d399;	 ABBr<   c           	         t         j                  d       | j                  j                         }|d   s|d   sddddfS |d   rQ|d   r|d	   sdd
ddfS |d   |d	   k7  rddddfS t	        j
                  |d         j                         rddddfS |d   rx| j                  |d         sddddfS |d   sddddfS |d   r|d	   sdd
ddfS |d   |d	   k7  rddddfS t	        j
                  |d         j                         rddddfS |d   }t        t        j                  dd            }|d   ||d   rt        |d         nd | j                         dt        j                         |dd}|j                  d      r#|d   |d<   t!        |d   |      }|d   sddddfS |j                  d      r)|d   |d<   d|d<   t#        |d   ||      }|d   sddddfS 	 t	        d1i |j%                         }|j                  d!      rut	        j
                  |d!   "      j                         }	|	sdd#dd$fS |	j,                  dk(  rdd%dd&fS t/        ||	dt        j                         '      j%                          |j                  d(      rit1        j
                  |d(   )      j                         }
|
sdd*dd$fS t3        |
j4                  |
|t        j                         +      j%                          |j                  d      rd,nd-}d.|t        |j6                        d/d0fS # t&        $ r
 ddddfcY S t(        $ r}ddt        |       ddfcY d }~S d }~wt*        $ r}dd t        |       ddfcY d }~S d }~ww xY w)2Nu#   📩 Reached Register POST endpointr&   r+   F"Mobile number or email is requiredstatusmessage  r,   r-   z#Enter password and confirm password*Password and Confirm Password do not match)phoneMobile number already existsEnter a valid emailr*   z
Enter namer+   Email already existsr.   '  韆 r   )r*   	user_typer,   rA   rT   created_date	login_otpcoins_wallet_balancerX   rT   z'Failed to send OTP due to server error.  is_email_verifiedzFailed to send OTP via email.zDuplicate user foundzValidation failed: zUnexpected error: r2   r@   Invalid referral code  z/Referral user is not active. Kindly verify OTP.i  user_idreferred_by_user_idpointsr`   r3   idInvalid quiz idshared_by_user_idquiz_idrh   r`   z1OTP sent successfully, verify your mobile number.zOTP sent to your email address.T)rT   rU   last_id    )loggerdebugparser
parse_argsr	   rI   rJ   r;   strrD   randintr   rP   r   utcnowgetr   r   saver    r   rK   rT   r   r
   r   rh   rl   )r8   datareg_typeotp	user_datasms_responseemail_responseuserereferrerimagerU   s               r:   postzRegister.postE   s0   :;{{%%' K g#0TUWZZZ
#40B+C"'4YZ\___J4(:#;;"'4`acfff||${"34::<"'4RSUXXX=&&tG}5"'4IJCOO<"'LA3FF
#40B+C"'4YZ\___J4(:#;;"'4`acfff||$w-0668"'4JKSPP( &.../ L!DHDT.tJ/?@Z^!88:$OO-$%	
	 88K !%k!2Ig#D$5s;L)"'4]^`ccc88G!%gIg-.I)*'WsHEN!(+"'4STVYYY	T$)$))+D 88J||$z2BCIIKH"'4KLcQQ!#"'4efhkkk $,%__. df 88$%MMT*:%;<BBDE"'4EFKK"'--%__.	
 df xx$ @2 	 477|
 	 	U  	M#0FGLL 	U#2Ec!fX0NOQTTT 	T#2DSVH0MNPSSS	Ts6   (L1 1NNM#N#N/NNNN)   
   )__name__
__module____qualname__r   RequestParserrv   add_argumentrx   r;   rP   r   rs   r<   r:   r%   r%   /   s    #X##%F
#>
S59
cE:

u=
*uE
cDGYZ

u=
(sUC2Cjr<   r%   z	/registerc                       e Zd Z ej                         Zej                  dedd       ej                  dedd       ej                  dedd       d	 Zy
)	VerifyOTPuseridTEnter user idr0   r   z	Enter OTPr(   zEnter type (otp/email/forget)c                 f   | j                   j                         }t        j                  |d         j	                         }|sddddfS |d   dk(  r|j
                  d	k(  rdd
ddfS |d   dk(  r|j                  rddddfS |j                  |d   k7  rddddfS |d   dk(  r|j                  d	       d}ny|d   dk(  r|j                  d	d	       d}n[|d   dk(  r?d}t        j                  |d         j	                         j                         }d||ddfS |j                  d	       d}t        j                  |d         j	                         }t        j                  j                  d      j	                         }|r>t        |j                  xs d      }t        j                  |d      j	                         }|dkD  r]|s[t        |j                  xs d      }||z   }	|	|_        |j!                          t        |dd|d| dd ||	d	 	      j!                          t#        j                  |!      j	                         }
|
r|
j$                  n;|j&                  r.t        j                  |j&                  "      j	                         nd }|r-|j(                  d#k(  rt        |j*                  xs d      }n+|j(                  d$k(  rt        |j,                  xs d      }nd}t        j                  |d%|&      j	                         }|dkD  r|st        |j                  xs d      }||z   }||_        |j!                          d'd	i}||d(<   |j(                  d#k(  r||d)<   n||d*<   	  |j.                  d/i | t        |d%d|d,| d-|j(                  j7                          d.|||d	 	      j!                          t        j                  |d         j	                         j                         }d||ddfS # t0        $ r"}t2        j5                  d+|        Y d }~d }~ww xY w)0Nr   rk   FzUser id not exists.rS     r(   r      zUser already verified.i  r+   zEmail already verified.zInvalid OTP.rf   )set__statuszOTP verified successfully)set__is_email_verifiedr   zEmail verified successfullyforgetz5Otp verified successfully. Continue to reset passwordTrT   rU   r      -created_dater   signup_bonusrh   transaction_typecreditSignup bonus: z( coins credited after account activation	rh   r   
entry_typeamountdescriptionrelated_user_idbalance_beforebalance_aftertransaction_statusrh   r@   LearnerTeacherreferral_bonusrh   r   r   inc__total_referralsinc__total_referral_pointsinc__referral_points_learnerinc__referral_points_teacher&Failed to update referrer aggregates: Referral bonus:   coins received for referring a  signuprs   )rv   rw   r	   rI   rJ   rT   rd   ra   updateto_jsonr!   order_byintuser_signup_bonus_coinsr"   rb   r|   r   ri   r2   r_   learner_signup_referral_coinsteacher_signup_referral_coinsmodifyrK   rt   errorlower)r8   r}   r   msgupdated_usercfgr   already_signup	ub_beforeub_afterref_relr   
ref_pointsalready_ref	rb_beforerb_afterinc_opsr   s                     r:   r   zVerifyOTP.post   s8   {{%%'||tH~.446#0EFKK <5 T[[A%5#0HI3NN<7"t'='=#0IJCOO>>T%[(#?DD <5 KKAK&-C&\W$KKqaK@/C&\X%IC<<4>:@@BJJLL"sLI3NNKKAK&-C ||tH~.446 #**33ODJJLs::?a@L/77~eg  a 9 9 >Q?	$|3,4)		" %3''"0>f g$(#,"*'(
 $& #**48>>@G6=w22EI]]4==9??AX\  >>Y.!$S%F%F%K!!LJ^^y0!$S%F%F%K!!LJ!"J 188$%5$( %'	  >+ #H$A$A$FQ GI(:5H4<H1MMO  6q9G<FG89~~2BL >?BL >?S'2'2 ' ()9#+)&6zlBbcgcqcqcwcwcybz  {B  %C(,'0&.+,
 df||tH~6<<>FFH3EsJJ! % S'MaS%QRRSs   5P 	P0P++P0N	r   r   r   r   r   rv   r   rx   r   rs   r<   r:   r   r      s_    #X##%F
sTP
C$[I
S4>]^rKr<   r   z
/verifyotpc                       e Zd Z ej                         Zej                  dedd       ej                  dedd       ej                  dedd       d	 Zy
)ResetPasswordr   Tr   r0   r,   Enter passwordr-   zEnter confirm passwordc                 |   | j                   j                         }|d   j                         }|d   j                         }|s	|sddddfS |sddddfS |sddddfS ||k7  rdd	ddfS t        j                  |d
         j                         }|sddddfS t        |      }|j                  |       ddddfS )Nr,   r-   Fz-Password and Confirm Password cannot be emptyrS   rV   zPassword cannot be emptyz Confirm Password cannot be emptyrW   r   rk   zInvalid user id.r   )set__passwordTzPassword reset successfullyr   )rv   rw   stripr	   rI   rJ   r   r   )r8   r}   r,   r-   r   hashed_passwords         r:   r   zResetPassword.postP  s/   {{%%'
#))+ 2399; 0J  
 5  
  =  
 ''G  
 ||tH~.446-  
 1:/2 4
  	r<   Nr   rs   r<   r:   r   r   J  s_    #X##%F
sTP

tBRS
*tJbc+r<   r   z/reset-passwordc                       e Zd Z ej                         Zej                  ded       ej                  ded       ej                  dedd       ej                  d	ed       d
 Zy)Loginr&   Fr'   r+   r,   Tr   r0   r3   c                 X   | j                   j                         }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|s	|sddddfS |rd	}|}d
}nd}|}d}t        j                  d,i ||ij                         }	|	sd|ddfS |	j                  sddddfS t        |	j                  |      sddddfS |	j                  dk(  rddddfS |	j                  dk7  rt        t        j                  dd            }
|	j                  |
       |rk|	j                  sCt        ||
|	j                   xs d      }|d   sddddfS ddt        |	j"                        dddfS ddt        |	j"                        dddfS |r4t%        ||
      }|d   sddddfS ddt        |	j"                        dddfS |	j'                         j)                         }|j+                  dd        |j+                  dd        t        |d          |d <   d!|v r|d!   r|d!   j-                  d"      |d!<   t        |	j"                        |	j.                  |	j                   xs dd#}t1        |      }g }|	j2                  rt        j                  |	j2                  $      }|D ]  }|j'                         j)                         }|j+                  dd        |j+                  dd        t        |d          |d <   d!|v r|d!   r|d!   j-                  d"      |d!<   |j5                  |        |rft7        j                  |%      j                         }|sdd&ddfS t9        |j:                  ||	t=        j>                         '      jA                          d(d)|||d*}|d+fS )-Nr&   r+   r,   r3   FrR   rS   rV   rX   zMobile number not exists.zEmail not exists.r   z%Password is not set for this account.rf   zPassword is incorrect.r   Account is deleted.r]   r^   set__login_otpr   rT   zOTP sending failed for email.rc   zVerify your email to login.)rT   rU   rh   r(   Account is deactivated.zOTP sending failed for mobile.z#Verify your mobile number to login.r   ra   _idr`   %Y-%m-%d %H:%M:%Srl   r+   roler2   rk   rm   )ro   rp   rh   
created_atTLogin successfully.rT   rU   tokenr   	referralsr   rs   )!rv   rw   r{   r	   rI   rJ   r,   r   
is_deletedrT   rx   rD   ry   r   rd   r   r_   rl   r   to_mongoto_dictpopstrftimer+   r   rA   appendr
   r   rh   r   rz   r|   )r8   r}   r&   r+   r,   r3   lookup_fieldlookup_valuemissing_msgr   r   r   r   	user_dicttoken_payloadr   r   referred_usersref_userref_user_datar   responses                         r:   r   z
Login.post  sG   {{%%'HH[)	!88J'"23?   "L$L5K"L L-K||;|\:;AAC&  
 }}B  
 #4==(;3   ??a0   ;;!fnnUE23CKKsK+--%/sDNN<Wi%XN)(3&+'F     #(#@#&tww< '	
   #(#<#&tww< '	
   '	37#H-"'#C   $D"477|!	
   MMO++-	j$'k4(y/0	%Y&9^+D(1.(A(J(JK^(_In% dgg,ZZNN/i

 }- 	!\\43E3EFN* 0 ( 1 1 3 ; ; =!!*d3!!+t4'*=+?'@e$!]2}^7T4A.4Q4Z4Z[n4oM.1  /0 MM^4::<E#0  
 "'--#??,	
 df ,"
 }r<   Nr   rs   r<   r:   r   r     sp    #X##%F
#>
cE:

tBRS
(sUCRr<   r   z/loginc                       e Zd Zed        Zy)Profilec                 >   t        t        dd       }|sddddfS t        j                  |      j	                         }|sddddfS |j                         j                         }t        |d	         |d
<   |j                  d	d        |j                  dd        |j                  dd        d|v r|d   r|d   j                  d      |d<   g }|j                  d      rt        j                  |d         }|D ]  }|j                         j                         }t        |d	         |d
<   |j                  d	d        |j                  dd        |j                  dd        d|v r|d   r|d   j                  d      |d<   |j                  |        dd||ddfS )Nrh   FPass user idrS   rf   rk   Invalid user idr   r   rl   r,   ra   r`   r   rA   r   Tz(Profile information fetched successfully)rT   rU   r   r   r   )getattrr   r	   rI   rJ   r   r   rx   r   r   r{   r   )r8   rh   r   r   r   referral_usersr   ref_datas           r:   r{   zProfile.getJ  s   '9d3)  
 ||w'--/,   MMO++-	i./	$eT"j$'k4( Y&9^+D(1.(A(J(JK^(_In% 	==)!\\9_3MNN* 
+#,,.668!$Xe_!5UD)Z.[$/!X-(>2J/7/G/P/PQd/eH^,  *
+ A"	

  	r<   N)r   r   r   r   r{   rs   r<   r:   r   r   I  s    0 0r<   r   z/profilec                   ^    e Zd Z ej                         Zej                  dedd       d Zy)ForgotPasswordr+   TzEnter emailr0   c                 ~   | j                   j                         }|j                  d      }t        j                  |      j                         }|sddddfS t        t        j                  dd            }|j                  |	       t        ||d
      }|d   sddddfS ddt        |j                        ddfS )Nr+   r[   Fz$Email does not exists in our record.rS   r   r]   r^   r   zForget Password)to_emailr   r_   rT   zFailed to send OTP email.rc   Tz(Enter code sent to your registered email)rT   rU   rh   r   )rv   rw   r{   r	   rI   rJ   rx   rD   ry   r   r   rl   )r8   r}   r+   r   
new_randomr   s         r:   r   zForgotPassword.post  s    {{%%'!||%(..0A   u56
:. $'
 h'6   A477|
 	 	r<   Nr   rs   r<   r:   r   r     s.    #X##%F
cD}M!r<   r   z/forget-password)auth_requiredc                       e Zd Zed        Zy)UpdateProfilec           
      	   t        t        dd       }|sddddfS t        j                  |      j	                         }|sddddfS t        j
                  r)t        j                  d	
      xs i }|j                  }d }n9t        j                  j                  }t        j                  j                  d      }i } |d      }|r||j                         rl|j                         }d|vsd|j                  d      d   vrddddfS t        j                  ||j                        j	                         rddddfS ||d<    |d      }|r[|j                         rK|j                         }t        j                  ||j                        j	                         rddddfS ||d<    |d      }	|	r#|	j                         r|	j                         |d<   |rch d}
|j                  xs dj                         }||
vrddddfS |j                  j!                  dt"        j$                         |j                  j'                         }|j                  j!                  d       |dkD  rddddfS t)        |j*                  xs d      }t"        j,                  j/                  |      d   }t1        t3        j4                         j7                                dt#        j8                  d       j;                          | }t"        j,                  j=                  t>        j@                  d!d"d#d$      }t#        jB                  |d	%       t"        j,                  j=                  ||      }|jE                  |       t        jF                  jI                  d&      }| d'| }||d<   t        |dd       }|r	 dd(l%m&} t"        j,                  jO                   ||      j,                        }t"        j,                  j=                  ||      }t"        j,                  jQ                  |      rt#        jR                  |       |sdd)ddfS 	  |jV                  d4i | t        j                  |      j[                  d+dddd,d-d.d      j	                         }|j]                         }|j_                  d/d        |j_                  d0d        d	d1|d2d3fS # tT        $ r Y w xY w# tX        $ r
 dd*ddfcY S w xY w)5Nrh   Fr   rS   rf   rk   r   r   T)silentprofile_imager+   @.rZ   rV   )r+   id__ner\   r&   )rX   r
  rY   rX   r*   >   	image/jpg	image/png
image/jpegr>   z*Only JPG, JPEG, and PNG images are allowedr   i   z(Profile image size should not exceed 1MBrN   r   publicimagesuploadsprofile)exist_ok/z/public/images/uploads/profile/r   zNo fields provided for updatezEmail or mobile already existsrl   r_   rT   rd   r,   ra   zProfile updated successfullyr   r   rs   )0r   r   r	   rI   rJ   is_jsonget_jsonr{   formfilesr   splitrl   mimetyper   streamseekosSEEK_ENDtellr   filenamepathsplitextr   r   rz   	timestampurandomhexrC   r   	root_pathmakedirsr|   host_urlrstripurllib.parser   basenameexistsunlinkrK   r   r    onlyr   r   )r8   rh   r   r}   get_valprofile_image_fileupdate_datar+   r&   r*   allowed_typesr  sizer  extnew_name
upload_dirnew_pathbase
public_urlold_urlr   old_nameold_pathupdatedus                             r:   r   zUpdateProfile.post  s{   '9d3#?DD||w'--/#0ABCGG ??##406BDhhG!%ll&&G!(!2!2?!C  U[[]KKME%3ekk#.>r.B#B"'4IJCOO||%8>>@"'4JKSPP#(K  K(	*!)I||)DGG<BBD"'4RSUXXX#,K  vDJJL"&**,K DM*339r@@BH},"'4`acfff%%**1bkk:%,,113D%%**1-k!"'4^_addd&'9'B'B'HbIH''""8,R0Choo/99;<=Qrzz"~?Q?Q?S>TUXTYZHk&;&;XxQZ\efJKK
T2ww||J9H##H-##**3/D 6!@
KJ+5K( dOT:G5!ww//0A0F0FGH!ww||JAHww~~h/		(+ #0OPRUUU	WDKK&+& ,,'*//&'7KCVXg

%' 	 OO	j$	k4 +ISTUWZZZ' !   	W#0PQSVVV	Ws%   1B	S S 	SSS.-S.N)r   r   r   r  r   rs   r<   r:   r  r    s    a[ a[r<   r  z/update-profilec                        e Zd Zd ZddZd Zy)GoogleLoginc                    t        j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|sddd	d
fS |sddd	d
fS | j                  |      }|j                  d      r
d|d   d	dfS |j                  d      }|j                  dd       d|j                  dd       j	                         }|sddd	dfS t        j                  |      j                         }	d}
|	sd}
| j                         }||||dddt        j                         d}d }|r2t        j                  |      j                         }|sddd	dfS ||d<   t        d;i |j                         }|}	|r\t        |	|dt        j                               j                          n,|	j                  dk(  rddd	dfS |	j                  dk7  rddd	dfS |	j                         j!                         }|j#                  dd        |j#                  dd        t%        |d         |d<   t%        |	j&                        |	j(                  |	j*                  xs d d!}t-        |      }|
r@t.        j                  j1                  d"      j                         }|rt3        |j4                  xs d      }|dkD  rt7        j                  |	d#$      j                         s[t3        |	j8                  xs d      }||z   }||	_        |	j                          t7        |	d#d%|d&| d'd ||d(	      j                          t        j                  |	)      j                         }|r|j:                  n;|	j<                  r.t        j                  |	j<                        j                         nd }|r|d k(  rt3        |j>                  xs d      }n!|d*k(  rt3        |j@                  xs d      }nd}t7        j                  |d+|	,      j                         }|dkD  r|st3        |j8                  xs d      }||z   }||_        |j                          d|d-}|d k(  r||d.<   n||d/<   	  |jB                  d;i | t7        |d+d%|d1| d2|jK                          d3|	||d(	      j                          g }|	jL                  rt        j                  |	jL                  4      }|D ]f  }|j                         j!                         } | j#                  dd        | j#                  dd        t%        | d         | d<   |jO                  |        h |rftQ        j                  |5      j                         }!|!sdd6d	dfS tS        |!jT                  |!|	t        j                         7      j                          dd8|||d9d:fS # tD        $ r#}tF        jI                  d0|        Y d }~id }~ww xY w)<NT)forcer   r.   r2   r3   FzClerk token not providedrS   rV   r/   r   rf   r+   	firstNamer>    lastNamez%Clerk token does not contain an emailr[   r   r   )r*   r+   r_   rA   rd   rT   rb   r`   r@   re   rg   r   r   r,   ra   r   r   r   r   r   r   r   r   z, coins credited on social login registrationr   r   r   r   r   )r   r   r   r   r   r   r   r   r   rk   rm   rn   r   r   r   rs   )+r   r  r{   verifyClerkTokenr   r	   rI   rJ   rP   r   rz   r|   r   r   rT   r   r   r   rx   rl   r+   r_   r   r!   r   r   r   r"   rb   ri   r2   r   r   r   rK   rt   r   r   rA   r   r
   r   rh   )"r8   r}   clerk_tokenr.   r2   r3   r   r+   r*   r   
first_timerA   user_data_dictr   new_userr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s"                                     r:   r   zGoogleLogin.post  s   d+hhw'188J'"23#0JKSPP#0BCSHH ))+6	==!#	'0BCSHHg&--R019==R3P2QRXXZ#0WXZ]]] ||%(..0
J 779M*!.%&() ( 1	N H<<h?EEG&+8OPRUUU-5z*-n-224HD  (0!)!2	
 $& !#"'4IJCOO{{a"'4MNPSSS MMO++-	j$'k4(y/0	%  #477|djj$..Je\ef}- &..77HNNPC"3#>#>#C!D!#,>,F,Ftft,u,{,{,} #D$=$=$B CI(<7H08D-IIK& $)7#++&4\NBn$o(,'0&.+,
 df '..t<BBD:A766  ~B  ~K  ~KcgcpcpHqHwHwHy  QU$	1%()J)J)Oa%P
&)3%()J)J)Oa%P
%&
"4"<"< (;K]a#eg   "A~k$'(E(E(J$K	#,z#98@5 ;<\f"g(I5FPG$BCFPG$BCW+HOO6g6 +$,-='/#-*::,Ffgtgzgzg|f}  ~E  )F,0+4*2/0
 $& 	!\\43E3EFN* 0 ( 1 1 3 ; ; =!!*d3!!+t4'*=+?'@e$  /0 MM^4::<E"'4EFKK"'--%__.	
 df ,"
  	M  ) W"LL+QRSQT)UVVWs   7W 	W7W22W7c                     t        j                           dt        j                          }t        j                  |j	                               j                         j                         d | S )N-)rD   timehashlibmd5encode	hexdigestupper)r8   rL   raws      r:   rP   z"GoogleLogin.generate_referral_code  sM    !499;-0{{3::<(224::<WfEEr<   c                 b    t        j                  |t        dg      }|d   |d   |d   |d   dS )NHS256)
algorithmssubr+   rB  rD  )rl   r+   rB  rD  )jwtdecoder   )r8   r   payloads      r:   rE  zGoogleLogin.verifyClerkToken  s?    **UFyA%.W% -
+	
 	
r<   N)r   )r   r   r   r   rP   rE  rs   r<   r:   r?  r?    s    l\F
r<   r?  z/google-loginc                       e Zd Zd Zy)GetSliderInfoc           	         	 t        j                  d      j                  d      }g }|D ]p  }|j                  t	        |j
                        |j                  |j                  |j                  |j                  r|j                  j                         nd d       r |g k(  rd|ddfS d|ddfS # t        $ r}dt	        |      d	d
fcY d }~S d }~ww xY w)Nr   rT   slide_position)rl   r   r^  rT   r`   F)rT   r}   r   TrS   rc   )r   rI   r   r   rx   rl   r   r^  rT   r`   	isoformatrK   )r8   slidersresultsliderr   s        r:   r{   zGetSliderInfo.get  s    	nnA.778HIGF! fii.#\\&,&;&;$mmGMGZGZF$7$7$A$A$C`d  {#"   #"  
  	q6  	s$   B'B1 *B1 1	C:C	CCN)r   r   r   r{   rs   r<   r:   r[  r[    s    r<   r[  z/getsliderinfoz/notification_countGET)methodsc                      	 t        j                  d      j                         } t        d| d      dfS # t        $ r#}t        dt        |      d      dfcY d }~S d }~ww xY w)	Nr   r]  T)rT   countr   FrS   rc   )r   rI   rf  r   rK   rx   )rf  r   s     r:   notification_countrg    sa    B$$A.446$78#== B%CF;<cAABs   36 	A"AA"A")Pbsonr   r   flaskr   flask_restfulr   r   r   models.userr	   models.imager
   models.user_referralr   models.quiz_sharer   testr   utils.sms_servicer   utils.email_servicer   werkzeug.securityr   rD   rF   r6   r   mongoenginer   r   r  utils.jwt_servicer   r   r   r   r   werkzeug.utilsr   rW  rM  models.sliderr   rL  requestsloggingr)  r   models.examr   r   models.notification_modelr   mongoengine.errorsr    models.eduruby_configurationr!   models.transaction_historyr"   	getLoggerr   rt   auth_bpauth_apir%   add_resourcer   r   r   r   r   utils.auth_middlewarer  r  r?  r[  routerg  rs   r<   r:   <module>r     s      1 1   - '  & * 4   	  ' 1 	 , * / / * 
       !  & 2 > = 9 -
 
		8	$ FH
%w<@x @B 	  h ,xK xKt 	  i .<1H 1f 	  m%6 7YH Yt 	  eX &\2h 2h 	  gz *%X %N 	  n&8 9 0c[H c[J 	  m%6 7`{
( {
| 	  k? 3H B 	  m%5 6T 	$ug6B 7Br<   