
    1h                       d dl mZ d dlmZmZ d dlmZmZ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"Z"d dl#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/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9Z9d dl:m;Z;m<Z< d dl=Z>d dl?Z?d dl@Z@dhZAdZBd ZCdhZDdZEd ZFh dZGdZHd ZI edeJ      ZKeKj                  d d!d"g#      d$        ZMeKj                  d%d!d"g#      d&        ZNeKj                  d'd!d"g#      d(        ZOeKj                  d)d"g#      d*        ZPeKj                  d+      d,        ZQeKj                  d-      d.        ZReKj                  d/d!g#      d0        ZSeKj                  d1d!g#      d2        ZTeKj                  d3d!g#      d4        ZUeKj                  d5d!g#      d6        ZVeKj                  d7d!d"g#      d8        ZWeKj                  d9d"g#      d:        ZXeKj                  d;d!d"g#      d<        ZYeKj                  d=      d>        ZZeKj                  d?d!d"g#      d@        Z[eKj                  dAd!g#      dB        Z\eKj                  dCd"g#      dD        Z]eKj                  dEd!d"g#      dF        Z^eKj                  dGd!d"g#      dH        Z_eKj                  dId!g#      dJ        Z`eKj                  dKd!d"g#      dL        ZaeKj                  dMd"g#      dN        ZbeKj                  dOd!d"g#      dP        ZceKj                  dQd!d"g#      dR        ZdeKj                  dSd"g#      dT        ZeeKj                  dUd!d"g#      dV        ZfeKj                  dWd!d"g#      dX        ZgeKj                  dYd!d"g#      dZ        ZheKj                  d[d!d"g#      d\        ZieKj                  d]d"g#      d^        ZjeKj                  d_d!g#      d`        ZkeKj                  dad!d"g#      db        ZleKj                  dc      dd        ZmeKj                  ded!d"g#      df        ZneKj                  dgd"g#      dh        ZoeKj                  did!d"g#      dj        ZpeKj                  dkd!g#      dl        ZqeKj                  dmd!d"g#      dn        ZreKj                  dod!g#      dp        ZseKj                  dqd!d"g#      dr        ZteKj                  dsd"g#      dt        ZueKj                  dud!d"g#      dv        ZveKj                  dwd!g#      dx        ZweKj                  dyd!d"g#      dz        ZxeKj                  d{d"g#      d|        ZyeKj                  d}d!d"g#      d~        ZzeKj                  dd!g#      d        Z{eKj                  dd!d"g#      d        Z|eKj                  dd"g#      d        Z}eKj                  dd!d"g#      d        Z~eKj                  dd!g#      d        ZeKj                  dd!d"g#      d        ZeKj                  dd"g#      d        ZeKj                  dd!d"g#      d        ZeKj                  dd!d"g#      d        ZeKj                  dd!g#      d        ZeKj                  dd!g#      d        ZeKj                  dd!g#      d        ZeKj                  d      d        ZddZeKj                  dd!d"g#      d        ZeKj                  dd!d"g#      d        ZeKj                  d      d        ZeKj                  dd!d"g#      d        Zy)    )ObjectId)ValidationErrorNotUniqueError)
	Blueprintrequestrender_templateredirecturl_forsessionmake_responsejsonifyflashcurrent_app)Admin)Slider)Exam)check_password_hash)secure_filename)send_sms)datetimedate	timedeltatime)SubExamN)Coupon)Notification)DBRef)	OldPapers)MockTestMockTestQuestion)Ebook)Course)TransactionHistory)User)Q)BytesIOStringIOpdfi   c                 `    d| v xr) | j                  dd      d   j                         t        v S N.   )rsplitlowerEBOOK_ALLOWED_EXTENSIONSfilenames    ,/var/www/html/eduruby.in/routes/user_auth.pyallowed_ebookr3   !   s0    (?]xsA6q9??AE]]]    c                 `    d| v xr) | j                  dd      d   j                         t        v S r*   )r-   r.   OLD_PAPER_ALLOWED_EXTENSIONSr0   s    r2   allowed_old_paperr7   '   s0    (?axsA6q9??AEaaar4   >   jpgpngjpegwebp  c                 `    d| v xr) | j                  dd      d   j                         t        v S r*   )r-   r.   ALLOWED_EXTENSIONSr0   s    r2   allowed_filer?   -   s0    (?WxsA6q9??AEWWWr4   userz/userGETPOST)methodsc                     dt         v rt        t        d            S d } d }d }t        j                  dk(  rt        j
                  j                  d      }t        j
                  j                  d      }t        j
                  j                  d      dk(  }|t         _        |sd} |sd	}| s|rt        d
| |t              S t        j                  |      j                         }|sd}t        d
|      S t        |j                  |      sd}t        d
|      S |j                  dk7  rd}t        d
|      S t        t!        j"                  dd            }t        |j$                        t         d<   |t         d<   |j'                  |t)        j*                                |j-                          t/        |j0                  |      }|d   st        d
d      S t3        t        t        d                  }	|r|	j5                  d|d       |	S |	j5                  ddd       |	S t        j6                  j                  dd      }
t        d
|
       S )!Nr@   user.user_dashboardrB   usernamepasswordremember_meonzEnter usernamezEnter passwordzuser/login.html)username_errorpassword_errorr   )rF   zUsername does not existgeneral_errorzPassword is incorrectr,   zYour account is deactivated'  韆 user_temp_id	login_otpset__login_otpset__otp_created_atstatusz&Failed to send OTP due to server errorzuser.user_otp_verificationremembered_usernamei ' )max_age r   )expires)rV   )r   r	   r
   r   methodformget	permanentr   r   objectsfirstr   rG   rU   strrandomrandintidupdater   utcnowsaver   phoner   
set_cookiecookies)rJ   rK   rM   rF   rG   rH   r@   otpsms_responseresprV   s              r2   
user_loginrm   4   s    5677NNM~~<<##J/<<##J/ll&&}5='-N-N^"#4^2@'S S }}h/5575M"#4MRR"4==(;3M"#4MRR;;!9M"#4MRR &.../"%dgg,"3HOO<MN		

C0H%"#4DlmmXg.J&KLM OO18[OQ  OO12qOA "//--.CRH,BUVVr4   z/user/loginc                      t               S N)rm    r4   r2   user_login_aliasrq   w   s
    <r4   z/user/otp-verificationc                  6   dt         v rt        t        d            S t        j                  d      } | st        t        d            S t	        j
                  |       j                         }|st        t        d            S d }d }t        j                  dk(  rt        j                  j                  d      }|sd}t        d	|
      S |j                  r=t        j                         |j                  t        d      z   kD  rd}t        d	|      S ||j                  k7  rd}t        d	|      S t        j                   dd        t#        |j$                        t         d<   d |_        |j'                          t        t        d            S t        d	||      S )Nr@   rE   rP   user.user_loginrc   rB   rj   z	Enter OTPzuser/otp-verification.html)	otp_error   )minuteszOTP expired try to login againrL   zInvalid OTP)ru   rM   )r   r	   r
   r\   r   r^   r_   r   rZ   r[   r   otp_created_atr   re   r   rQ   popr`   rc   rf   )temp_user_idr@   ru   rM   	input_otps        r2   user_otp_verificationr|   }   s_     5677;;~.L 1233==L)//1D 1233 IM~~LL$$U+	 #I"#?9UU 8??#4t7J7JY_`Ma7a#a<M"#?}]]&)M"#?}]] 	ND)dgg, 		 567779\ijjr4   z/user/resend-otpc                     t        j                  d      } | st        ddd      dfS t        j                  |       j                         }|st        ddd      dfS t        t        j                  dd	            }|t         d
<   |j                  |t        j                                |j                          t        |j                  |      }|j                  d      st        ddd      S t        ddd      S )NrP   Fz"Session expired try to login again)rU   message  rt   z"User not found. Please login againrN   rO   rQ   rR   rU   z#Failed to send OTP. Try again laterTzOTP resent successfully)r   r\   r   r   r^   r_   r`   ra   rb   rd   r   re   rf   r   rg   )rz   r@   rj   rk   s       r2   resend_otp_ajaxr      s    ;;~.L%4XYZ\___==L)//1D%4XYZ\___ fnnUE*
+CGK 	KKs8IKJIIK DJJ,LH%%4YZ[[d/HIJJr4   z/user/dashboardc                  P    dt         vrt        t        d            S t        d      S )Nr@   rs   zuser/index.htmlr   r	   r
   r   rp   r4   r2   user_dashboardr      s'    W 1233,--r4   z/user/indexc                  *    t        t        d            S )NrE   )r	   r
   rp   r4   r2   user_index_aliasr      s    G1233r4   z/user/view-usersc                      dt         vrt        t        d            S 	 t        j                  j                  d      } t        d|       S # t        $ r$ t        j                  j                  d       g } Y 9w xY w)Nr@   rs   -created_datezFailed to load userszuser/view-users.htmlusers)r   r	   r
   r$   r^   order_by	Exceptionr   logger	exceptionr   r   s    r2   
view_usersr      so    W 1233%%o6
 1??	  $$%;<s   A
 
*A76A7z/user/view-uploaded-filesc                  P    dt         vrt        t        d            S t        d      S )Nr@   rs   zuser/view-uploaded-files.htmlr   rp   r4   r2   view_uploaded_filesr      '    W 1233:;;r4   z/user/view-quiz-historyc                  P    dt         vrt        t        d            S t        d      S )Nr@   rs   zuser/view-quiz-history.htmlr   rp   r4   r2   view_quiz_historyr      '    W 1233899r4   z/user/quiz-detail-historyc                  P    dt         vrt        t        d            S t        d      S )Nr@   rs   zuser/quiz-detail-history.htmlr   rp   r4   r2   quiz_detail_historyr      r   r4   z/user/add-sliderc                     dt         vrt        t        d            S i } d }t        j                  dk(  rst        j
                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }|r|j                  dk(  rd| d<   njt        |j                        sd	| d<   nO|j                  d
t        j                         |j                         }|j                  d
       |t        kD  rd| d<   |sd| d<   n5	 t        |      }t!        j"                  |      j%                         rd| d<   |sd| d<   | rt)        d| t              S 	 t+        |j                        }t        j,                  j/                  ddd      }t        j0                  |d       t        j,                  j/                  ||      }	|j3                  |	       t        j4                  j7                  dd      j9                  d      }
|	j7                  t        j:                  d      }|j=                  d      }|dk7  r	d||d  z   }nd|z   }|
 | }t!        |t        |            j3                          tA        d d!       t        t        d"            S t)        d      S # t&        $ r	 d| d<   Y tw xY w# t>        $ r}d}t)        d|t              cY d }~S d }~ww xY w)#Nr@   rs   rB   slider_imagesliderpositionrU   rX   zSelect slider image0Only JPG, JPEG, PNG, and WEBP images are allowedr   Image must be less than 500 KBEnter slider positionslide_positionSlider position must be uniquez'Slider position must be a numeric valueSelect statuszuser/add-slider.htmlerrorsr   staticuploadsslidersTexist_okhttp://https:///static/)imager   rU   Something went wrongrM   r   zSlider added successfullysuccesszuser.add_slider)!r   r	   r
   r   rZ   filesr\   r[   r1   r?   seekosSEEK_ENDtellMAX_FILE_SIZEintr   r^   r_   
ValueErrorr   r   pathjoinmakedirsrf   host_urlreplacerstripsepfindr   r   )r   rM   r   slider_positionrU   	file_sizeslider_position_intr1   upload_folder	save_pathbase_urlrelative_pathstatic_indexrelative_url	image_urles                   r2   
add_sliderr     s   W 1233FM~~}}((8!,,**+;<!!(+ |44:%:F>"l334%WF>"a-$))+Ia =()I~& '>F#$U&)/&:#>>1DEKKM/OF+, .F8 "& 	i&|'<'<=HGGLL9iHMKK5]H=Ii( ''//	:FMMcRH%--bffc:M(--i8Lr!"]<=%AA"]2#*\N3I 3FsSY{[``b 	)95 1233 122]  U+T'(UL  	i2M"#9`ghh	is1   4J3 ,DK 3KK	K/K*$K/*K/z/user/delete-slider/<slider_id>c                 (   dt         vrt        ddd      dfS 	 t        j                  |       j	                         }|st        ddd      dfS |j                          t        d	d
d      S # t        $ r}t        ddd      dfcY d }~S d }~ww xY w)Nr@   FUnauthorized accessr   r~   r   rt   zSlider not found  TzSlider deleted successfullyzFailed to delete slider  )r   r   r   r^   r_   deleter   )	slider_idsliderr   s      r2   delete_sliderr   V  s    W55JKLcQQV9-335u9KLMsRR44QRSS V55NOPRUUUV#   5A. A. .	B7BBBz/user/edit-slider/<slider_id>c                    dt         vrt        t        d            S t        j                  |       j                         }|s t        dd       t        t        d            S i }d }t        j                  dk(  rt        j                  j                  d      }t        j                  j                  d	      }t        j                  j                  d
      }|sd|d<   nP	 t        |      }t        j                  |      j                         }|r|j                  |j                  k7  rd|d<   |sd|d	<   |ry|j                  dk7  rjt!        |j                        sd|d
<   nO|j#                  dt$        j&                         |j)                         }	|j#                  d       |	t*        kD  rd|d
<   |rt-        d||t              S 	 |r|j                  dk7  rt/        |j                        }
t$        j0                  j3                  ddd      }t%        j4                  |d       t$        j0                  j3                  ||
      }|j7                  |       t        j8                  j;                  dd      j=                  d      }|j;                  t$        j>                  d      }|jA                  d      }|dk7  r	d||d  z   }nd|z   }| | }||_!        |_"        t        |      |_#        |j7                          t        d"d#       t-        d|$      S t-        d|$      S # t        $ r	 d|d<   Y w xY w# tH        $ r}d }t-        d||!      cY d }~S d }~ww xY w)%Nr@   rs   rt   zSlider not found.dangerzuser.view_slidersrB   r   rU   r   r   r   r   zSlider position must be numericr   rX   r   r   r   zuser/edit-slider.html)r   r   r   r   r   r   Tr   r   r   r   r   r   r   )rM   r   zSlider updated successfullyr   )r   )%r   r	   r
   r   r^   r_   r   r   rZ   r[   r\   r   r   rc   r   r1   r?   r   r   r   r   r   r   r   r   r   r   rf   r   r   r   r   r   r   r   rU   r   )r   r   r   rM   r   rU   r   r   existing_sliderr   r1   r   r   r   r   r   r   r   r   s                      r2   edit_sliderr   h  s   W 1233^^y)//1F!8, 3455FM~~!,,**+;<!!(+}}((8 '>F#$M&)/&:#"(..@S"T"Z"Z"\"'9'9VYY'F/OF+,
 .F8 L11R7 5 56)[~&!!!R[[1(--/	!!!$},-MF>*"'	 	h 5 5 ;*<+@+@A "Xy) LMD9GGLLA	!!),"++33IzJQQRUV ) 1 1"&&# >,11)<2%#&|})E#EL#&#6L'j7	($7F!KFMKKM 	+Y76vFF 26BBs  M+L'(Mb  	h2M"#:-`fgg	hs2   !AL% D7L: %L76L7:	MMMMz/user/view-slidersc                      dt         vrt        t        d            S t        j                         j                  d      } t        d|       S )Nr@   rs   r   zuser/view-sliders.htmlr   )r   r	   r
   r   r^   r   r   r   s    r2   view_slidersr     sA    W 1233nn''(89G3WEEr4   z/user/add-examc                     dt         vrt        t        d            S i } d }t        j                  dk(  rt        j
                  j                  d      }t        j
                  j                  d      }t        j
                  j                  d      }t        j
                  j                  d      }t        j
                  j                  d      }t        j                  j                  d	      }d }|sd
| d<   |sd| d<   n5	 t        |      }	t        j                  |	      j                         rd| d<   |r	 t        |      }
|
dk  rd| d<   nd }
|sd| d<   |ry|j                  dk7  rjt        |j                        sd| d	<   nO|j                  dt         j"                         |j%                         }|j                  d       |t&        kD  rd| d	<   | rt)        d| t              S |r|j                  dk7  r	 t+        |j                        }t         j,                  j/                  ddd      }t!        j0                  |d       t         j,                  j/                  ||      }|j3                  |       t        j4                  j7                  dd      j9                  d      }|j7                  t         j:                  d      }|j=                  d       }|d!k7  r	d||d  z   }nd|z   }| | }	 t        ||	t        |      |$      j3                          tA        d&d'       t        t        d(            S t)        d      S # t        $ r	 d| d<   Y w xY w# t        $ r	 d| d<   Y w xY w# t>        $ r}d"}t)        d|t        #      cY d }~S d }~ww xY w# t>        $ r}d%}t)        d|t        #      cY d }~S d }~ww xY w))Nr@   rs   rB   titledescriptionexam_positionexam_durationrU   iconEnter exam titleEnter exam positionr   Exam position must be uniqueExam position must be numericr   z'Exam duration must be a positive numberzExam duration must be numericr   rX   +Only JPG, JPEG, PNG, WEBP files are allowed"Exam icon must be less than 500 KBzuser/add-exam.htmlr   r   r   
exam_iconsTr   r   r   r   r   r   Exam icon upload failedr   
exam_titleexam_descriptionr   rU   r   r   zExam added successfullyr   zuser.add_exam)!r   r	   r
   r   rZ   r[   r\   r   r   r   r^   r_   r   r1   r?   r   r   r   r   r   r   r   r   r   r   rf   r   r   r   r   r   r   r   )r   rM   r   r   r   r   rU   r   icon_urlexam_position_intexam_duration_intr   r1   r   r   r   r   r   r   r   s                       r2   add_examr     sv   W 1233FM~~  )ll&&}5((9((9!!(+}}  ( 0F7O &;F?#J$'$6!<<.?@FFH.LF?+ J$'$6!$).WF?+ !%.F8 DMMR'.!Nv		!R[[) IIK			!},%IF6N "$  DMMR'k*4==9 "Xy, OMD9GGLLA			)$"++33IzJQQRUV ) 1 1"&&# >,11)<2%#&|})E#EL#&#6L&Z~6	g !,/6{ df
 	'3011/00W  J*I'J  J*I'J\  k 9&';=bijjk  	g2M"#7}^eff	gsa   4M 8M 9C7M- 1'N MMM*)M*-	N6N	NN	N> N93N>9N>z/user/view-examsc                      dt         vrt        t        d            S t        j                         j                  d      } t        d|       S )Nr@   rs   r   zuser/view-exams.htmlexams)r   r	   r
   r   r^   r   r   r   s    r2   
exams_listr   ;  sA    W 1233 LLN##O4E1??r4   z/user/delete-exam/<exam_id>c                 (   dt         vrt        ddd      dfS 	 t        j                  |       j	                         }|st        ddd      dfS |j                          t        d	d
d      S # t        $ r}t        ddd      dfcY d }~S d }~ww xY w)Nr@   Fr   r   r   rt   zExam not foundr   TzExam deleted successfullyzFailed to delete examr   )r   r   r   r^   r_   r   r   )exam_idexamr   s      r2   delete_examr   H  s    W55JKLcQQ
T||w'--/u9IJKSPP 	44OPQQ T55LMNPSSSTr   z/user/edit-exam/<exam_id>c                    dt         vrt        t        d            S i }d }t        j                  |       j                         }|s t        dd       t        t        d            S t        j                  dk(  r	t        j                  j                  d      }t        j                  j                  d	      }t        j                  j                  d
      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }	|j                  }
|sd|d<   |sd|d
<   nP	 t        |      }t        j                  |      j                         }|r|j                  |j                  k7  rd|d<   |sd|d<   |	ry|	j                   dk7  rjt#        |	j                         sd|d<   nO|	j%                  dt&        j(                         |	j+                         }|	j%                  d       |t,        kD  rd|d<   |rt/        d|||t              S |	r|	j                   dk7  r	 t1        |	j                         }t&        j2                  j5                  ddd      }t'        j6                  |d       t&        j2                  j5                  ||      }|	j9                  |       t        j:                  j=                  d d!      j?                  d"      }|j=                  t&        j@                  d"      }|jC                  d#      }|d$k7  r	d"||d  z   }nd"|z   }| | }
	 |jG                  ||t              t        |      |
'       t        d(d)       t/        d|*      S t/        d|*      S # t        $ r	 d|d<   Y w xY w# tD        $ r}d%}t/        d||t        &      cY d }~S d }~ww xY w# tD        $ r}d+}t/        d||t        &      cY d }~S d }~ww xY w),Nr@   rs   rt   zExam not found.r   zuser.exams_listrB   r   r   r   r   rU   r   r   r   r   r   r   r   r   rX   r   r   r   zuser/edit-exam.html)r   r   rM   r   r   r   r   Tr   r   r   r   r   r   r   )rM   r   r   r   zExam updated successfullyr   )r   r   )$r   r	   r
   r   r^   r_   r   r   rZ   r[   r\   r   r   r   rc   r   r1   r?   r   r   r   r   r   r   r   r   r   r   rf   r   r   r   r   r   r   rd   )r   r   rM   r   r   r   r   r   rU   r   r   r   existing_examr   r1   r   r   r   r   r   r   r   s                         r2   	edit_examr   \  s   W 1233FM<<7#))+D* 1233~~  )ll&&}5((9((9!!(+}}  (99 0F7O&;F?#K$'$6! $;L M S S U ]%5%5%@/MF+, .F8 DMMR'.!Nv		!R[[) IIK			!},%IF6N "%+  DMMR'w*4==9 "Xy, OMD9GGLLA			)$"++33IzJQQRUV ) 1 1"&&# >,11)<2%#&|})E#EL#&#6L&Z~6	sKK !,!"346{   -y9"#8tDD
 0t<<E  K+J'(K\  w 9&'<M`dnuvvw   	s2M"#8\`jqrr	ssQ   AN C7N& A O N#"N#&	O/O	O	O	O9O4.O94O9z/user/add-subexamc            
         dt         vrt        t        d            S i } d }t        j                  d      j                  d      }t        j                  dk(  r,t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d	      }t        j                  j                  d
      }t        j                  j                  d      }t        j                  j                  d      }d }	d }
|sd| d<   n+t        j                  |      j                         }
|
sd| d<   |r|j                         sd| d<   |sd| d
<   n	 t        |      }|sd| d<   |rt|j                  rht!        |j                        sd| d<   nM|j#                  dt$        j&                         |j)                         t*        kD  rd| d<   |j#                  d       | rt-        d| |t        |      S |r|j                  r	 t/        |j                        }t$        j0                  j3                  ddd      }t%        j4                  |d       t$        j0                  j3                  ||      }|j7                  |       t        j8                  j;                  dd      j=                  d       }|j;                  t$        j>                  d       }|jA                  d!      }|d"k7  r	d ||d  z   }nd |z   }| | }		 tE        |
|	|j                         |xs d%j                         xs d t        |      t        |      &      j7                          tG        d(d)       t        t        d*            S t-        d|+      S # t        $ r	 d| d
<   Y .w xY w# tB        $ r t-        dd#t        |$      cY S w xY w# tB        $ r t-        dd't        |$      cY S w xY w),Nr@   rs   r,   rU   r   rB   r   r   r   subexam_positionrU   r   Select examrt   Invalid exam selectedEnter subexam titlezEnter subexam position Subexam position must be numericr   r   r   Icon must be less than 500 KBzuser/add-subexam.html)r   rM   r   r   r   r   subexam_iconsTr   r   r   r   r   r   Subexam icon upload failed)rM   r   r   rX   )r   r   sub_exam_titlesub_exam_descriptionrU   position!Something went wrong while savingzSubexam added successfullyr   zuser.add_subexamr   )$r   r	   r
   r   r^   r   r   rZ   r[   r\   r   r_   stripr   r   r1   r?   r   r   r   r   r   r   r   r   r   r   rf   r   r   r   r   r   r   r   r   )r   rM   r   r   r   r   r  rU   r   r   parent_examposition_intr1   r   r   r   r   r   r   s                      r2   add_subexamr    s   W 1233FMLL"++L9E~~,,""9-  )ll&&}5"<<++,>?!!(+}}  ( -F9,,'288:K$;y!EKKM3F7O)AF%&P"#34 .F8DMM.!Nv		!R[[)99;.%DF6N		!"#:6Yfpw  @E  F  FDMMJ*4==9 "Xy/ RMD9GGLLA			)$ #++33IzJQQRUV ) 1 1"&&# >,11)<2%#&|})E#EL#&#6L&Z~6
	M#${{}&1&7R%>%>%@%HD6{-. df 	*I6 23442%@@m  P-O)*PH  J&'>Njt{  DI  J  JJ  	M"#:Jmw~  GL  M  M	Ms8   +N C7N( AO
 N%$N%(OO
O)(O)z/user/view-subexamsc                      dt         vrt        t        d            S t        j                         j                  d      } t        d|       S )Nr@   rs   r  zuser/view-subexams.htmlsubexams)r   r	   r
   r   r^   r   r   r  s    r2   subexams_listr     s@    W 1233 ))*5H4xHHr4   z/user/edit-subexam/<subexam_id>c           	      J   dt         vrt        t        d            S t        j                  |       j                         }|s t        dd       t        t        d            S t        j                  d      j                  d	      }i d }}t        j                  d
k(  r9t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }	t        j                  j                  d      }
d }|sd|d<   n+t        j                  |      j                         }|sd|d<   |r|j                         sd|d<   	 t        |      }|	sd|d<   |
rt|
j$                  rht'        |
j$                        sd|d<   nM|
j)                  dt*        j,                         |
j/                         t0        kD  rd|d<   |
j)                  d       |rt3        d||t        ||      S |j4                  }|
r|
j$                  r	 t7        |
j$                        }t*        j8                  j;                  ddd      }t+        j<                  |d       t*        j8                  j;                  ||      }|
j?                  |       t        j@                  jC                  d d!      jE                  d"      }|jC                  t*        jF                  d"      }|jI                  d#      }|d$k7  r	d"||d  z   }nd"|z   }| | }|jM                  |||j                         |xs d'j                         xs d t        |	      (       |jO                          t        d)d*       t        t        d+|jP                  ,            S t3        d||-      S # t         t"        f$ r	 d|d<   Y Lw xY w# tJ        $ r t3        dd%t        ||&      cY S w xY w).Nr@   rs   rt   Subexam not foundr   zuser.subexams_listr,   r   r   rB   r   r   r   r  rU   r   r  r  r  r  r   r   r   r  zuser/edit-subexam.html)r   rM   r   subexamr   r   r   r  Tr   r   r   r   r   r   r  )rM   r   r  r   rX   )set__exam_id	set__iconset__sub_exam_titleset__sub_exam_descriptionset__statusset__positionzSubexam updated successfullyr   zuser.edit_subexam)
subexam_id)r  r   ))r   r	   r
   r   r^   r_   r   r   r   r   rZ   r[   r\   r   r  r   	TypeErrorr   r1   r?   r   r   r   r   r   r   r   r   r   r   r   rf   r   r   r   r   r   r   rd   reloadrc   )r  r  r   r   rM   r   r   r   r  rU   r   r  r  r   r1   r   r   r   r   r   r   s                        r2   edit_subexamr!  (  s   W 1233oo,224G!8, 4566LL"++L9EMF~~,,""9-  )ll&&}5"<<++,>?!!(+}}  ( -F9,,'288:K$;y!EKKM3F7O	L/0L .F8DMM.!Nv		!R[[)99;.%DF6N		!"#;FZgqx  CJ  RW  X  X<<DMM\*4==9 "Xy/ RMD9GGLLA			)$ #++33IzJQQRUV ) 1 1"&&# >,11)<2%#&|})E#EL#&#6L&Z~6 	$ %'2'8b&?&?&A&ITF& 	 	
 	,i8 3

KLL3WERRi :& 	L)KF%&	LJ  \&'?Oku|  GN  V[  \  \\s%   'O' "C7P 'O?>O?P"!P"z!/user/delete-subexam/<subexam_id>c                    dt         vrt        dd      dfS t        j                  |       j	                         }|st        dd      dfS 	 |j                          t        d	d
      S # t        $ r t        dd      dfcY S w xY w)Nr@   FUnauthorizedr   r   rt   r  r   TzSubexam deletedDelete failedr   )r   r   r   r^   r_   r   r   )r  r  s     r2   delete_subexamr%    s    Wun=sBBoo,224Gu.ABCGGDt->?? Duo>CCD   A+ +BBz/user/add-couponc                     t        dt        j                         dt        vrt	        t        d            S t               } t        j                  dk(  r%t        j                  j                         }	 t        |j                  dd            }|dk  s|dkD  rd	| d<   t        |j                  d      |j                  d      |j                  d      dk(  r|j                  d      nd|j                  d      rt        |j                  d            nd |j                  d      |j                  d      t        |j                  dd                  }	 |j                          t	        t        d            S t)        d|       S # t        $ r d
| d<   Y w xY w# t        $ r d| d<   Y nSt        $ r}d| | d<   Y d }~n>d }~wt         $ r/}t"        j$                  j'                  d|       d| d<   Y d }~nd }~ww xY wt)        d| |      S )NzHANDLER CALLED:r@   rs   rB   discount_valuer   r,   d   )Discount value must be between 1 and 100. Discount value must be a number.r   codediscount_typeflat
percentage
start_dateend_daterU   )coupon_titlecoupon_codecoupon_typecoupon_valuecoupon_start_datecoupon_end_daterU   user.view_coupon_html_directzCoupon code already exists.zValidation failed: _globalzFailed to save coupon: %sz#Server error while creating coupon.zuser/add-coupon.html)r   oldr   )printr   rZ   r   r	   r
   dictr[   to_dictr   r\   r   r   rf   r   r   r   r   r   r   r   )r   datar(  couponver   s         r2   add_coupon_html_directrB    s   	
W^^,W 12336F~~||##%	J *:A!>?N!^c%9+V'( '*(59XXo5NPV5V1\h<@HHEU<VTXX&678\`"hh|4 HHZ0txx!,-
		FKKMG$BCDD 1@@/  	J'IF#$	J  	;:F6N 	;"5bT :F9 	F(()DaH EF9	F 5f$OOs<   4*F #F FFG;+G;3G  G;%G66G;z/user/view-couponc                  |   t        dt        j                         dt        vrt	        t        d            S 	 t        j                  j                  d      } | D cg c]  }|j                          }}t        d|      S # t        $ r,}t        j                  j                  d|       g } Y d }~Zd }~ww xY wc c}w )NzVIew Coupon:r@   rs   r   zFailed to fetch coupons: %szuser/view-coupons.html)coupons)r<  r   rZ   r   r	   r
   r   r^   r   r   r   r   r   to_jsonr   )rD  r   ccoupons_datas       r2   view_coupon_html_directrH    s    	.'..)W 1233..))/: *11AAIIK1L13LII	  $$%BAF 2s   B B9	B6
"B11B6z/user/delete-coupon/<coupon_id>c                    t        d       dt        vrUt        j                  j	                  d      dk(  st        j
                  rt        dd      dfS t        t        d	            S 	 t        j                  | 
      j                         }|sPd}t        j                  j	                  d      dk(  st        j
                  rt        d|      dfS t        |d       n_|j                          d}t        j                  j	                  d      dk(  st        j
                  rt        d|      dfS t        |d       t        t        d            S # t        $ r~}t        j                   j#                  d|       d}t        j                  j	                  d      dk(  st        j
                  rt        d|      dfcY d }~S t        |d       Y d }~d }~ww xY w)Nr   r@   X-Requested-WithXMLHttpRequestFr#  r   r   rs   rt   Coupon not found.r   r   zCoupon deleted.T   r   zFailed to delete coupon: %szError deleting coupon.r   user_bp.view_coupon_html_direct)r<  r   r   headersr\   is_jsonr   r	   r
   r   r^   r_   r   r   r   r   r   r   )	coupon_idrF  r~   r   s       r2   delete_couponrR    sz   	(OW??126FF'//5.A3FF 1233!NNi(..0)G""#56:JJgooug>CC'8$HHJ'G""#56:JJgootW=sBB'9% G=>??  !$$%BAF*??126FF'//5':C??gx  !s3   *A(E AE 3E 	GA"G>GGGz/user/edit-coupon/<coupon_id>c                    dt         vrt        t        d            S t        j                  |       j                         }t        dt        j                         t        dt        j                  j                  d      |j                         |s t        dd       t        t        d	            S t        d
t        t        j                  j                  d                   i }t        j                  dk(  r	 t        t        j                  j                  dd            }|dk  s|dkD  rd|d<   n||_        t        j                  j                  d      xs |j"                  |_        t        j                  j                  d      xs |j$                  |_        t        j                  j                  d      xs |j&                  |_        t        j                  j                  d      xs |j                  |_        t        j                  j                  d      }t        j                  j                  d      }|rt)        j*                  t)        j,                  |d      j/                         |j0                  r|j0                  j3                         nt(        j4                  j3                               |_        |rt)        j*                  t)        j,                  |d      j/                         |j6                  r|j6                  j3                         nt(        j4                  j3                               |_        t        t        j                  j                  d            |_
        |rt9        d|j;                         |      S t        d|j                         |j=                          t        dd       t        t        d            S t9        d|j;                               S # t         $ r	 d|d<   Y w xY w)Nr@   rs   rt   zform:zstatus data:rU   rL  r   rN  zform data of status:rB   r5  r   r,   r)  r*  r+  r2  r3  r4  r6  r7  %Y-%m-%dzuser/edit-coupon.html)r@  r   zinside post:zCoupon updated.r   r8  )r@  )r   r	   r
   r   r^   r_   r<  r   r[   r\   rU   r   typerZ   r   r5  r   r2  r3  r4  r   combinestrptimer   r6  r   minr7  r   rE  rf   )rQ  r@  r   valuer0  r1  s         r2   edit_couponrZ    s   W 1233^^y)//1F	'',,	.))(3FMMB!8, ABCC	
 gll&6&6x&@!ABF~~	H((;<EqyECK)T~&&+# &ll..~>U&BUBU$\\--m<R@R@R$\\--m<R@R@R%ll..~>U&BUBU\\%%&9:
<<##$56'/'7'7!!*j9>>@393K3K((--/QYQ]Q]QbQbQd(F$
 %-%5%5!!(J7<<>171G1G&&++-X\\M^M^M`&F" GLL,,X67"#:6>>CS\bccnV]]++ >?@@26>>;KLL7  	H%GF>"	Hs   :A O. .P ?P z/user/add-coursec                     i } i }d}t         j                  dk(  r_t         j                  j                         }t	        d|       t         j                  j                  d      xs d}t         j                  j                  d      xs d}t         j                  j                  d      xs d}t         j                  j                  d      xs d}t         j                  j                  d      xs d}t         j                  j                  d	      xs d}t         j                  j                  d
      xs d}	t         j                  j                  d      xs d}
t         j                  j                  d      }t         j                  j                  d      }|sd| d<   |sd| d<   |sd| d<   |sd| d<   |sd| d	<   t        |	      t        |      k\  rd| d
<   |
sd| d<   d }d }|r!	 t        j                  j                  |      }|r!	 t        j                  j                  |      }t	        d|        |r|j                  dk7  rt        |j                        sd| d<   np	 |j                  j                  dt         j"                         |j                  j%                         }|j                  j                  d       ||t(        kD  rd| d<   | s\|rY|j                  dk7  rI	 t+        |j                        }t         j,                  j/                  t0        j2                  xs ddd      }t!        j4                  |d        t         j,                  j/                  ||      }|j7                  |       t         j8                  j;                  d!      }|j=                  t         j>                  d!      }|jA                  d"      }|d#k7  r	d!||d  z   }nTd!t         j,                  jC                  |t!        jD                         $      j=                  t         j>                  d!      z   }| | }| sF	 tK        |||||||	|
||'
      }|j7                          tM        d(d)       tO        tQ        d*            S t        j                  jW                  d,-      jY                  d.      }g }|j                  d      }|r1t        j                  jW                  |d,/      jY                  d.      }n?|r=t        j                  jW                  |d   jZ                  d,/      jY                  d.      }t]        d0||| |1      S # t        $ r	 d| d<   Y Gw xY w# t        $ r	 d| d<   Y 9w xY w# t&        $ r d }Y w xY w# t&        $ r( t0        jF                  jI                  d%       d&| d<   Y xw xY w# tR        $ r}tU        |      | d+<   Y d }~Qd }~ww xY w)2NrX   rB   z
form data:r   sub_exam_idr   feesrU   r  discounted_feesdurationcourse_imagelanguagePlease select an exam.Please select a sub exam.Course title is required.zPlease select a statusPosition is required.%Discount fees must be less than fees.Duration is required.rt   Selected exam not found.Selected sub exam not found.zerror:1Only JPG, JPEG, PNG, GIF, WEBP files are allowed.r   r   Image must be less than 500 KB.r   r   Tr   r   r   r   )startCourse image upload failedImage upload failed.)
r   r\  course_title
course_feerU   r  discounted_feer_  r`  ra  zCourse added successfullyr   user.view_coursesgeneralr,   r   namer   rU   zuser/add-course.html)r   r  r   	form_data)/r   rZ   r[   r>  r<  r\   r   r   r   r^   DoesNotExistr   r1   r?   streamr   r   r   r   r   r   r   r   r   r   static_folderr   rf   r   r   r   r   r   relpathgetcwdr   r   r"   r   r	   r
   r   r`   filterr   rc   r   )r   rv  r   r   r\  ro  r]  rU   r  discount_feesr_  img_filera  exam_objsub_objr   r1   r   r   r   r   r   r   courser   r   r  chosen_exam_ids                               r2   
add_courser    s    FII~~LL((*	l9%,,""9-3ll&&}5;||''06B\\f%+||)/R!!*-3ll&&'89?R!!*-3"">2!!*- 8F9$?F=!8F6N7F8!8F:}s4y((OF$%!8F:?<<++w+7 G!//---= 	hv))R/ 1 12"Uw%OO((BKK8 ( 4 4 6IOO((+ (Y-F&GF7OH--3=.x/@/@AH$&GGLL1J1J1VhXacq$rMKK= "]H EIMM),  '//66s;H$-$5$5bffc$BM#0#5#5i#@L#r)'*]<=-I'I (+RWW__Ybiik_-Z-b-bcecicikn-o'o#+*\N ;I +&")#/#!%#0%!*% 19=(; <==
 LLq)226:EH]]9-N??)).)KTTU[\ --eAhkk!-LUUV\]H1!&$,"(%.	0 0g   ?$>y!?
   G(F}%G ! % $I%8 ! =&&001MN&<F7O=, # +$'Fy!+sc   ( T>  U $AU( *EU: 5AV. >UUU%$U%(U76U7:-V+*V+.	W7WWz/user/view-coursesc                      	 t         j                  j                  d      j                         } t	        d|        t        d|       S # t
        $ r" t         j                  j                  d      } Y 7w xY w)Nr   zcourses:zuser/view-courses.htmlcourses)r"   r^   r   select_relatedr<  r   r   r  s    r2   view_coursesr    sc    ;..))/:IIKj!
 3WEE	  ;..))/:;s   9A (A32A3z/user/edit-course/<course_id>c                    h dd}fd}dt         vrt        t        d            S 	 t        j                  j                  |       }i }d }i }t        |dd       rt        |d      j                  ndt        |dd       rt        |d      j                  ndt        |dd      xs t        |dd      t        |dd      xs t        |dd      t        t        |dd            t        |dd      xs dt        |dd      xs dt        |dd      xs dt        |dd      xs dt        |dd       xs t        |dd       xs t        |dd       d
}t        j                   dk(  rt        j"                  j%                         }t        j"                  j                  d      xs dj'                         }t        j"                  j                  d      xs d}t        j"                  j                  d      xs d}	t        j"                  j                  d      xs d}
t        j"                  j                  d      xs d}t        j"                  j                  d      xs d}t        j"                  j                  d      xs d}t        j"                  j                  d      xs d}t        j"                  j                  d      xs d}t        j(                  j                  d      }|sd|d<   |	sd |d<   |sd!|d<   |
sd"|d<   |sd#|d<   |sd$|d<   t+        |      t+        |
      k\  rd%|d<   |sd&|d<   d }d }|r!	 t,        j                  j                  |      }|	r!	 t.        j                  j                  |	      }|r|j0                  dk7  r ||j0                        sd)|d<   nl	 |j2                  j5                  d*t6        j8                         |j2                  j;                         }|j2                  j5                  d*       |
||kD  rd+|d<   |s9	 ||_        |
|_        ||_         	 t+        |      |_!        ||_$        ||_%        ||_&        |r||_'        |r||_(        |r|j0                  dk7  r	 tS        |j0                        }t6        jT                  jW                  t        jX                  xs d,d-d      }t7        jZ                  |d./       t6        jT                  jW                  ||      }|j]                  |       d0| }t        d,|1      }||_/        |j]                          t        d4d5       t        t        d	            S t,        j                  jc                  d:;      je                  d<      }g }|j                  d      }|r1t.        j                  jc                  |d:=      je                  d<      }n?|r=t.        j                  jc                  |d*   j                  d:=      je                  d<      }tg        d>|||||?      S # t        $ r# t        dd       t        t        d	            cY S t        $ rB t        j                  j                  d
       t        dd       t        t        d	            cY S w xY w# t        $ r	 d'|d<   Y Bw xY w# t        $ r	 d(|d<   Y 4w xY w# t        $ r d }Y w xY w# tD        tF        f$ r ||_!        Y w xY w# t        $ r( t        j                  j                  d2       d3|d<   Y w xY w# t`        $ r8}t        j                  j                  d6       t        |      |d7<   Y d }~d }~wt        $ r( t        j                  j                  d8       d9|d7<   Y 9w xY w)@N>   gifr8   r9   r:   r;   r<   c                 Z    d| v xr% | j                  dd      d   j                         v S r*   r-   r.   fnameALLOWED_EXTs    r2   r?   z!edit_course.<locals>.allowed_file  0    e|NS! 4Q 7 = = ?; NNr4   r@   rs   rt   zCourse not found.r   rr  zError fetching coursezUnable to load course.r   rX   r\  ro  r   rp  r]  rU   1r  rq  r_  ra  r`  r   r   )
r   r\  r   r]  rU   r  r^  r_  ra  r`  rB   r^  rb  rc  rd  zCourse fees is required.zPlease select a status.re  rf  rg  rh  ri  rj  r   rk  r   r   Tr   zuploads/course_image/r0   rm  rn  zCourse updated successfullyr   zValidation error saving coursers  zFailed to update coursezFailed to update course.r,   r   rt  ru  zuser/edit-course.html)r   r  r   rv  r  )4r   r	   r
   r"   r^   r\   rw  r   r   r   r   r   getattrrc   r`   r   rZ   r[   r>  r  r   r   r   r   r1   rx  r   r   r   r   ro  rp  ra  rU   r  r   r  rq  r_  r   r\  r   r   r   ry  r   rf   r`  r   r|  r   r   )	course_idr   r?   r  r   rM   rv  r   r   r\  r]  rU   r  r}  r_  ra  r~  r  r  r   r1   r   r   static_filenamer   r   r   r  r  r  s                                @r2   edit_courser    s    8KMO W 12336##y#1 FMI 5<FIt4T769-00Z\<CFM[_<`wv}588fh4TQS8Tb1PWVVR5Pgfh45FJ39r"6+;R@FBFJ39rFJ39r=  FQXZ^A_  Fcjkqs~  AE  dFI ~~LL((*	!!'*0b779,,""9-3ll&&}5;||'-2!!(+1r<<##J/52(():;Ar<<##J/52<<##J/52==$$^4  8F9$?F=!9F7O7F6N8F8!8F:}s4y((OF$%!8F: ?<<++w+7 G!//---=
 ))R/ 1 12"Uw%OO((BKK8 ( 4 4 6IOO((+ (Y-F&GF7O-?&+#$(! (+$'KFM #+(5%"*%-FN)0F&
  1 1R 7A#283D3D#E(*[5N5N5ZRZ\egu(vMDA$&GGLL$I	 i0 -B(*L'.x/'R.:+ 3Y?(; <== LLq)226:EH]]9-N??)).)KTTU[\--eAhkk!-LUUV\]H2!&$,"(%."(* *c  6!8, 3455 6$$%<=&1 34556z   ?$>y!?
   G(F}%G ! % $I% ":. +$*FM+4 % A#**445QR*@wA # +"",,-MN$'Fy! ?"",,-FG$>y!?s    X > Z ! Z$ +AZ9 \ 0[  8\ 9B)[( "/\ )ZAZZZ! Z!$Z65Z69[[[%!\ $[%%\ (-\\ \\ 	^%-]0^^z&/user/delete-course/<string:course_id>c                 ^   	 t         j                  j                  |       }	 |j                          t	        dd      S # t        $ r t	        dd      dfcY S t
        $ r"}t	        dt        |            dfcY d }~S d }~ww xY w# t
        $ r}t	        dd	|       dfcY d }~S d }~ww xY w)
Nrt   FzCourse not foundr   r   r   TzCourse deleted successfullyzCould not delete course: )r"   r^   r\   rw  r   r   r`   r   )r  r  r   s      r2   delete_courser  M  s    ;##y#1Tt-JKK  Gu.@A3FF ;uc!f5s::;  Tu0I!.MNPSSSTs@    A  B  BB"A?9B?B	B,B'!B,'B,z"/user/view-course-purchase-historyc                  P    dt         vrt        t        d            S t        d      S )Nr@   rs   z&user/view-course-purchase-history.htmlr   rp   r4   r2   view_course_purchase_historyr  ]  s'    W 1233CDDr4   z/user/add-notificationc                     h dd} fd}dt         vrt        t        d            S i }d }d }t        j                  dk(  rt        j
                  j                  d      xs dj                         }t        j
                  j                  d	      xs dj                         }t        j
                  j                  d
      }t        j                  j                  d      }|sd|d<   |sd|d
<   |r|j                  dk7  r ||j                        sd|d<   nl	 |j                  j                  dt        j                         |j                  j                         }	|j                  j                  d       |	
|	| kD  rd|d<   |rt!        d|t        j
                        S |r|j                  dk7  r	 t#        |j                        }
t        j$                  j'                  ddd      }t        j(                  |d       t        j$                  j'                  ||
      }|j+                  |       t        j,                  j/                  dd      j1                  d      }|j/                  t        j2                  d      }|j5                  d      }|dk7  r	d||d  z   }nd|z   }| | }	 	 t=        |      }tC        ||r|nd |tE        jF                         !      }|j+                          tI        d"d#       t        t        d$            S t!        d|&      S # t        $ r d }	Y w xY w# t        $ r@ t6        j8                  j;                  d       d}t!        d|t        j
                        cY S w xY w# t>        t@        f$ r d }Y w xY w# t        $ r@ t6        j8                  j;                  d%       d%}t!        d|t        j
                        cY S w xY w)'N>   r  r8   r9   r:   r;   r<   c                 Z    d| v xr% | j                  dd      d   j                         v S r*   r  r  s    r2   r?   z&add_notification.<locals>.allowed_filen  r  r4   r@   rs   rB   r   rX   r   rU   r   Title is required.r   r   r   r   zuser/add-notification.html)r   rv  r   r   notification_imageTr   r   r   r   r   r   z Notification image upload failedImage upload failed)rM   rv  r,   )r   r   r   rU   created_datez Notification added successfully.r   user.view_notificationszFailed to save notificationr;  )%r   r	   r
   r   rZ   r[   r\   r  r   r1   rx  r   r   r   r   r   r   r   r   r   r   rf   r   r   r   r   r   r   r   r   r   r  r   r   r   re   r   )r   r?   r   rM   r   r   r   rU   r~  r   r1   r   r   r   r   r   r   r   
status_intnotificationr  s                       @r2   add_notificationr  h  s    8KMO W 1233FMI~~!!'*0b779||''6<"CCE!!(+==$$W- 2F7O.F8 ))R/ 1 12"Ow%OO((BKK8 ( 4 4 6IOO((+ (Y-F&FF7O ",!,,  ))R/z():):; "XyBV WMD9GGLLA	i("++33IzJQQRUV ) 1 1"&&# >,11)<2%#&|})E#EL#&#6L&Z~6	v [
 ('"*h!%__.L 4i@G$=>?? 7GG} ! % $I%B  z"",,-OP 5&'CS`lslxlxyyz z* 
  	v(()FG9M"#?}hohthtuu	vsY   AL 7C7L0 0M< ;AN L-,L-0AM98M9<NN NN AOOz/user/view-notificationsc                      dt         vrt        t        d            S t        j                  j                  d      } t        d|       S )Nr@   rs   r   zuser/view-notifications.htmlnotifications)r   r	   r
   r   r^   r   r   r  s    r2   view_notificationsr    sD    W 1233 ((11/BM9)68 8r4   z0/user/edit-notification/<string:notification_id>c                 :   dt         vrt        t        d            S t        j                  |       j                         }|s t        dd       t        t        d            S i }t        j                  dk(  rt        j                  j                  d      xs d	j                         }t        j                  j                  d
      xs d	j                         }t        j                  j                  d      }t        t        j                  j                  dd            }|j                  }t        dt!        t        j                  j#                                      t        d|       |sd|d<   |sd|d
<   |rt%        d||      S |r|j&                  r	 t)        |j&                        }t*        j,                  j/                  t0        j2                  dd      }	t+        j4                  |	d       t*        j,                  j/                  |	|      }
|j7                  |
       t        dd| dd      }	 ||_        ||_         ||_        ||_!        |j7                          t        dd       t        t        d            S t%        d|#      S # t8        $ r7}t0        j:                  j=                  d       t%        d|d      cY d }~S d }~ww xY w# t8        $ r=}t0        j:                  j=                  d |       d!|d"<   t%        d||      cY d }~S d }~ww xY w)$Nr@   rs   rt   Notification not found.r   r  rB   r   rX   r   r   rU   r,   zrequest.files keys:z	img_file:r  zDescription is required.zuser/edit-notification.html)r  r   r   r  Tr   r   zuploads/notifications/https)r1   	_external_schemer  )r  rM   z"Notification updated successfully.r   z!Failed to update notification: %sz)Server error while updating notification.r9  )r  )"r   r	   r
   r   r^   r_   r   r   rZ   r[   r\   r  r   r   r   r<  listkeysr   r1   r   r   r   r   r   ry  r   rf   r   r   r   r   r   rU   )notification_idr  r   r   r   r~  rU   r   r1   r   r   r   s               r2   edit_notificationr    s   W 1233''?;AACL'2 9:;;F~~!!'*0b779||''6<"CCE==$$W-W\\%%h23 !&&	#T'--*<*<*>%?@k8$2F7O$>F=!"#@0<*02 2 ))L*8+<+<= "[-F-F	Sb cMD9GGLLA	i( $H9OPXz7Zfjt{|		2!&L'2L$!*L"(L6	BG$=>?? 8|TT+  L"",,-BC&'D4@5JL LL  	2(()LaP KF9"#@0<*02 2	2s>   BJ 8AK 	K,KKK	L2LLLz2/user/delete-notification/<string:notification_id>c                 B   dt         vrFt        j                  j                  d      dk(  rt	        ddd      dfS t        t        d            S t        j                  | 	      j                         }|sRt        j                  j                  d      dk(  rt	        dd
d      dfS t        dd       t        t        d            S 	 |j                          t        j                  j                  d      dk(  rt	        ddd      S t        dd       t        t        d            S # t        $ rm}t        j                  j                  d|       t        j                  j                  d      dk(  rt	        ddd      dfcY d }~S t        dd       Y d }~d }~ww xY w)Nr@   rJ  rK  Fr#  r   r   rs   rt   zNotification not foundr   r  r   r  TzNotification deleted.z"Notification deleted successfully.r   z!Failed to delete notification: %szFailed to delete.r   zCould not delete notification.)r   r   rO  r\   r   r	   r
   r   r^   r_   r   r   r   r   r   r   )r  r  r   s      r2   delete_notificationr  #  sq   W??126FFuHI3NN 1233''?;AACL??126FFu9QRSUXXX'2 9:;;	:??126FFt8OPQQ2I> G5677  :$$%H!L??126FFu9LMNPSSS.99	:s+   ?D( D( (	F1AFFFFz/user/add-videosc                  P    dt         vrt        t        d            S t        d      S )Nr@   rs   zuser/add-videos.htmlr   rp   r4   r2   
add_videosr  B  s'    W 1233122r4   z/user/view-video-coursesc                  P    dt         vrt        t        d            S t        d      S )Nr@   rs   zuser/view-video-courses.htmlr   rp   r4   r2   view_video_coursesr  K  s'    W 12339::r4   z/user/add-ebookc                  0   dt         vrt        t        d            S i d }} t        j                  d      j                  d      }t        j                  d      j                  d      }t        j                  dk(  rEt        j                  j                  d      }t        j                  j                  d	      }t        j                  j                  d
      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }	|r$t        j                  |      j                         nd }
|
sd| d<   |r$t        j                  |      j                         nd }|sd| d	<   n|
r|j                  |
k7  rd| d	<   |r|j                         sd| d
<   |r|j                         sd| d<   |sd| d<   |	r|	j                  dk(  rd| d<   nht!        |	j                        sd| d<   nM|	j#                  dt$        j&                         |	j)                         t*        kD  rd| d<   |	j#                  d       | rt-        d| |t        ||      S 	 t/        |	j                        }t1        j2                         j4                  }t$        j6                  j9                  ddd      }t%        j:                  |d        t$        j6                  j9                  || d!|       }|	j=                  |       |j?                  t$        j@                  d"      }|jC                  d#      }|d$k7  rd"||d  z   nd"|z   }	 tG        |
|d |j                         |j                         |tI        |      '      j=                          tK        d)d*       t        t        d+            S t-        d||,      S # tD        $ r t-        dd%t        ||&      cY S w xY w# tD        $ r t-        dd(t        ||&      cY S w xY w)-Nr@   rs   r,   r   r   r	  rB   r   r\  r   authorrU   
ebook_filert   r  Select subexam(Subexam does not belong to selected examEnter ebook titleEnter authorr   rX   
Select PDFOnly PDF files are allowedr   File must be less than 10 MBzuser/add-ebook.htmlr   rM   r   r   r  r   r   ebooksTr   _r   r   r   Ebook upload failedrM   r   r   r  )r   r\  r  r   r  	file_pathrU   r  zEbook added successfullyr   zuser.add_ebookr   r  )&r   r	   r
   r   r^   r   r   r   rZ   r[   r\   r   r_   r   r  r1   r3   r   r   r   r   MAX_EBOOK_SIZEr   r   uuiduuid4hexr   r   r   rf   r   r   r   r   r!   r   r   )r   rM   r   r  r   r\  r   r  rU   r  r   r  r1   uidr   r   rpidxfile_urls                      r2   	add_ebookr  T  s   W 1233MFLL"++L9Ea(112BCH~~,,""9-ll&&}5  )!!(+!!(+]]&&|4
3:t||w'--/ -F9=H'//[1779d$4F=!goo-$NF=!EKKM1F7OV\\^-F8.F8Z00B6#/F< z223#?F< OOAr{{+ >1'E|$OOA"#8*0+2%(T T
	T&z':':;H**,""CGGLL9hGMKK5]se1XJ4GHIOOI&""2663/B'')$C),sRX~bH	T#kkm||~"6{ df 	()4 01220QQ/  	T"#81F+2%(T T	T  	T"#81T+2%(T T	Ts&   :C$O AO5 O21O25PPz/user/view-ebooksc                     dt         vrt        t        d            S t        j                         j                  d      } g }| D ]a  }d}d}	 |j                  rt        |j                  dd      xs d}	 |j                  rt        |j                  dd      xs d}|dk(  s|dk(  r	 |j                  sIt        |dd       r<t        |j                  dd       r%t        |j                  j                  d|      xs |}	 |j                  sIt        |dd       r<t        |j                  d	d       r%t        |j                  j                  d|      xs |}|j                  t        |j                        |j                  |j                  |||j                   |j"                  d
       d t%        d| |      S # t        $ r d}Y Qw xY w# t        $ r d}Y ;w xY w# t        $ r Y w xY w# t        $ r Y w xY w)Nr@   rs   r   -r   r	  r  r   r\  )rc   r   r  r   subexam_titlepublication_daterU   zuser/view-ebooks.html)r  	view_rows)r   r	   r
   r!   r^   r   r   r  r   r\  r  appendr`   rc   r   r  r  rU   r   )r  r  ebr   r  s        r2   ebooks_listr    s   W 1233]]_%%o6F I &
	zz$RZZsCJs
	 ~~ '8H# N URU
  4zzgb+t&DQSQ]Q]_hjnIo!()=)=|Z!X!f\fJ~~'"k4*HWUWUaUacprvMw$+BLL,D,DFVXe$f$wjwM 	bee*XXii$* " 3 3ii
 	=&R 26YWWC  	J	  	 M	   
  J   'F75'G	'AG=AG*7GG	GG	G'&G'*	G65G6z/user/edit-ebook/<ebook_id>c           	      (
   dt         vrt        t        d            S t        j                  |       j                         }|s t        dd       t        t        d            S t        j                  d      j                  d	      }t        j                  d      j                  d
      }i d }}t        j                  dk(  rt        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }	t        j                  j                  d      }
t        j                  j                  d      }|r$t        j                  |      j                         nd }|sd|d<   |r$t        j                  |      j                         nd }|sd|d<   n|r|j                  |k7  rd|d<   |r|j!                         sd|d<   |	r|	j!                         sd|d<   |
sd|d<   d }|rw|j"                  dk7  rht%        |j"                        sd|d<   nM|j'                  dt(        j*                         |j-                         t.        kD  rd|d<   |j'                  d       |rt1        d||t        |||      S |rk|j"                  dk7  r[	 t3        |j"                        }t5        j6                         j8                  }t(        j:                  j=                  ddd       }t)        j>                  |d!"       t(        j:                  j=                  || d#|       }|jA                  |       |jC                  t(        jD                  d$      }|jG                  d%      }|d&k7  rd$||d  z   nd$|z   }|jH                  rj|jH                  jK                  d'      rO|jH                  jM                  d$      }t(        j:                  jO                  |      rt)        jP                  |       	 ||d |j!                         |	j!                         tU        |
      d*}|r||d+<    |jV                  d2i | |jY                          t        d,d-       t        t        d.|jZ                  /            S t1        d|||1      S # tR        $ r Y w xY w# tR        $ r t1        dd(t        |||)      cY S w xY w# tR        $ r t1        dd0t        |||)      cY S w xY w)3Nr@   rs   rt   Ebook not foundr   zuser.ebooks_listr,   r   r   r	  rB   r   r\  r   r  rU   r  r  r  r  r  r  r   rX   r  r   r  zuser/edit-ebook.html)r   rM   r   ebookr   r  r   r   r  Tr   r  r   r   r   /static/r  )rM   r   r  r   r  )r  set__sub_exam_idset__course_id
set__titleset__authorr  set__file_pathzEbook updated successfullyr   zuser.edit_ebook)ebook_idr  )r  r   r  rp   ).r   r	   r
   r!   r^   r_   r   r   r   r   r   rZ   r[   r\   r   r   r  r1   r3   r   r   r   r   r  r   r   r  r  r  r   r   r   rf   r   r   r   r  
startswithlstripisfileremover   r   rd   r   rc   )r  r  r   r  r   rM   r   r\  r   r  rU   r  r   r  new_file_urlr1   r  r   r   r  r  old_absupdate_fieldss                          r2   
edit_ebookr    sK   W 1233MMX&,,.E* 2344LL"++L9Ea(112BCHMF~~,,""9-ll&&}5  )!!(+!!(+]]&&|4
3:t||w'--/ -F9=H'//[1779d$4F=!goo-$NF=!EKKM1F7OV\\^-F8.F8*--3 !4!45'C|$2;;/??$~5+IF<(""#9*0+2%uW_a a *--3e*:+>+>?jjl&& "Xy( KMD9GGLL3%q
8KL		*&&rvvs3ggi(14sRX~b??u'A'A*'M#oo44S9Gww~~g.YYw/	a $$+"&#kkm%||~"6{M 2>./ELL)=)LLN.	:G$5IJJ 1!&ehH H7  ).$. e&'=5J/6e5[ce ee*  	a"#91T+2%uW_a a	asD   ES R= +BS0 =	S	S S		S S-,S-0TTz/user/delete-ebook/<ebook_id>c                    dt         vrt        dd      dfS t        j                  |       j	                         }|st        dd      dfS 	 |j
                  rj|j
                  j                  d	      rO|j
                  j                  d
      }t        j                  j                  |      rt        j                  |       |j                          t        dd      S # t        $ r Y (w xY w# t        $ r t        dd      dfcY S w xY w)Nr@   Fr#  r   r   rt   r  r   r  r   TzEbook deletedr$  r   )r   r   r!   r^   r_   r  r  r  r   r   r  r  r   r   )r  r  abs_paths      r2   delete_ebookr  H  s    Wun=sBB	(	#	)	)	+Bu.?@#EE	D<<BLL33J?||**3/Hww~~h'YYx(
		t_== !&$&  Duo>CCD7   A!C0 /C! C0 !	C-*C0 ,C--C0 0D
Dz/user/add-old-paperc                     dt         vrt        t        d            S i d }} t        j                  d      j                  d      }t        j                  d      j                  d      }t        j                  dk(  rlt        j                  j                  d      }t        j                  j                  d	      }t        j                  j                  d
      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }	t        j                  j                  d      }
|r$t        j                  |      j                         nd }|sd| d<   |r$t        j                  |      j                         nd }|sd| d	<   n|r|j                  |k7  rd| d	<   |r|j                         sd| d
<   	 t        |      }|dk  rd| d<   	 t        |      }|dk  rd| d<   |	sd| d<   |
r|
j$                  dk(  rd| d<   nht'        |
j$                        sd| d<   nM|
j)                  dt*        j,                         |
j/                         t0        kD  rd| d<   |
j)                  d       | rt3        d| |t        ||      S 	 t5        |
j$                        }t7        j8                         j:                  }t*        j<                  j?                  d d!d"      }t+        j@                  |d#$       t*        j<                  j?                  || d%|       }|
jC                  |       |jE                  t*        jF                  d&      }|jI                  d'      }|d(k7  rd&||d  z   nd&|z   }	 tM        ||d |j                         |t        |	      +      jC                          tO        d-d.       t        t        d/            S t3        d||0      S # t         t"        f$ r	 d| d<   Y w xY w# t         t"        f$ r	 d| d<   Y w xY w# tJ        $ r t3        dd)t        ||*      cY S w xY w# tJ        $ r t3        dd,t        ||*      cY S w xY w)1Nr@   rs   r,   r   r   r	  rB   r   r\  paper_titler_  number_of_questionsrU   content_filert   r  r  r  Enter paper titler   Duration must be positiveDuration must be numericNumber must be positiveNumber must be numericr   rX   r  r  r  zuser/add-old-paper.htmlr  r   r   
old_papersTr   r  r   r   r   PDF upload failedr  )r   r\  r  r  r_  r  content_file_pathrU   r  zOld paper added successfullyr   zuser.add_old_paperr  )(r   r	   r
   r   r^   r   r   r   rZ   r[   r\   r   r_   r   r  r   r  r   r1   r7   r   r   r   r   MAX_OLD_PAPER_SIZEr   r   r  r  r  r   r   r   rf   r   r   r   r   r   r   )r   rM   r   r  r   r\  r  r_  r  rU   r  r   r  duration_intnoq_intr1   r  r   r   r  r  r  s                         r2   add_old_paperr  ]  s   W 1233MFLL"++L9Ea(112BCH~~,,""9-ll&&}5ll&&}5<<##J/%ll../DE!!(+}}((83:t||w'--/ -F9=H'//[1779d$4F=!goo-$NF=!+"3"3"5$7F=!	<x=Lq %@z"	E-.G!|0I,- .F8|44:%1F>""<#8#89%AF>"a-  "%77)G~&a "#<*0+2%(T T
	T&|'<'<=H**,""CGGLL9lKMKK5]se1XJ4GHIi(""2663/B'')$C),sRX~bH	T#'--/%$+"*6{	 df 	,i8 45664EHUU :& 	<!;F:	< :& 	E,DF()	E@  	T"#<1D+2%(T T	T   	T"#<1T+2%(T T	TsI   %O9 ;P .C$P/ 8Q 9PPP,+P,/QQQ21Q2z/user/view-old-papersc                     dt         vrt        t        d            S t        j                         j                  d      } g }| D ]a  }d}d}	 |j                  rt        |j                  dd      xs d}	 |j                  rt        |j                  dd      xs d}|dk(  s|dk(  r	 |j                  sIt        |dd       r<t        |j                  dd       r%t        |j                  j                  d|      xs |}	 |j                  sIt        |dd       r<t        |j                  d	d       r%t        |j                  j                  d|      xs |}|j                  t        |j                        |j                  |j                  |j                   |||j"                  d
       d t%        d| |      S # t        $ r d}Y Qw xY w# t        $ r d}Y ;w xY w# t        $ r Y w xY w# t        $ r Y w xY w)Nr@   rs   r   r  r   r	  r  r   r\  )rc   r  r_  r  r   r  rU   zuser/view-old-papers.html)r  r  )r   r	   r
   r   r^   r   r   r  r   r\  r  r  r`   rc   r  r_  r  rU   r   )r  r  opr   r  s        r2   old_papers_listr    s   W 1233""$--o>J I &
	zz$RZZsCJs
	 ~~ '8H# N URU
  4zzgb+t&DQSQ]Q]_hjnIo!()=)=|Z!X!f\fJ~~'"k4*HWUWUaUacprvMw$+BLL,D,DFVXe$f$wjwM 	bee*>>#%#9#9$*ii
 	=&R 6:YbccC  	J	  	 M	   
  r  z#/user/edit-old-paper/<old_paper_id>c           	      
   dt         vrt        t        d            S t        j                  |       j                         }|s t        dd       t        t        d            S t        j                  d      j                  d	      }t        j                  d      j                  d
      }i d }}t        j                  dk(  rt        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }	t        j                  j                  d      }
t        j                  j                  d      }t        j                  j                  d      }|r$t        j                  |      j                         nd }|sd|d<   |r$t        j                  |      j                         nd }|sd|d<   n|r|j                  |k7  rd|d<   |r|j!                         sd|d<   	 t#        |	      }|dk  rd|d<   	 t#        |
      }|dk  rd|d<   |sd|d<   d }|rw|j(                  dk7  rht+        |j(                        sd|d<   nM|j-                  dt.        j0                         |j3                         t4        kD  rd|d<   |j-                  d       |rt7        d ||t        |||!      S |rk|j(                  dk7  r[	 t9        |j(                        }t;        j<                         j>                  }t.        j@                  jC                  d"d#d$      }t/        jD                  |d%&       t.        j@                  jC                  || d'|       }|jG                  |       |jI                  t.        jJ                  d(      }|jM                  d)      }|d*k7  rd(||d  z   nd(|z   }|jN                  rj|jN                  jQ                  d+      rO|jN                  jS                  d(      }t.        j@                  jU                  |      rt/        jV                  |       	 ||d |j!                         t#        |      d.}|r||d/<    |jZ                  d7i | |j]                          t        d0d1       t        t        d2|j^                  3            S t7        d |||6      S # t$        t&        f$ r	 d|d<   Y w xY w# t$        t&        f$ r	 d|d<   Y w xY w# tX        $ r Y w xY w# tX        $ r t7        d d,t        |||-      cY S w xY w# tX        $ r t7        d4d5t        |||-      cY S w xY w)8Nr@   rs   rt   Old paper not foundr   zuser.old_papers_listr,   r   r   r	  rB   r   r\  r  r_  r  rU   r  r  r  r  r  r   r  r  r  r  r   rX   r  r  zuser/edit-old-paper.html)r   rM   r   	old_paperr   r  r   r   r  Tr   r  r   r   r   r  r  )rM   r   r  r   r  )r  r  r  set__paper_titleset__durationset__number_of_questionsr  set__content_file_pathzOld paper updated successfullyr   zuser.edit_old_paper)old_paper_idzuser/edit-old-papers.htmlr  )r  r   r  rp   )0r   r	   r
   r   r^   r_   r   r   r   r   r   rZ   r[   r\   r   r   r  r   r  r   r1   r7   r   r   r   r   r  r   r   r  r  r  r   r   r   rf   r   r   r   r  r  r  r  r  r   rd   r   rc   )r
  r  r   r  r   rM   r   r\  r  r_  r  rU   r  r   r  r  r  r  r1   r  r   r   r  r  r  r  s                             r2   edit_old_paperr    s   W 1233!!\288:I#X. 6788LL"++L9Ea(112BCHMF~~,,""9-ll&&}5ll&&}5<<##J/%ll../DE!!(+}}((83:t||w'--/ -F9=H'//[1779d$4F=!goo-$NF=!+"3"3"5$7F=!	<x=Lq %@z"	E-.G!|0I,- .F8L11R7$\%:%:;)E~&!!!R[[1$$&);;-KF>*!!!$"#=*0W^-6ehX X L11R7m*<+@+@Ajjl&& "Xy, OMD9GGLL3%q
8KL	!!),&&rvvs3ggi(14sRX~b ..93N3N3Y3YZd3e'99@@EGww~~g.YYw/	i $$+"&$/$5$5$7!-,3"6{M :F67I-}-2I>G$9	UVV 5%.ehP PS :& 	<!;F:	< :& 	E,DF()	EL  ).$. m&'A5H/6)SXckm mm,  	i"#>1T+2iu_gi i	ish   +S$ S? ET) 	T A5U $S<;S<?TT	T&#T) %T&&T) )U
	U
U.-U.z%/user/delete-old-paper/<old_paper_id>c                    dt         vrt        dd      dfS t        j                  |       j	                         }|st        dd      dfS 	 |j
                  rj|j
                  j                  d	      rO|j
                  j                  d
      }t        j                  j                  |      rt        j                  |       |j                          t        dd      S # t        $ r Y (w xY w# t        $ r t        dd      dfcY S w xY w)Nr@   Fr#  r   r   rt   r  r   r  r   TzOld paper deletedr$  r   )r   r   r   r^   r_   r  r  r  r   r   r  r  r   r   )r
  r  r  s      r2   delete_old_paperr  k  s    Wun=sBB			l	+	1	1	3Bu.CDcII	DB$8$8$C$CJ$O++2237Hww~~h'YYx(
		t-@AA !&$&  Duo>CCDr  z/user/add-mock-testc                  .   dt         vrt        t        d            S i d }} t        j                  d      j                  d      }t        j                  d      j                  d      }t        j                  dk(  rEt        j                  j                  d      }t        j                  j                  d	      }t        j                  j                  d
      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }	t        j                  j                  d      }
t        j                  j                  d      }|r$t        j                  |      j                         nd }|sd| d<   |r$t        j                  |      j                         nd }|sd| d	<   n|r|j                  |k7  rd| d	<   |r|j                         sd| d
<   	 t        |      }|dk  rd| d<   	 t        |      }|dk  rd| d<   	 t        |	      }|dk  rd| d<   |
r|
j                         sd| d<   |sd| d<   | rt#        d| |t        ||      S 	 t%        ||d |j                         t        |      |
j                          	      }|j'                          t        j*                  j                  d#      }|ri|j,                  r\t/        |j,                        }d$|v r#|j1                  d$d      d%   j3                         nd&}|d'vrd(| d#<   t5        d)d*       nd}g }	 	 |j6                  j9                  d       |d+k(  r"t;        d,       	 t=        j>                  |      }n2|j6                  j9                  d       t=        jF                  |d01      }|jH                  D cg c]-  }|'tK        |      j                         j3                         nd&/ c}|_$        |jM                         D ]  \  }}|d2k(  r|d3z   n|d3z   }	 tO        |d4      r|j                  d5      n
d5|v r|d5   nd }tQ        |tR              rt=        jT                  |      rd&}|tK        |      j                         nd&}|s|jW                  |d6d7       tO        |d4      r|j                  d8      n
d8|v r|d8   nd }|d tR        fvr>tQ        |tR              rt=        jT                  |      stK        |      j                         nd9}|sd9}tO        |d4      r|j                  d:      n
d:|v r|d:   nd&} tQ        | tR              rt=        jT                  |       rd&} | | nd&} tO        |d4      r|j                  d;      n
d;|v r|d;   nd&}!tQ        |!tR              rt=        jT                  |!      rd&}!|!tK        |!      j                         nd&}!tO        |d4      r|j                  d<      n
d<|v r|d<   nd}"tQ        |"tR              rt=        jT                  |"      rd}"	 |"d&k7  rt        tS        |"            nd}#g }$| d&} tQ        | tX        tZ        f      rtY        |       }$nPtK        |       j                         }%|%r5	 t]        j^                  |%      }&tQ        |&tX              r|&}$ntK        |&      g}$	 tc        jd                  |||$|!|#>      }(|(j'                          |dz  } 	 rt5        dB| dCdD       rt5        tm        |       dEd*       t5        dFdD       t        t        dG            S t#        d||H      S # t        t         f$ r	 d| d<   Y [w xY w# t        t         f$ r	 d| d<   Y `w xY w# t        t         f$ r	 d| d<   Y ew xY w# t(        $ r t#        dd!t        ||"      cY S w xY w# t(        $ r Y tw xY w#  |j6                  j9                  d       |j6                  jA                         }|jC                  d-d./      }t=        j>                  tE        |            }Y xY wc c}w # t(        $ r d}#Y w xY w# t(        $ rG |%ja                  d=      D 'cg c]#  }'|'j                         s|'j                         % nc c}'w }$}'Y w xY w# t(        $ rI})tf        jh                  jk                  d?||)       |jW                  |tK        |)      d7       Y d })~)d })~)ww xY w# t(        $ rI})tf        jh                  jk                  d@||)       |jW                  |tK        |)      d7       Y d })~)Ad })~)ww xY w# t(        $ r(})|jW                  dAtK        |)      d7       Y d })~)d })~)ww xY w)INr@   rs   r,   r   r   r	  rB   r   r\  r   r_  total_questionstotal_marksinstructionsrU   rt   r  r  r  Enter mock test titler   r  r   Total questions must be positiveTotal questions must be numericTotal marks must be positiveTotal marks must be numericEnter instructionsr   zuser/add-mock-test.htmlr  )	r   r\  r  r   r_  r  r  rU   r  r  r  questions_filer+   r   rX   )csvxlsxzAllowed file types: .csv, .xlsxz)Questions file ignored: invalid file typer   r  zinside if csvzutf-8r   r;  openpyxl)enginer     r\   questionzEmpty question)rowerrorquestion_typemcqoptionsanswermarks|)	mock_testr!  r  r#  r$  r%  z"Failed to save question row %s: %szError processing row %s: %sfilez	Imported z questions from uploaded file.r   z< errors occurred while importing questions. See server logs.zMock test added successfullyzuser.add_mock_testr  )7r   r	   r
   r   r^   r   r   r   rZ   r[   r\   r_   r   r  r   r  r   r   r   rf   r   r   r1   r   r-   r.   r   rx  r   r<  pdread_csvreaddecoder'   
read_excelcolumnsr`   iterrowshasattr
isinstancefloatisnar  r  tuplejsonloadssplitr    rc   r   r   r   len)*r   rM   r   r  r   r\  r   r_  r  r  r  rU   r   r  r  tq_inttm_intnew_mockuploadedr1   extimported_countimport_errorsdfcontenttextrF  r  r  row_numquestion_textq_typeraw_optionsr$  	raw_marksr%  options_parsedraw_options_strparsedpqr   s*                                             r2   add_mock_testrM    s 	   W 1233MFLL"++L9Ea(112BCH~~,,""9-ll&&}5  )<<##J/!,,**+<=ll&&}5||''7!!(+3:t||w'--/ -F9=H'//[1779d$4F=!goo-$NF=!EKKM5F7O	<x=Lq 7R&"4	J)F{8ZF#45	B%F{4RF=1 <#5#5#7%9F>".F8"#<]Gh0 0	A#kkm% &"6{)//1
H MMO
 }}  !12HH%%"8#4#4558H_hooc1%b)//1"o%'HF#$=xHNMfGOO((+ %</*9;;x0 OO((+x
CBWYWaWabRSc!flln2242Mb
 " KTHC-0F]#'aITCJ3PUCVCGGJ,?oy  ~A  pA\_`j\k  GKM)-?BGGMDZ02KXKdS-?-E-E-GjlM#0 - 4 4WO_5` a (AHeATSWW_%=  sB  FI  sIZ]^mZn  OSF=CDRW==Xblmsuzb{  AC  AH  AH  IO  APc&k&7&7&9  W\F#)).@GU@S#'')*<ktx{k{Y\]fYg  BDK)+u="''+BV.09D9P+VXK:A#u:MSWWX%6dlpsdsSVW_S`y{F)&%8RWWV_)+<B<NS[%6%6%8TVF<CC<O(8elpsesUXY`UayzI))U;	@R,-	*AJbE),<(=VW
 .0N*2.0)+e}E15k1B25k2B2H2H2J#2%v15O1L+5fd+C=CN>A&k]NX$4.6kk28-:,:+1*/%" !" .! 3KKTf In--KLiXS'((degop,i8 45664EHUUW :& 	<!;F:	< :& 	J(IF$%	J :& 	B$AF=!	B6  	A"#<AuxA A	A, ! 9 ,,Q/"*//"6"6"8&~~gi~H[[$8
 cJ $- *()*& ,5 %vM\MbMbcfMg9uklkrkrkt!'')9u9u9u%v  $- X + 2 2 < <=acjlm n - 4 4WsSTv5V W WX  ) T'..889VX_abc)003q61RSST  G$$Vc!f%EFFGsV  ] ]8 0^ ;A	^. _ )e# :_! Ae# 2a.e# 1Bd3e# 4Fd;aAd4a&0b9?e# ]54]58^^^+*^+.__	_e# _e# !A(a	e# a#d"a##d&b6b+b+*b62d5b66d9	d>d ddd	e >ee# e  e# #	f,ffz/user/view-mock-testsc                      dt         vrt        t        d            S t        j                         j                  d      } g }| D ]w  }d}d}	 |j                  rt        |j                  dd      xs d}	 |j                  rt        |j                  dd      xs d}|dk(  s|dk(  r	 |j                  sIt        |dd       r<t        |j                  dd       r%t        |j                  j                  d|      xs |}	 |j                  sIt        |dd       r<t        |j                  d	d       r%t        |j                  j                  d|      xs |}|j                  t        |j                        |j                  |j                  |j                   |j"                  |j$                  |||j&                  d
	       z t)        d| |      S # t        $ r d}Y gw xY w# t        $ r d}Y Qw xY w# t        $ r Y w xY w# t        $ r Y w xY w)Nr@   rs   r   r  r   r	  r  r   r\  )	rc   r   r_  r  r  r  r   r  rU   zuser/view-mock-tests.html)
mock_testsr  )r   r	   r
   r   r^   r   r   r  r   r\  r  r  r`   rc   r   r_  r  r  r  rU   r   )rO  r  mtr   r  s        r2   mock_tests_listrQ  R	  s   W 1233!!#,,_=J I (
	zz$RZZsCJs
	 ~~ '8H# N URU
  4zzgb+t&DQSQ]Q]_hjnIo!()=)=|Z!X!f\fJ~~'"k4*HWUWUaUacprvMw$+BLL,D,DFVXe$f$wjwM 	bee*XX!11>>OO$*ii

 
	=(T 6:YbccE  	J	  	 M	   
  sJ   'G5'G'AG1=AHGGG.-G.1	G>=G>	HHz#/user/edit-mock-test/<mock_test_id>c                    dt         vrt        t        d            S t        j                  |       j                         }|s t        dd       t        t        d            S t        j                  d      j                  d	      }t        j                  d      j                  d
      }i d }}t        j                  dk(  rxt        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }	t        j                  j                  d      }
t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }|r$t        j                  |      j                         nd }|sd|d<   |r$t        j                  |      j                         nd }|sd|d<   n|r|j                  |k7  rd|d<   |r|j                         sd|d<   	 t!        |	      }|dk  rd|d<   	 t!        |
      }|dk  rd|d<   	 t!        |      }|dk  rd|d<   |r|j                         sd|d<   |sd |d<   |rt'        d!||t        |||"      S 	 |j)                  ||d |j                         |j                         t!        |      #	       |j+                          t        d$d%       t        t        d&|j,                  '            S t'        d!|||*      S # t"        t$        f$ r	 d|d<   Y w xY w# t"        t$        f$ r	 d|d<   Y 	w xY w# t"        t$        f$ r	 d|d<   Y w xY w# t.        $ r t'        d!d(t        |||)      cY S w xY w)+Nr@   rs   rt   Mock test not foundr   zuser.mock_tests_listr,   r   r   r	  rB   r   r\  r   r_  r  r  r  rU   r  r  r  r  r   r  r  r  r  r  r  r  r   zuser/edit-mock-test.html)r   rM   r   r'  r   r  )	r  r  r  r  r  set__total_questionsset__total_marksset__instructionsr  zMock test updated successfullyr   zuser.edit_mock_test)mock_test_idr  )rM   r   r'  r   r  )r'  r   r  )r   r	   r
   r   r^   r_   r   r   r   r   r   rZ   r[   r\   r   r  r   r  r   r   rd   r   rc   r   )rW  r'  r   r  r   rM   r   r\  r   r_  r  r  r  rU   r   r  r  r9  r:  s                      r2   edit_mock_testrX  	  s   W 1233  L1779I#X. 6788LL"++L9Ea(112BCHMF~~,,""9-ll&&}5  )<<##J/!,,**+<=ll&&}5||''7!!(+3:t||w'--/ -F9=H'//[1779d$4F=!goo-$NF=!EKKM5F7O	<x=Lq 7R&"4	J)F{8ZF#45	B%F{4RF=1 <#5#5#7%9F>".F8"#=]G#58E E	V!!(# ;;=*%+!'"."4"4"6K  
 2I>G$9	UVV 558= =] :& 	<!;F:	< :& 	J(IF$%	J :& 	B$AF=!	B:  	V"#=A9EHV V	VsI   
M  M' 6N A:N M$#M$'M?>M?NNN>=N>z%/user/delete-mock-test/<mock_test_id>c                    dt         vrt        dd      dfS t        j                  |       j	                         }|st        dd      dfS 	 |j                          t        d	d
      S # t        $ r t        dd      dfcY S w xY w)Nr@   Fr#  r   r   rt   rS  r   TzMock test deletedr$  r   )r   r   r   r^   r_   r   r   )rW  rP  s     r2   delete_mock_testrZ  	  s    Wun=sBB			\	*	0	0	2Bu.CDcIID
		t-@AA Duo>CCDr&  z/user/add-questionc            	      &   dt         vrt        t        d            S i } i }g }	 t        j                  j                  d      }t        j                  dk(  rt        j                  j                  d      }t        j                  j                  d      xs d}t        j                  j                  d	      xs d}t        j                  j                  d
      xs dj                         }t        j                  j                  d      xs dj                         }t        j                  j                  d      xs d}t        j                  j                  d      xs dj                         g }t        j                  j                  d      }	|	r:|	D ]5  }
|
s|
j                         s|j                  |
j                                7 |sd| d<   n!	 t        j                  j                  |      }|sd| d	<   |sd| d<   	 |rt'        |      nd}|dk  rd| d<   |dv rt+        |      dk  r| d| d<   sd|dk(  rdnd z   d!z   | d<   nd }j-                         r1t'              dz
  }d|cxk  rt+        |      k  r	n n||   }n,d"| d<   n&|v r}nt/        fd#|D        d       }|r|}nd$| d<   | j                  d      s
|nsd%| d<   | sK	 t1        ||xs d ||r|ng |&      }|j3                          t5        d'd(       t        t        d)            S t;        d.|| |/      S # t        $ r g }Y w xY w# t        $ r d| d<   d }Y \t        $ r* t         j"                  j%                  d       d| d<   d }Y w xY w# t(        $ r d| d<   d}Y |w xY w# t6        $ r7}t         j"                  j%                  d*       t9        |      | d+<   Y d }~d }~wt        $ r' t         j"                  j%                  d,       d-| d+<   Y w xY w)0Nr@   rs   r   rB   Tr.  r'  rX   r!  topicr  r%  r$  	options[]zPlease select a mock test.rt   Selected mock test not found.Error fetching mock testUnable to find mock test.zPlease select a question type.Question text is required.r,   r   !Marks must be a positive integer.Marks must be an integer.MCQMatchTheFollowingr  z must have at least 2 options.r#  Answer is required for rf  Match The Followingr+   z$Answer option index is out of range.c              3      K   | ]D  }|j                         j                         j                         j                         k(  sA| F y wro   r  r.   ).0or$  s     r2   	<genexpr>zadd_question.<locals>.<genexpr>G
  s8     'jaaggioo>OSYS_S_SaSgSgSi>i'j   AAA%Answer must match one of the options.Answer is required.)r'  r!  r]  r  r#  r$  r%  zQuestion added successfully.r   user.view_questionsz Validation error saving questionrs  zFailed to save questionz"Failed to save question. See logs.zuser/add-question.html)rO  r   rv  )r   r	   r
   r   r^   r   r   r   rZ   r[   r>  r\   r  getlistr  rw  r   r   r   r   r   r8  isdigitnextr    rf   r   r   r`   r   )r   rv  rO  rW  r!  r]  rD  	marks_rawr#  rF  rm  mock_test_objr%  answer_textr  matchedrL  r   r$  s                     @r2   add_questionrz  	  s
   W 1233FIJ%%..?
 ~~LL((d(3	||''4:((9?R!!'*0b779 ))*5;BBDLL$$W-3	,,""8,299; ll**;7  .NN1779-.
 ">F;% ( 0 0 4 4 4 E &FF?#!=F:	&/C	NQEz"Ew 887|a'4o5S$Ty!#<Z_I_ez#{  B  $Bx  #>>#f+/CC.#g,.&-cl+Qx( (&,"&'j7'jlp"q"*1K/VF8,zz(+(F#8x  I$ -$1!MT,)0gb#! 4i@(= >?? 3&0"(%.0 0U  
8   %&E{# $ %"",,-GH&A{# $%   	9F7OE	h # +"",,-OP$'Fy! I"",,-FG$Hy!IsZ   L1  M 	N A	N" 1M ?M N.NNNN"	P+-O0PPz/user/view-questionsc                  b   dt         vrt        t        d            S 	 t        j                  j                  d      j                         } t        j                  j                  dt        |              t        d|       S # t        $ r$ t        j                  j                  d       g } Y 9w xY w)Nr@   rs   r   z#view_questions: loaded %d questionszFailed to load questionszuser/view-questions.html	questions)r   r	   r
   r    r^   r   r  r   r   debugr8  r   r   r   r|  s    r2   view_questionsr  o
  s    W 1233$,,55oFUUW	  !FIW
 5KK	  $$%?@	s   AB *B.-B.z!/user/edit-question/<question_id>c                 F   dt         vrt        t        d            S 	 t        j                  j                  |       }i }i }t        j                  d	k(  r|j                  rt        |j                  j                         nd
|j"                  xs d
|j$                  xs d
|j&                  xs d
|j(                  xs g |j*                  xs d
t        |j,                  xs d      t/        |dd       t        |j0                        ndd}t        j                  dk(  rZt        j2                  j5                  d      }t        j2                  j                  d      xs d
}t        j2                  j                  d      xs |j"                  xs d
j7                         }t        j2                  j                  d      xs d
j7                         }t        j2                  j                  d      xs d
j7                         }t        j2                  j                  d      xs d
}t        j2                  j                  d      xs d
j7                         t        j2                  j9                  d      D 	cg c]&  }	|	s|	j7                         s|	j7                         ( }
}	d }|r!	 t:        j                  j                  |      }|sd|d<   	 |rt=        |      nd}|dk  rd|d<   d }|d v rtA        |
      d!k  rd"|d#k(  rd#nd$z   d%z   |d&<   sd'|d#k(  rd#nd$z   d%z   |d<   njC                         r1t=              dz
  }d|cxk  rtA        |
      k  r	n n|
|   }nGd(|d<   nAtE        fd)|
D        d       }|stE        fd*|
D        d       }|r|}nd+|d<   n
sd,|d<   n}t        j2                  j                  d      }	 |t=        |      nt/        |dd      }|s	 |r|n|j                  |_        |xs |j"                  |_        |xs d |_        ||_        |d v r|
|_        ng |_        ||_        ||_        ||_        |jG                          t        d-d.       t        t        d            S 	 t:        j                  jK                  d3      }tM        d4||||5      S # t        $ r# t        dd       t        t        d            cY S t        $ rB t        j                  j                  d       t        dd       t        t        d            cY S w xY wc c}	w # t        $ r	 d|d<   Y mt        $ r( t        j                  j                  d       d|d<   Y w xY w# t>        $ r d|d<   d}Y w xY w# t        $ r t/        |dd      }Y w xY w# tH        $ r8}t        j                  j                  d/       t        |      |d0<   Y d }~ad }~wt        $ r( t        j                  j                  d1       d2|d0<   Y w xY w# t        $ r g }Y w xY w)6Nr@   rs   rt   Question not found.r   rr  zError fetching questionzUnable to load question.rA   rX   r,   rU   r  )r'  r!  r]  r  r#  r$  r%  rU   rB   Tr\  r'  r!  r]  r  r%  r$  r^  r_  r`  ra  rb  r   rc  rd  re  r  z&Please provide at least 2 options for rf  ri  r+   r#  rh  zAnswer index is out of range.c              3   f   K   | ](  }|j                         j                         k(  s%| * y wro   )r  rl  rm  
answer_raws     r2   rn  z edit_question.<locals>.<genexpr>
  s'     #Z!!'')zGWGWGY:YA#Zs   &11c              3      K   | ]D  }|j                         j                         j                         j                         k(  sA| F y wro   rk  r  s     r2   rn  z edit_question.<locals>.<genexpr>
  s8     'naaggioo>OS]ScScSeSkSkSm>m'nro  rp  rq  zQuestion updated successfully.r   z"Validation error updating questionrs  zFailed to update questionzFailed to update question.r   zuser/edit-question.html)r  rO  r   rv  )'r   r	   r
   r    r^   r\   rw  r   r   r   r   r   r   rZ   r'  r`   rc   r!  r]  r  r#  r$  r%  r  rU   r[   r>  r  rs  r   r   r   r8  rt  ru  rf   r   r   r   )question_idrL  r   rv  rW  r!  r]  rD  rv  rm  r#  rw  r%  r$  r  ry  
status_valr  r   rO  r  s                       @r2   edit_questionr  
  s   W 12338$$((K(8 FI ~~01Q[[^^,__2WW]

(byyBhhn"A&'.q(D'A'Mc!((mSV	
	 ~~LL((d(3	||''4: ))/:SaooSQSZZ\!!'*0b779 ))*5;BBDLL$$W-3	ll&&x06B==?
 '.ll&:&:;&G[1QRQXQXQZ1779[[ B ( 0 0 4 4 4 E !=F:	&/C	NQEz"Ew 887|a$L*e3E9N%PRU%Vy! #<*e3E9N$PRU$Vx  %%'j/A-CC.#g,.!(+Jx( ##Zw#Z\`aG""&'n7'npt"u!(+Rx( #8x # \\%%h/
	1,6,BZPQS[]^H_J
 A/<m!++"/"B1??-4*
 !$@@ 'AI "AI!%6	B(= >??%%..?
 4$%&0"(%.	0 0Q  8#X. 5677 8$$%>?((3 56778@ \   F&E{# B"",,-GH&A{#B  	9F7OE	X  	1 Ha0J	1. # +"",,-QR$'Fy! A"",,-HI$@y!A  
s    R) 8T! T!T!* T& U* V %BV :X ))TATT&U'7,U'&U'*U>=U>VV	X'-W0XXX X z#/user/delete-question/<question_id>c                 b   dt         vrt        ddd      dfS 	 t        j                  j	                  |       }|j                          t        ddd      S # t        $ r t        dd	d      d
fcY S t        $ r3 t        j                  j                  d|        t        ddd      dfcY S w xY w)Nr@   FzNot authenticated.r   r   rt   TzQuestion deleted.r  r   zFailed to delete question %szServer error.r   )r   r   r    r^   r\   r   rw  r   r   r   r   )r  rL  s     r2   delete_questionr    s    W55IJKSPPL$$((K(8	
44GHII R55JKLcQQ L$$%C[Q5_EFKKLs   =A B.38B.-B.z/user/forgot-passwordc                  P    dt         v rt        t        d            S t        d      S )Nr@   rE   zuser/forgot-password.htmlr   rp   r4   r2   forgot_passwordr  '  s'     5677677r4   z/user/reset-passwordc                  P    dt         v rt        t        d            S t        d      S )Nr@   rE   zuser/reset-password.htmlr   rp   r4   r2   reset_passwordr  0  s'     5677566r4   z/user/view-transactionsc                  P    dt         vrt        t        d            S t        d      S Nr@   rs   zuser/view-transactions.htmlr   rp   r4   r2   view_transactionsr  E  r   r4   z/user/content-uploadc                  P    dt         vrt        t        d            S t        d      S )Nr@   rs   zuser/content-upload.htmlr   rp   r4   r2   content_uploadr  N  s'    W 1233566r4   z/user/change-passwordc                  P    dt         vrt        t        d            S t        d      S )Nr@   rs   zuser/change-password.htmlr   rp   r4   r2   change_passwordr  U  s'    W 1233677r4   z/user/logoutc                  R    t        j                          t        t        d            S )Nrs   )r   clearr	   r
   rp   r4   r2   user_logoutr  ^  s    MMOG-.//r4   c                    | syt        j                         }	 | dk(  rJt        j                  |t        j
                        }t        j                  |t        j                        }n| dk(  rY|t        d      z
  }t        j                  |t        j
                        }t        j                  |t        j                        }n| dk(  rWt        j                  |t        d      z
  t        j
                        }t        j                  |t        j                        }n8| dk(  rWt        j                  |t        d	      z
  t        j
                        }t        j                  |t        j                        }n| d
k(  rt        j                  |j                  d      t        j
                        }t        j                  |j                  |j                        d   }t        j                  |j                  |      t        j                        }n@| dk(  r|j                  }|j                  dz
  }	|	dk(  rd}	|dz  }t        j                  t        ||	d      t        j
                        }t        j                  ||	      d   }t        j                  t        ||	|      t        j                        }n| dk(  r|r|syt        j                  |d      }
t        j                  |d      }t        j                  |
j                         t        j
                        }t        j                  |j                         t        j                        }ny||fS # t        $ r Y yw xY w)NNNtoday	yesterdayr,   )days7   30   
this_month)day
last_monthr      customrT  )r   r  r   rV  r   rX  maxr   r   calendar
monthrangeyearmonthrW  r   )keycustom_start
custom_endr  rl  enddlast_dayr  r  sr   s               r2   _parse_day_ranger  d  s   JJLE'>$$UDHH5EX=M=MeUYU]U]=^sK	q))A83C3CAtxx3P5X`XhXhijlpltltXuRUCZ$$UYA->%>IEQYQaQabgimiqiqQr3D[$$UYB-?%?JERZRbRbchjnjrjrRsCL $$U]]q]%9488DE**5::u{{CAFH""5==X=#>ICL ::Du{{Quz25tqyt$$T$q%9488DE**47:H""4eX#>ICH_z#!!,
;A!!*j9A$$QVVXtxx8E@P@PQRQWQWQY[_[c[c@d# 3<  s   J.M BM 	M*)M*z/user/purchase-historyc                     dt         vrt        t        d            S t        j                  dk(  rt        j
                  nt        j                  } | j                  dd      }| j                  dd      }| j                  dd      }| j                  dd      }| j                  d	d      }| j                  d
d      }| j                  dd      }t        |||      \  }}	t        |||      \  }
}|||||||di d}	 t        d      }|dk7  r#	 t        |      }|t        |      z  }||d   d<   |rD|	rB|t        |      z  t        |	      z  }|j                         |	j                         f|d   d<   |
r:|r7|
j                         |j                         f|d   d<   g }	 t        j                  |
|      j                  d      }|D cg c]  }|j                    }}|s@	 t        j                  |
|      j                  d      }|D cg c]  }|j                    }}|s@	 t        j                  |
|      j                  d      }|D cg c]  }|j                    }}t#        |      |d   d<   |d d xs g D cg c]  }t%        |       c}|d   d<   |sg }n|t        |      z  }dt'               vr2t)        j                  |      j+                  d      j-                         }g }D ]  }	 d }t5        |d      r)d |j6                  v r|j6                  j                  d       }|t9        |d d       }t9        |dd       xs t9        |d!d       xs |}|snt        j                  |"      j;                         }|st9        |d#d       }|rt5        |d$      r|j=                  d%      }n|t%        |      nd}t9        |d&d       }|t9        |d#d       }|t9        |d'd       }|rt5        |d$      r|j=                  d%      }n|t%        |      nd}|j?                  t%        t9        |dd      xs d      t9        |d(d)      xs d)t9        |d*d)      xs d)t9        |d+d)      xs d)t9        |d,d-      xs d-t9        |d.d       ||t9        |d/d      xs dd0	        t.        j0                  jA                  d2|       tC        d3|d4d56      S # t        $ r |t        |      z  }||d   d<   Y w xY wc c}w # t        $ r g }Y 1w xY wc c}w # t        $ r g }Y w xY wc c}w # t        $ r g }Y w xY wc c}w # t        $ r-}t.        j0                  j3                  d|       g }Y d }~d }~ww xY w# t        $ r/ t.        j0                  j3                  d1t9        |dd              Y w xY w)7Nr@   rs   rA   transaction_daterX   t_custom_startt_custom_endregister_dater_custom_startr_custom_endrU   )r  r  r  r  r  r  rU   )receivedappliedcredit
entry_typetransaction_statusr  created_date__gtecreated_date__ltecreated_at__gtecreated_at__lterc   r  r  created_on__gtecreated_on__lteregister_user_count   register_user_sampleuser_id__inrL  r   z)Failed to fetch purchase transactions: %s_datauser_idpkrt   r  strftime%d-%m-%Y %H:%M:%S
created_at
created_onrt     —emailrg   amountr   r  r   	rc   	user_name
user_email
user_phoner  payment_statusr  user_created_atr   +Skipping transaction due to error for id=%rzpurchase_history debug: %szuser/purchase-history.htmlpurchasezPurchase Historytransactions	view_type
page_title)"r   r	   r
   r   rZ   argsr[   r\   r  r%   r   r   	isoformatr$   r^   onlyrc   r8  r`   localsr#   r   no_dereferencer   r   r   r0  r  r  r_   r  r  r~  r   )params	trans_keyr  r  reg_keyr  r  rU   trans_start	trans_end	reg_startreg_end
debug_infobase_qstuser_idsuser_qsurL  r   rowstrawuser_ref_iduser_obj
tx_createdtx_created_struser_createduser_created_strs                                r2   purchase_historyr    s   W 1233 %^^u4W\\',,F 

-r2IZZ 0"5N::nb1Ljj"-GZZ 0"5N::nb1LZZ"%F .iVK)'><PIw *3nfr&-am%' 	J9h' R<9[!r"::24
9%h/ 9a+>>U^A__F9D9N9N9PR[ReReRg8hJy!"45 6?6I6I6KWM^M^M`5aJy!/2H,,yRYZ__`de*12QADD22 ""llYZabgghlmG.566H6 ""ll9V]^ccdhiG.566H6 <?x=Jy!"78NVWYXYlN`^`<bSV<bJy!"89!"99 fh"**62;;OL[[]A D 0/	Cq'"yAGG';ggkk),{aD1!#tT2Ugc46NURUK||{399;H !ND9Jgj*=!+!4!45H!I4>4JZPR #8\4@L#&xF#&xtDj A#/#8#89L#M 8D8P3|#4VX KK'!T2.4"5$Xvu=F%h?H5%h?H5!!Xq16Q")!-A4"H .#3&q-<B
 
G0d 9:F7(,%/&8: :O  9!v">>28
9%h/9" 3 
  7  "!H"
  7  "!H" =c  $$%PRSTf  	(()VX_`acgimXno	s  <U "S 0A4U %*T T"T $U '*T T$T &U )*T5 T0&T5 (U UAU :A(V#&V
DV S?;U >S??U T TU TU T T-)U ,T--U 0T5 5U U UU 	V"U==V4V=<V=z/user/spent-historyc                  	   dt         vrt        t        d            S t        j                  dk(  rt        j
                  nt        j                  } | j                  dd      }| j                  dd      }| j                  dd      }| j                  dd      }| j                  d	d      }| j                  d
d      }| j                  dd      }t        |||      \  }}	t        |||      \  }
}	 t        d      }|dk7  r	 t        |      }|t        |      z  }|r|	r|t        |      z  t        |	      z  }|
r|rg }	 t        j                  |
|      j                  d      }|D cg c]  }|j                   }}|s@	 t        j                  |
|      j                  d      }|D cg c]  }|j                   }}|s@	 t        j                  |
|      j                  d      }|D cg c]  }|j                   }}|sg }n|t        |      z  }dt!               vr2t#        j                  |      j%                  d      j'                         }g }D ]  }	 d }t/        |d      r)d|j0                  v r|j0                  j                  d      }|t3        |dd       }t3        |dd       xs t3        |dd       xs |}|snt        j                  |      j5                         }|st3        |dd       }|rt/        |d      r|j7                  d      }n|t9        |      nd}t3        |d d       }|t3        |dd       }|t3        |d!d       }|rt/        |d      r|j7                  d      }n|t9        |      nd}|j;                  t9        t3        |dd      xs d      t3        |d"d#      xs d#t3        |d$d#      xs d#t3        |d%d#      xs d#t3        |d&d'      xs d't3        |d(d       ||t3        |d)d      xs dd*	        t=        d,|d-d./      S # t        $ r |t        |      z  }Y !w xY wc c}w # t        $ r g }Y w xY wc c}w # t        $ r g }Y w xY wc c}w # t        $ r g }Y |w xY w# t        $ r% t(        j*                  j-                  d       g }Y [w xY w# t        $ r/ t(        j*                  j-                  d+t3        |dd              Y w xY w)0Nr@   rs   rA   r  rX   r  r  r  r  r  rU   debitr  r  r  r  r  rc   r  r  r  rL  r   z"Failed to fetch spent transactionsr  r  r  rt   r  r  r  r  r  rt  r  r  rg   r  r   r  r   r  r  zuser/spent-history.htmlspentzSpent Historyr  )r   r	   r
   r   rZ   r  r[   r\   r  r%   r   r   r$   r^   r  rc   r  r#   r   r  r   r   r   r0  r  r  r_   r  r`   r  r   )r  r  r  r  r  r  r  rU   r  r  r  r  r  r  r  r  r  rL  r  r  r  r  r  r  r   r  r  s                              r2   spent_historyr    s   W 1233$^^u4W\\',,F

-r2IZZ 0"5N::nb1Ljj"-GZZ 0"5N::nb1LZZ"%F-iVK)'><PIw+g&R<?[!r":: 9a+>>U^A__F H,,yRYZ__`de*12QADD22 ""llYZabgghlmG.566H6 ""ll9V]^ccdhiG.566H6 !"99fh"**62;;OL[[]A
 D -,	Cq'"yAGG';ggkk),{aD1!#tT2Ugc46NURUK||{399;H ND9Jgj*=!+!4!45H!I4>4JZPR"8\4@L#&xF#&xtDj A#/#8#89L#M 8D8P3|#4VX KK'!T2.4"5$Xvu=F%h?H5%h?H5!!Xq16Q")!-A4"H .#3&q-<B
 
A-^ 4(,%,&57 7m  ?!v">>? 3 
  7  "!H"
  7  "!H"  $$%IJ`  	(()VX_`acgimXno	s   /R P! &R *Q ,Q ?Q R *Q .QQ R *Q3 0Q.Q3 AR  A(R6	&R60DR6!P=9R <P==R  Q QR QR Q Q+'R *Q++R .Q3 3R>R RR *R32R364S.-S.z/subexams/<string:exam_id>c                    	 t         j                  j                  | d      j                  d      }|D cg c]P  }t	        |j
                        t        |d      r|j                  nt        |dt	        |j
                              dR }}t        d|      S c c}w # t        $ r"}t        dt	        |      	      d
fcY d }~S d }~ww xY w)Nr,   ru  rt  r   )rc   rt  T)r   r?  Fr   r   )r   r^   r|  r   r`   rc   r0  rt  r  r   r   )r   subsr  r?  r   s        r2   get_subexamsr
    s    ;%%ga%@II&Qw{|rss144yWQ5G166WUVX_adefeieiajMkm||t$// } ;uc!f5s::;s/   4B ABB B 	C
(C?C
C
z/user/test-historyc                  P    dt         vrt        t        d            S t        d      S r  r   rp   r4   r2   test_historyr    s'    W 1233899r4   r  )bsonr   mongoengine.errorsr   r   flaskr   r   r   r	   r
   r   r   r   r   r   models.adminr   models.sliderr   models.examr   werkzeug.securityr   werkzeug.utilsr   utils.sms_servicer   r   r   r   r   models.sub_examr   ra   r   models.Couponr   models.notification_modelr   
bson.dbrefr   models.old_papers_modelr   models.mock_test_modelr   r    models.ebooks_modelr!   models.courser"   models.transaction_historyr#   models.userr$   mongoengine.queryset.visitorr%   r  ior&   r'   pandasr)  r5  r  r/   r  r3   r6   r  r7   r>   r   r?   __name__user_bprouterm   rq   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r!  r%  rB  rH  rR  rZ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rM  rQ  rX  rZ  rz  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  rp   r4   r2   <module>r&     sF
    = z z z     1 * & 4 4 #  	   2  - = %   9  *      !7 !^ !&w % b 4 X FH
% 	w0>W 1>WD 	}ufo6 7
 	'%A,k B,kb 	!F84K 5K6 	 !. ". 	}4 4 	!E73
@ 4
@ 	*UG<< =< 	(5':: ;: 	*UG<< =< 	!E6?;N3 <N3f 	06(CV DV" 	.HSC ISCp 	#$F %F 	%9i1 :i1\ 	!E73@ 4@ 	,vh?T @T& 	*UFODd= Ed=N 	"UFO<XA =XAv 	$ug6I 7I 	05&/JUS KUSp 	2VHE
D F
D 	!E6?;"A <"AH 	"UFO<
J =
J 	06(C@ D@> 	.H-M I-Mf 	!E6?;}0 <}0~ 	#eV_=	F >	F 	.He* Ie*N 	7&JT KT 	3eWEE FE 	'%AeH BeHR 	)*8 +8 	AESY?[?U \?UH 	CfXV8 W8< 	!E6?;3 <3 	)E7;; <; 	 5&/:TR ;TRn 	"UG41X 51Xh 	,ufoFcH GcHL 	.AD BD( 	$ufo>aV ?aVF 	&81d 91dh 	4ufoNqP OqPh 	6ID JD( 	$ufo>MV ?MVb 	&82d 92dj 	4ufoNV= OV=t 	6ID JD 	#eV_=w0 >w0v 	%w7L 8L 	2UFOLR0 MR0l 	4vhGL HL  	&@8 A8 	%v?7 @7( 	(5':: ;: 	%w77 87 	&88 98 	~0 0
!H 	'%@P: AP:j 	$uVn=s7 >s7j 	+,; -; 	#eF^<: =:r4   