
    @hl              
       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mZ d dl d dl d dlmZmZ d dlmZ d dlZd dlZd dlmZ d dlZd dlZd dlZd dlZd dlm Z  d dl!Z!d dl"Z"d dl#Z#d dl$Z$d d	l%m%Z% d d
l&m'Z' d dl(Z(d dl)m*Z* d dl+Z+ e'         ede,      Z- ee-        e(j\                   ej^                  dd       ej^                  dd       ej^                  dd             Z0 ed      Z1dZ2dZ3 ej^                  d      Z4d dl5m6Z6m7Z7 d dlZd dl$Z$ e*jp                  dd      	 	 d4de9de9de9dz  de9fd       Z: e*jp                  dd       d!        Z;d" Z<e-j{                  d#d$g%      d&        Z>e-j{                  d'       e       d(               Z?e-j{                  d)d$g%      d*        Z@e-j{                  d+d,g%      d-        ZAe-j{                  d.d,g%       e       d/               ZBe-j{                  d0d$g%       e       d1               ZCe-j{                  d2d,g%      d3        ZDy)5    )
	Blueprintrequestjsonifystream_with_contextResponse	send_filerender_templatesessionredirecturl_for)CORScross_origin)*)cleanup_directoriesmerge_pages)MCQN)Path)Thread)datetime)load_dotenv)celery	extractor
REDIS_HOSTredis
REDIS_PORTi  REDIS_DB)hostportdbz
public/tmpzpublic/images/crops_outzpublic/debug_outputsPOPPLER_PATH)QueueEmptyTzextractor.extract_text_from_pdf)bindname
batch_sizedpiworker_countqueue_maxsizec           	      ,	   	 t        t        t              st        t              nt        }|j                  dd       t	              t        dt              }t        |j                  dd      xs d      t        j                  d d d	       dk(  rt        d
      |z  j                  dd       t        t              j                  dd       t        dt        dddg      t        j                         xs d}	t!        dt#        d|	            |rt        |      nd}t%        |      g t'              xs i t)        d        t+        j,                         d7fd	dt        ffd}
fd}g }t/              D ]?  }t+        j0                  |
|dz   fd      }|j3                          |j5                  |       A t+        j0                  |d      }|j3                          |j7                          j7                          |D ]  }|j7                  d        | dz  }|j9                  dd !      5 }t;        j<                  t?        d" #      |d$d%       ddd       t        j                  d d&|        	 t              }|jA                         r+|jC                          t        j                  d d'        dd*j                  d+d,      j                  d-d,      t	        |      d.}tH        jK                  d/ d0t;        jL                  |d$1             	 jA                         rtO        jP                         t	        |      S # 1 sw Y   xY w# tD        $ r(}t        jF                  d d( d)|        Y d}~d}~ww xY w# tD        $ r%}t        jR                  d d2|        Y d}~td}~ww xY w# tD        $ r}t        jT                  d d3|        d4t	        |      d5}	 tH        jK                  d/ d0t;        jL                  |d$1              # tD        $ r t        jV                  d d6|        Y  w xY wd}~ww xY w)8z
    Producer-consumer pipeline:
      - producer: convert PDF pages in batches, put (page_number, PIL.Image) into queue
      - consumers: worker_count threads that pop from queue and run OCR+detector
    Tparentsexist_okN)userpwpoppler_pathPagesr   [z
] PDF has z pageszPDF page count returned 0z&public/models/layout_detector_model.ptg?FigureTable)
model_path
output_dirconf_threshallowed_labels         d   )maxsizezPrev state: c           	         |rt        | |z  dz  d      nd}| |||j                  dd      j                  dd      d}|r|j                  |       	 t        d|        t        j                  d	 d
t        j                  |d             y # t        $ r%}t        j                  d d|        Y d }~y d }~ww xY w)Nr:   r7   r   subject filename)pagetotalpercentstatusr=   r?   zSetting progress: task:Q Fensure_asciir0   z%] Failed to write progress to redis: )roundgetupdateprintredis_clientsetexjsondumps	Exceptionloggingdebug)	r@   rA   rC   extrarB   progress_datae
prev_statetask_ids	          1/var/www/html/eduruby.in/routes/mcq_extraction.pyset_progressz0extract_text_from_pdf_task.<locals>.set_progressg   s    8=eTE\S0!41G%)EgY_lvlzlz  |E  GI  mJ  Xb  Xf  Xf  gq  su  Xv  wM$$U+U*=/:;""U7)#4iMhmAno U'*OPQsSTTUs   =B 	CB<<C
worker_idxc                    t        j                  d d|  d       	 	 
j                         }|
j	                          n|\  }}	 t        |      }	j                  | d|d      \  }}|||d}5  j                  |       d d d         |       	 dt               v r t        dd       r	 |j                          	 ~t        |dd       r	 |j                          ~t        j                          
j	                          t        j                  d d|  d       y # t        $ r Y (w xY w# 1 sw Y   xY w# t        $ r{}t        j                  d d|  d| d	|        |d
g t        |      d}5  j                  |       d d d        n# 1 sw Y   nxY w |dt        |      i       Y d }~(d }~ww xY w# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y  w xY w# 	 dt               v r@t        dd       r3	 |j                          n# t        $ r Y nw xY w	 ~n# t        $ r Y nw xY wt        |dd       r!	 |j                          n# t        $ r Y nw xY w~n# t        $ r Y nw xY wt        j                          
j	                          w xY w)Nr0   z] Consumer #z started_page_03d)img_name)r@   textfiguresz error processing page : r>   )r@   r_   r`   error
last_error)rS   page_img_outclosez exiting)rQ   inforI   rP   	task_doneocr_page_imagegenerateappend	exceptionstrlocalsgetattrre   gccollect)rZ   itempage_numberpage_imgr_   rd   cropsentrypage_errdetectorqresultsresults_lockrY   rW   total_pagess            rX   consumer_workerz3extract_text_from_pdf_task.<locals>.consumer_workert   s   LL1WI\*XFG557D <KKM(,%X(")(3D +3*;*;HRYQZZ`almp`qOr*;*s'L%%0$5QE% .u-. !k:)VX5',PWY]:^% , 2 2 4%$0 #8Wd;% ( 0 % JJLKKMi l LL1WI\*XFGg !  . .
 ! `%%',zlJabmannpqypz&{|%0"VYZbVcdE% .u-. . . k,PST\P]A^__` $- % $% $- % $%
 $- % $% % !)VX5',PWY]:^% , 2 2 4#, % $%%$0#, % $%"8Wd;% ( 0#, % $%$$ JJLKKMss  D) 	/E 8D8
E G; 6G G G; G+ &G; )	D54D58E=E 	G3G F	GF$	 G=H GH 	GG; GG; 	G($G; 'G((G; +	G84G; 7G88G; ;	HHJ=J	'H87J	8	IJ	IJ	I
	J	
	IJ	IJ	'I87J	8	JJ	JJ	J=		JJ=J(J=c                     	 t        ddz   	      D ]  } t        | 	z   dz
        }t        j                  d d|  d| d
 d	       t	        
| |t              ddt              }t        |      D ]  \  }}| |z   }j                  ||f        	 j                  d	      D ]  }	 |j                            t              D ]  }j                  d         y # t        $ r Y Ew xY w# t        $ r t        j                  d d
        Y w xY w# t        $ rR}t        j                  d d|        t              D ]#  }	 j                  d        # t        $ r Y !w xY w  d }~ww xY w)Nr8   r0   z] Converting pages z..z (dpi=)png)r&   
first_page	last_pageoutput_folderfmtthread_countr.   z*.pngz] No temp images to delete in z] Producer error: )rangeminrQ   rf   convert_from_pathrl   r    	enumerateputglobunlinkrP   rR   rk   )startendimagesoffsetrs   rr   fpath_rU   r%   r&   pdf_pathrx   rW   task_tmpr{   r'   s            rX   producerz,extract_text_from_pdf_task.<locals>.producer   s   ,"1kAozB ]Eej014kBCLL1WI-@r#fUXTYYZ![\. #("%&)(m!%&%1	F -6f,= 7(&+fn{H567]%-]]7%; %E% %%/]@ |,  AEE$K  $- % $%$ ]'2PQYPZ&[\]  !!AgY.@"DE|, Ad$ 
 s   BD C0+C!;C0=#D !	C-*C0,C--C00$DD DD 	E6$)E1E E1 	E,)E1+E,,E11E6)targetargsdaemon)r   r      timeoutz_results.jsonwutf-8encodingc                 &    | j                  dd      S )Nr@   r   )rI   )rs    rX   <lambda>z,extract_text_from_pdf_task.<locals>.<lambda>   s    AEE&!4D     )keyFrG   indentz] Saved OCR results to z] Removed PDF file: z] Failed to remove temp pdf ra   doner=   r>   r?   )r@   rA   rB   rC   r=   r?   outputrD   rE   rF   z$] Failed to remove task tmp folder: z ] Error in PDF extraction task: rb   rC   rb   z(] Failed to write error state to redis: )
processingN),
isinstanceTMP_DIRr   mkdirrl   pdfinfo_from_pathr    intrI   rQ   rf   
ValueErrorCROPS_OUT_DIR
Predictionos	cpu_countmaxr   r!   get_progressrK   	threadingLockr   r   r   rj   joinopenrN   dumpsortedexistsr   rP   warningrL   rM   rO   shutilrmtreerR   rk   rb   )selfr   rW   r%   r&   r'   r(   TMP_DIR_PATHrf   r   r|   r   consumer_threadsitprod_threadoutput_pathoutfpdf_prU   final_progress
error_datarw   rV   rx   ry   rz   rY   r   r{   s    `````                @@@@@@@@rX   extract_text_from_pdf_taskr   7   sY   ],6w,EtG}74$7x= $\R$((7A.3!4q	K=?@!899')td3]!!$!> ?$$g.	
 LLN'a	q#a"34L.;M*/ )/R
ZL)* ~~'
	U8	H 8	H 8	Hv-	 -	` |$ 	'A  qsfTRAGGI##A&	'  &&htD 		! 	AFF2F	 #y%>>cG4 	kIIfW*DEtZ_hij	k 	q	!8FG	VNE||~q	)=hZHI   !~~i4"z26+&
 	U7),iNaf9gh	P h' ;C	k 	k  	VOOay(DXJbQRPSTUU	V&  	PMMAgY&J1#NOO	P
  AgY&FqcJK '#a&9
	Twi0)TZZ
af=gh 	  	TMMAgY&NqcRS	Ts   IP -&N#P 7AN =A"P  %O 
P NP 	O%OP OP 	O>O94P 9O>>P 	R
)R4/Q$#R$$RR
RRRzextractor.run_all_pagesc                    	 t        |dd      5 }t        j                  |      }ddd       g }t        |      }|j                  j                  dd       t              }t        |      xs i }t        j                  j                  d      5 }	t        |d	      D ];  \  }
}|j                  d
d      }t        j                  d| d|
 dt        |       d       t        j                         }|	j!                  t"        |      }	 |j%                  t&              }t        j                         |z
  }t        j                  d| d|ddt        |       d       |j3                  ||d       |
|t5        |
|z  dz  d      |j                  dd      |j                  dd      d d!}t6        j9                  d"| d#t        j:                  |             > 	 ddd       t=        |      }|j                  d$d      5 }t        j>                  ||d%d&       ddd       	 t@        jB                  jE                  |      r-tA        jF                  |       t        j                  d'|        tK        |       ||dd*|j                  dd      |j                  dd      tM        |      |d+}t6        j9                  d"| d#t        j:                  |             t        j                  d,|        tM        |      S # 1 sw Y   xY w# t        j                  j(                  $ r6 t        j*                  d| dt&         d       |j-                          g }Y At.        $ r(}t        j0                  d| d|        g }Y d}~ld}~ww xY w# 1 sw Y   xY w# 1 sw Y   xY w# t.        $ r&}t        jH                  d(| d)|        Y d}~ed}~ww xY w# t.        $ rY}t        j*                  d-|        d.tM        |      d/}t6        j9                  d"| d#t        j:                  |              d}~ww xY w)0z8Celery task for processing all pages and extracting MCQsr   r   r   NTr*   r8   )max_workers)r   r@   ?zStarting page z (index /r~   r   zPage z timed out after u   s — skipping.z raised exception: zFinished page z in z.1fu   s — extracted z MCQs)r@   mcqsr:   r7   r=   r>   r?   r   )r@   rA   rB   r=   r?   rC   rD     r   Fr   zRemoved input JSON: z!Failed to remove temp input json ra   r   )r@   rA   rB   rC   r=   r?   r   ry   zDone. Final saved to zError in MCQ extraction task: rb   r   )'r   rN   loadr   parentr   lenr   
concurrentfuturesThreadPoolExecutorr   rI   rQ   rf   timesubmitprocess_page_objresultPER_PAGE_TIMEOUTTimeoutErrorrb   cancelrP   rk   rj   rH   rL   rM   rO   r   r   r   pathr   remover   r   rl   )r   input_json_pathout_pathrW   fpagesall_resultsr{   rV   executoridxr@   pnumstart_tsfuturevalidated_mcqsrU   elapsedrT   mergedr   r   s                         rX   run_all_pages_taskr   !  s   T/39 	!QIIaLE	! x.dT:%j )/R
22q2A 	WX&uA6 W	Txx,~dV8C5#e*QOP99;!)94@(%+]];K]%LN ))+0~dV4}DTUXYgUhTiinop""D.#IJ  ($cK&73%>B)~~i< *z2 >*! ""U7)#4dDJJ}<UV=W	WD [) ]]3]1 	?QIIfaeA>	?	Xww~~o.		/*3O3DEF
 	F#   !~~i4"z26(m	
 	U7),dDJJ~4NO,XJ788}U	! 	!$ "))66 (MME$/@AQ@RRa"bcMMO%'N  (%%dV3Fqc&JK%'N(	W 	WJ	? 	?  	XOO??PPRSTRUVWW	X,  6qc:;V

 	U7),dDJJz4JKs   O" LA,O" A9NL"B=N &O" N# O" )AN0 5BO" L	O" AN N#N+NNNNN O" #N-(O" 0	O9OO" OO" "	Q+AP??Qc                 b    t         j                  d|        }|rt        j                  |      S y)zGet progress data from RedisrD   N)rL   rI   rN   loads)rW   datas     rX   r   r   {  s.    eG9-.Dzz$r   z/uploadPOST)methodsc                     dt         j                  vrt        ddi      dfS dt         j                  vs!t         j                  d   j	                         st        ddi      dfS t         j                  d   } t         j                  d   j	                         j                         }| j                  dk(  s)| j                  j                         j                  d      st        dd	i      dfS t        j                  t        d
       t        j                  j                  t        | j                        }| j                  |       t        t        j                                }d|| j                  j                         dd}t"        j%                  d| dt'        j(                  |             t*        j-                  ||       t        d|d      dfS )Nfilerb   zNo file part  r=   zSubject is requiredr>   z.pdfInvalid fileTr,   r   starting)rB   r=   r?   rC   rD   r   zUpload startedmessagerW      )r   filesr   formstriplowerr?   endswithr   makedirsr   r   r   saverl   uuiduuid4rL   rM   rN   rO   r   delay)r   r=   temp_pdf_pathrW   initial_progresss        rX   uploadr	    sr   W]]"01366$GLL,C,I,I,K!678#== == D\\)$**,224G}}$--"5"5"7"@"@"H01366 KK$'GGLL$--8MIIm$**,G $%dmmFYFYF[gqrwi($

;K0LM $$]G</GDEsJJr   z/progress/<task_id>c                 z      r dk(  rt        ddi      dfS  fd}t        t         |             dddd	d
      S )N	undefinedrb   zInvalid task IDr   c               3     K   d} 	 t              }|sdt        j                  ddi       d y |j                  d      dk(  s|j                  d      dk(  rdt        j                  |       d y |j                  d      | k7  r,dt        j                  |       d |j                  d      } t	        j
                  d	       ŭw)
Nzdata: rC   	not_foundz

r   rb   rB   r8   )r   rN   rO   rI   r   sleep)last_percentstaterW   s     rX   event_streamzprogress.<locals>.event_stream  s      )Etzz8K*@AB$GGyy"f,		(0Cw0Ntzz%0166yy#|3tzz%0166$yy3JJqM s   C	Cztext/event-streamzno-cachez
keep-aliveno)zCache-Control
ConnectionzX-Accel-Buffering)mimetypeheaders)r   r   r   )rW   r  s   ` rX   progressr    sT     g,!234c99 LN+$'&!%
 r   z/extractc                  0   t         j                  j                  d      xs1 t         j                  xr t         j                  j                  d      } d}| r}t	        |       }|st        ddi      dfS |j                  d      dk7  s|j                  d      st        dd	i      dfS t        |d         }|j                         st        dd
i      dfS |dt         j                  vrt        ddi      dfS t         j                  d   }|j                  dk(  s)|j                  j                         j                  d      st        ddi      dfS t        j                  t        d       t        t        j                  j!                  t        |j                              }|j#                  |       t%        t'        j(                               }t        t        j                  j!                  t        |j*                   d            }ddj                  dd      |j                  dd      d}t,        j/                  d| dt        j0                  |             t2        j5                  t%        |      t%        |      |       t        d|d      dfS )z
    Start MCQ extraction pass.
    Accepts either:
      - form field 'upload_task_id' referencing an earlier /upload task (preferred),
      - OR a direct uploaded .json file in form field 'file' (backwards compatible).
    upload_task_idNrb   zupload_task_id not foundr   rC   r   r   z*upload task not finished or output missingzOCR JSON file not found on disk  r   z+No file part and no upload_task_id providedr>   .jsonr   Tr   z
_mcqs.jsonr   r   r=   r?   )rB   rC   r=   r?   rD   r   zExtraction startedr      )r   r   rI   rN   r   r   r   r   r   r?   r   r  r   r  r   r   r   r  rl   r  r  stemrL   rM   rO   r   r  )r  temp_json_pathupload_stater   extraction_task_idr   r  s          rX   extractr!    sW    \\%%&67n7<<;nGLLL\L\]mLnNN #N3G%?@A3FFH%/|7G7G7QG%QRSUXXXl845$$&G%FGH#MM &G%RSTVYYY}}V$==Bdmm&9&9&;&D&DW&MG^45s::
Gd+bggll7DMMBC		.! TZZ\*BGGLL^-@-@,A*LMNH $%
|GWGWXaceGf  uA  uE  uE  FP  RT  uU  V123T4::FV;WX S0#h-AST3@RSTVYYYr   z/download/<task_id>GETc                    t        |       }|r|j                  d      dk7  rt        ddi      dfS |j                  d      }|rt        j                  j                  |      st        ddi      dfS t        |dd	|  d
      S )NrC   r   rb   zTask not found or not completedr  r   Output file not foundTextracted_mcqs_r  )as_attachmentdownload_name)r   rI   r   r   r   r   r   )rW   r  output_files      rX   downloadr)    s    !EEIIh'61!BCDcII))H%Kbggnn[9!89:C??[oV]U^^cDdeer   z/results/<task_id>c                    	 t        |       }|st        ddi      dfS |j                  d      dk7  rt        d|j                  d      d      dfS d	|v rt        |d	         S |j                  d
      }|st        ddi      dfS t        |      }|j	                         st        ddi      dfS 	 t        |dd      5 }t        j                  |      }d d d        |d	<   t        j                  d|  dt        j                  |             t        |      S # 1 sw Y   FxY w# t        j                  $ r4}t        j                  d| d|        t        ddi      dfcY d }~S d }~wt        $ r4}t        j                  d| d|        t        ddi      dfcY d }~S d }~ww xY w# t        $ r4}t        j                  d|  d|        t        ddi      dfcY d }~S d }~ww xY w)Nrb   zTask not foundr  rC   r   zTask not completed yet)rb   rC   r  ry   r   zOutput file path not specifiedr$  r   r   r   rD   r   zFailed to parse output file ra   zInvalid JSON in output file  zError reading output file zFailed to read output filezError in get_results for task Internal server error)r   r   rI   r   r   r   rN   r   rL   rM   rO   JSONDecodeErrorrQ   rb   rP   )rW   r  r(  r   r   ry   rU   s          rX   get_resultsr.     s   (@W%G%567<<99X&(%=S[I\]^`ccc 5+,, ii)G%EFGLL;'!!#G%<=>CC	Ik39 'Q))A,'  'E)wi0$

58IJ7##' ' ## 	JMM8RsKLG%BCDcII 	IMM6{m2aSIJG%ABCSHH	I  @6wir!EF!89:C??@s   F* 2F* F* #!F* )F* 0D% >DAD% D"D% %F'8)E'!F'"F* 'F'3)F"F'F* "F''F* *	G'3)G"G'"G'z/save-to-db/<task_id>c                 h
   	 t        |       }|st        ddi      dfS t        |t              r|j	                  d      n|}t        |t
              st        ddi      dfS d}d}g }t        |      D ](  \  }	 t        fdd	D              s|j                  d
| d       |dz  }7d   }dx}x}	x}
}t        |t              r|j	                  dd      xs |j	                  dd      }|j	                  dd      xs |j	                  dd      }	|j	                  dd      xs |j	                  dd      }
|j	                  dd      xs |j	                  dd      }nt        |t
              rpt        |      dkD  rt        |d         }t        |      dkD  rt        |d         }	t        |      dkD  rt        |d         }
t        |      dkD  rt        |d         }|r|	s|j                  d
| d       |dz  }j	                  dd      }|rj	                  d      xs d   }j	                  di       j	                  d      xs |}j	                  di       j	                  d      xs |	}	j	                  di       j	                  d      xs |
}
j	                  di       j	                  d      xs |}nd   }j	                  dg       }|rt        j                  |      nd }d    j                         j                         }|r|d   d!v r|d   }nd    j                         }||j                         v rd}n[||	j                         v rd}nF||
j                         v rd}n1||j                         v rd}n|j                  d
| d"       |dz  }1t!        t        |t              r|j	                  d#d      ndt        |t              r|j	                  d$d%      nd%|j                         |j                         |	j                         |
r|
j                         nd|r|j                         nd||j	                  d&d      j                         t#        j$                         '      }|j'                          |dz  }t)        |        + t        d)| d*|||r|nd d+      d,fS # t*        $ r0}|j                  d
| d(t        |              |dz  }Y d }~zd }~ww xY w# t*        $ r4}t-        j.                  d-|  d(|        t        dd.i      d/fcY d }~S d }~ww xY w)0Nrb   zNo results foundr  ry   zInvalid data formatr   r   c              3   &   K   | ]  }|v  
 y w)N ).0r   mcq_items     rX   	<genexpr>z#save_to_database.<locals>.<genexpr>F  s     Xs3(?Xs   )QuestionOptionsAnswerzItem z: Missing required fieldsr8   r6  r>   AaBbCcDdr7      z: Insufficient optionsAmbiguousMathFQuestionLatexr5  OptionsLatex
FigureRefsr7  )r8  r:  r<  r>  z$: Could not determine correct answerr?   r=   generalExplanation)r?   r=   questionoption_aoption_boption_coption_d
figure_refcorrect_answerexplanation
created_atra   zSuccessfully saved z MCQs to database)r   saved_countskipped_counterrorsr   z"Error saving to database for task r,  r+  )r   r   r   dictrI   listr   allrj   r   rl   rN   rO   upperr   r   	final_mcqr   utcnowr  cleanup_temp_filesrP   rQ   rb   )rW   r  mcq_datarP  rQ  rR  indexoptionsrH  rI  rJ  rK  ambiguous_mathrG  figure_refsrL  rM  answer_textmcq_docrU   r3  s                       @rX   save_to_databasera  .  s   n@W% G%7893>> ,6eT+B599Y'(D)G%:;<cAA(2 Q	OE8PX6WXXMME%0I"JK!Q&M #9-<>>>8>hgt,&{{33Kw{{37KH&{{33Kw{{37KH&{{33Kw{{37KH&{{33Kw{{37KH.7|a'C
O7|a'C
O7|a'C
O7|a'C
OxMME%0F"GH!Q&M "*ou!E!'||O<T@TH'||NB?CCCHTHH'||NB?CCCHTHH'||NB?CCCHTHH'||NB?CCCHTHH'
3H 'll<<8CTZZ4
 "*(!3!9!9!;!A!A!C!nQ&7;O&O%3A%6N"*8"4":":"<K"hnn&66$(883.$(883.$(883.eW4X&YZ%*  $:DUD:QUYYz26WY@J5RV@WUYYy)<]f%^^-%^^-%^^-19X^^-r19X^^-r)#1 (]B ? E E G'0 q  #7+YQ	f ,[M9JK&* &fD	
 
  	  eWBs1vh78"  @:7)2aSIJ!89:C??@sz   S4 AS4 !S4 :.R8(S4 )ER8=S4 ?F"R8!S4 #C8R8S4 8	S1%S,&S4 ,S11S4 4	T1=)T,&T1,T1z
/extractorc                  P    dt         vrt        t        d            S t        d      S )Nuserzuser.user_loginzuser/mcq-extractor.html)r
   r   r   r	   r1  r   rX   
extractionrd    s'    W 1233455r   )   r   N<   )Eflaskr   r   r   r   r   r   r	   r
   r   r   
flask_corsr   r   utils.question_extractorutils.openai_pipelineutils.extractor_functionsr   r   
models.mcqr   rW  rQ   concurrent.futuresr   pathlibr   rN   r   r   r  r   r   tempfiler   r   ro   r   dotenvr   r   
celery_appr   ssl__name__extractor_bpRedisgetenvrL   r   r   DEBUG_OUTPUTS_DIRr    queuer!   r"   taskr   r   r   r   router	  r  r!  r)  r.  ra  rd  r1  r   rX   <module>r{     s   E  E  E ) & # F '     	       	     
 h/ \  u{{	<	)	<	&ryyQ |
 ** 		.)   	$>?Y\UWdC dSV d-04ZdORd @dR $67V 8Vr Ix0K 1K< )*  +< J1,Z 2,Zb )E7;	f <	f (5':)@  ;)@X +fX>o@  ?o@d L5'26 36r   