
    th             	          S SK JrJrJrJrJr  \" S5        S SKJrJrJ	r	J
r
JrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJrJrJr  S S
KJr  S SKrS SKrS SK J r J!r!  S SK"r"S SK#r#S SK$r$S SK%r%S SK&J'r'  S SK(J)r)  S SK*J+r+  \" \,5      r-\" \-5        \R\                  R_                  SS5      \-R`                  S'   \!" SS9\-R`                  S'   \$Rb                  " \$Rd                  SS9  \$Rf                  " \,5      r4\-Rk                  S5      S 5       r6\-Rk                  S5      S 5       r7\-Rk                  S5      S 5       r8\-Rk                  S5      S 5       r9\-Rk                  S5      S  5       r:\-Rk                  S!5      S" 5       r;\-Rk                  S#5      S$ 5       r<\-Rk                  S%5      S& 5       r=\-Rk                  S'5      S( 5       r>\-Rk                  S)5      S* 5       r?\-Rk                  S+5      S, 5       r@\-Rk                  S-5      S. 5       rA\-Rk                  S/5      S0 5       rB\-Rk                  S15      S2 5       rCS SK(J)r)  S3\D" 5       \D" 5       S4S4/ S \)" 5       S5.rE\-Rk                  S6S7/S89S9 5       rF\-Rk                  S:5      S; 5       rG\-Rk                  S<5      S= 5       rH\-Rk                  S>5      S? 5       rI\-Rk                  S@5      SA 5       rJ\-Rk                  SB5      SC 5       rK\-Rk                  SD5      SE 5       rL\-Rk                  SFS7/S89SG 5       rM\" 5       rN\-Rk                  SHS7/S89SI 5       rO\-Rk                  SJ5      SK 5       rP\-Rk                  SL5      SM 5       rQ\-Rk                  SN5      SO 5       rR\-Rk                  SPSQ/S89SR 5       rS\-Rk                  SSS7/S89ST 5       rT\-Rk                  SUS7/S89SV 5       rU\-Rk                  SWSQ/S89SX 5       rV\-Rk                  SYSQ/S89SZ 5       rW\-Rk                  S[SQ/S89S\ 5       rX\-Rk                  S]SQ/S89S^ 5       rY\-Rk                  S_SQ/S89S` 5       rZ\-Rk                  SaSQ/S89Sb 5       r[\-Rk                  ScSQ/S89Sd 5       r\\-Rk                  Se5      Sf 5       r]\-Rk                  Sg5      Sh 5       r^\-Rk                  Si5      Sj 5       r_\-Rk                  SkS7/S89Sl 5       r`\-Rk                  SmS7/S89Sn 5       ra\-Rk                  SoS7/S89Sp 5       rb\-Rk                  SqS7/S89Sr 5       rc\-Rk                  SsS7/S89St 5       rd\-Rk                  SuS7/S89Sv 5       re\-Rk                  SwS7/S89Sx 5       rf\-Rk                  SyS7/S89Sz 5       rg\-Rk                  S{S7/S89S| 5       rh\-Rk                  S}SQ/S89S~ 5       ri\-Rk                  SS7/S89S 5       rj\-Rk                  SS7/S89S 5       rk\-Rk                  SSQ/S89S 5       rl\-Rk                  SSQ/S89S 5       rm\-Rk                  SSQ/S89S 5       rn\-Rk                  SSQ/S89S 5       ro\-Rk                  SSQ/S89S 5       rp\-Rk                  SS7/S89S 5       rq\-Rk                  SSQ/S89S 5       rr\-Rk                  SSQ/S89S 5       rs\-Rk                  SS7/S89S 5       rt\-Rk                  SS7/S89S 5       ru\-Rk                  SSQ/S89S 5       rv\-Rk                  SS/S89S 5       rw\-R                  S5      S 5       ry\-R                  S5      S 5       rz\-R                  S5      S 5       r{\-R                  S5      S 5       r|\-R                  S 5       r~\,S:X  a  \-R                  SSS9  gg)    )init_error_loggercapture_exceptioncapture_messageset_tagset_contextzai-test-case-generator-main)Flaskrequestjsonify	send_filerender_templateafter_this_request)CORS)fetch_issueAzureClient)generate_test_casegenerate_test_case_from_image)save_test_scriptsave_excel_reportextract_test_type_sectionsparse_traditional_format)MongoHandlerN)datetime	timedelta)urlparse)Lock)wrapsJWT_SECRET_KEYz$your-secret-key-change-in-production   daysJWT_ACCESS_TOKEN_EXPIRESz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformat/c                  ^    [         R                  " 5       R                  S5      n [        SU S9$ )N%Y%m%d%H%M%Sz
index.html	timestamp)r   nowstrftimer   r)   s    'D:\Projects\AI-TestCaseGenerator\app.pyindexr.   %   s'     ''7I<9==    z
/analyticsc                      [        S5      $ )zAnalytics dashboard pagezanalytics.htmlr    r/   r-   analytics_dashboardr3   +        +,,r/   z/documentationc                      [        S5      $ )zDocumentation pagezdocumentation.htmlr1   r2   r/   r-   documentationr6   0   s     /00r/   z/comparisonc                      [        S5      $ )z$Competitive analysis comparison pagezcomparison.htmlr1   r2   r/   r-   
comparisonr8   5   s     ,--r/   z/signinc                      [        S5      $ )zSign in pagezsignin.htmlr1   r2   r/   r-   signinr:   :        =))r/   z/signupc                      [        S5      $ )zSign up pagezsignup.htmlr1   r2   r/   r-   signupr=   ?   r;   r/   z
/dashboardc                      [        S5      $ )zUser dashboard pagezdashboard.htmlr1   r2   r/   r-   	dashboardr?   D   r4   r/   z/reset-passwordc                      [        S5      $ )zReset password pagereset-password.htmlr1   r2   r/   r-   reset_passwordrB   I   s     011r/   z/reset-password-confirmc                      [         R                  R                  S5      n U (       d
  [        SSS9$ [	        5       nUR                  U 5      nUS   (       d
  [        SSS9$ [        SXS   S	9$ )
z Password reset confirmation pagetokenrA   zInvalid or missing reset tokenerrorsuccesszInvalid or expired reset tokenzreset-password-confirm.htmlemail)rD   rH   )r	   argsgetr   r   verify_password_reset_token)rD   mongo_handlertoken_results      r-   reset_password_confirmrN   N   sn     LLW%E4<\]] !NM <<UCL	"4<\]]8ZaMbccr/   z/admin-dashboardc                      [        S5      $ )zAdmin dashboard pagezadmin-dashboard.htmlr1   r2   r/   r-   admin_dashboardrP   ^   s     122r/   z/testc                      [         R                  S5        [        S[        R                  " 5       R                  S5      S.5      $ )Nz=== TEST ENDPOINT CALLED ===zServer is working!r(   )messager*   )loggerinfor
   r   r+   r,   r2   r/   r-   testrU   c   s2    
KK./3(,,.BYBYZhBijkkr/   z/test-emailc                      SSK Jn   U " 5       nU(       a1  [        SS[        R                  " 5       R                  S5      S.5      $ [        SS[        R                  " 5       R                  S5      S.5      S	4$ ! [         aj  n[        R                  S
[        U5       35        [        SS[        U5       3[        R                  " 5       R                  S5      S.5      S	4s SnA$ SnAff = f)zTest email notification systemr   )test_email_configurationrG   zTest email sent successfully!r(   statusrR   r*   rF   z5Failed to send test email. Check email configuration.  z#Error testing email configuration: zError testing email: N)
utils.email_notifierrW   r
   r   r+   r,   	ExceptionrS   rF   str)rW   rG   es      r-   
test_emailr_   h   s    A*,#:%\\^44^D   !R%\\^44^D  	   :3q6(CD.s1vh7!00@
  	 	s%   AA: 2A: :
C.AC)#C.)C./test-error-notificationc                  F    SSK Jn   [        S5      nU " SSSS[        R                  " 5       R                  5       S.US	9nU(       a1  [        S
S[        R                  " 5       R                  S5      S.5      $ [        SS[        R                  " 5       R                  S5      S.5      S4$ ! [         aj  n[        R                  S[        U5       35        [        SS[        U5       3[        R                  " 5       R                  S5      S.5      S4s SnA$ SnAff = f)z'Test critical error notification systemr   ) send_critical_error_notificationz;This is a test critical error for email notification system
TEST_ERRORz Test critical error notificationTr`   )rU   endpointr*   )
error_typeerror_messagecontext	exceptionrG   z*Test error notification sent successfully!r(   rX   rF   zBFailed to send test error notification. Check email configuration.rZ   z"Error testing error notification: zError testing notification: N)r[   rb   r\   r   r+   	isoformatr
   r,   rS   rF   r]   )rb   
test_errorrG   r^   s       r-   test_error_notificationrk      s   $I \]
2#<6%\\^557
 !	
 #G%\\^44^D   !_%\\^44^D  	   9#a&BC5c!fX>!00@
  	 	s%   A6B, 92B, ,
D 6ADD D z/resultsc                  "   [         R                  R                  S5      =(       d    [         R                  R                  S5      n [        R	                  SU  35        U (       a  [        5       nUR                  U 5      n[        R	                  SU 35        U(       aB  UR                  R                  SU 05      nU(       a  UR                  S0 5      O0 n[        SX$S9$ [        R                  S	U  35        [        S
SS9S4$ [        S
SS9S4$ )NkeyrD   z!Received request with key/token: z#Retrieved URL params from MongoDB: _idstatus_timestampszresults.html)
url_paramsro   zNo data found for key/token: 
error.htmlz[The requested test case data could not be found. The link may have expired or been invalid.rf     z/Invalid URL. Please use a valid test case link.  )r	   rI   rJ   rS   rT   r   get_url_data
collectionfind_oner   warning)	short_keyrL   rp   documentro   s        r-   resultsr{      s       'D7<<+;+;G+DI
KK3I;?@$"//	:
9*FG$//88%9KLHIQ-@" EWY">jnnNN:9+FG"<  @]  ^  `c  c  c <7hiknnnr/   F )is_generatingcompleted_typestotal_typesphasecurrent_test_typelogprogress_percentagelockz/api/generatePOST)methodsc                   B  ^A  [         R                  S5        S n [        R                  (       a'   [        R                  n [         R                  S5        O%[        R                  n [         R                  S5        [         R                  S[        U 5       35        [         R                  S	U (       a  [        U R                  5       5      OS
 35        [        R                  (       a  [         R                  S[        [        R                  R                  5       5       35        [        R                  R                  5        Hh  u  p#[         R                  SU SUR                   S[        US5      (       a  [!        UR#                  5       5      OS 35        UR%                  S5        Mj     / mA[        R                  (       a#  U R'                  SU R'                  S/ 5      5      mAOM[        U S5      (       a  U R)                  S5      mAO*U R'                  S/ 5      mA[+        TA[,        5      (       a  TA/mA[+        TA[,        5      (       a  TA/mATA(       d  [        SS05      S4$ S n[        R.                  R'                  S5      nU(       ah  UR1                  S5      (       aR   UR3                  S5      S   n[5        5       nUR7                  U5      nU(       a  UR'                  S5      (       a  US   nU (       d  [        SS05      S4$ U R'                  S5      n	U	(       d  [        SS05      S4$ [:        R<                  " 5       n
S n [5        5       nS U	TAU (       a1  U R'                  S!5      (       a  [!        U R'                  S!/ 5      5      OSU
R?                  5       S".U R'                  S#5      [        R.                  R'                  S$5      [        R@                  U	TAU (       a1  U R'                  S!5      (       a  [!        U R'                  S!/ 5      5      OSS%.nU(       a(  UR'                  S&5      US''   UR'                  S(5      US)'   URC                  U5        [D        S+      S,[D        S-'   [G        5       [D        S.'   S/[D        S0'   S1[D        S2'   / [D        S3'   S[D        S4'   S1[D        S5'   U	S6:X  a  [G        S7 TA 5       5      [D        S8'   OfU	S9:X  a  [G        S: TA 5       5      [D        S8'   OFU R'                  S!/ 5      n[+        U[,        5      (       a  U/n[G        UA4S; jU 5       5      [D        S8'   S S S 5        U	S9:X  Ga  [         R                  S<5        [         R                  S=U  35        [I        S>U  35        / nU R'                  S?0 5      nUR'                  S9S15      RK                  5       n[         R                  S@U 35        [I        SAU 35        U(       d  [I        SB5        [        SSC05      S4$  [I        SDU 35        [M        U5      n[O        URP                  URR                  /5      (       d  [I        SE5        [        SSF05      S4$ [I        SGU 35         [T        R&                  " USHS$SI0SJ9n[I        SKURV                   35        URV                  SL:  d  URV                  SM:  a;  [I        SNURV                   35        [         R9                  SOURV                   SP35        [I        SS5         SSTK,J-n  [         R                  SU5        [I        SV5        TA(       a  TAOSZ/n[         R                  S[TA 35        [         R                  S\U 35        [I        S]U 35        SS K.n[-        UR_                  5       5      n[I        S^U 35        SS K0n[I        S_5        SS` jn[D        S+      Sa[D        S0'   [D        S3   Rc                  SbU ScU 35        S S S 5        URe                  UUUUU(       a  UR'                  S&5      OS 4S,Sd9Rg                  5         [        SeU05      $ U	S6:X  Ga  [         R                  Si5        [         R                  S[        [        R                  R                  5       5       35        [         R                  Sj[        [        R                  R                  5       5       35        / nSk[        R                  ;  a$  [         R                  Sl5        [        SSm05      S4$ [        R                  Sk   n[         R                  SnUR                   S[        US5      (       a  [!        UR#                  5       5      OS 35        UR%                  S5        UR                  S1:X  a$  [         R                  So5        [        SSp05      S4$ SS K.n[:        Rj                  " 5       Rm                  Sq5       Sr[-        UR_                  5       5      S Ss  3n[n        Rp                  Rs                  [n        Rp                  Ru                  [v        5      StSu5      n[n        Rx                  " US,Sv9  [n        Rp                  R{                  UR                  5      S   nSwU U 3n[n        Rp                  Rs                  UU5      nUR}                  U5         SSxK?J@n  TA(       d@  [n        R                  " U5        [D        S+      Sf[D        S-'   S S S 5        [        SS05      S4$ S n S,n!/ n"TA H  n# [         R                  SyU# Sz35        U" UU#/S{9n$U$(       aE  U (       a	  U S|U$-   -  n OU$n [D        S+      U SrU# 3n%[D        S.   R                  U%5        S S S 5        Mq  U"Rc                  S}U# Sz35        [         R                  S}U# Sz35        Sfn!M     U (       d  [n        R                  " U5        [D        S+      Sf[D        S-'   S S S 5        Sn&U"(       aZ  U&SU"S    3-  n&U" HI  n'SU';   d  SU';   a  Sn&  O:SU'R                  5       ;   d  SU'R                  5       ;   d  M=  [        SSS9S4s  $    [        SU&05      S4$ SU 3n([        U U(5      n)[        U U(5      n*U)(       Ga  U*(       Ga  U)U*S.n+/ n,[        U R3                  S|5      5       H:  u  n-n.U.RK                  5       (       d  M  SU-S-    3n/U,Rc                  U/U.S1S.5        M<     [        U 5      n0/ n1U0(       a6  U0R                  5        H!  u  n2n3[        U3U2S9n4U1R                  U45        M#     O[        U 5      n1[5        5       nUR                  U,S6UU1S.US6U(       a  US&   OS 5      n[:        R<                  " 5       n5U5U
-
  R                  5       n6 U(       a  SUS6TAS[!        U+5      U6U
R?                  5       U5R?                  5       U6S.	U R'                  S#5      [        R.                  R'                  S$5      [        R@                  S6TASS%.nU(       a(  UR'                  S&5      US''   UR'                  S(5      US)'   URC                  U5        [D        S+      [D        S8   R                  5       [D        S.'   Sf[D        S-'   S S S 5        [        S,UU+S.5      $ [n        R                  " U5        [D        S+      Sf[D        S-'   S S S 5        [        SS05      S4$ [        R                  n U R'                  SS5      n	U R'                  S!/ 5      n[         R                  SU	 35        [         R                  SU 35        U R'                  SU R'                  S/ 5      5      mA[+        TA[,        5      (       a  TA/mATA(       d  [        SS05      S4$ [+        U[,        5      (       a  U/n[         R                  SU S[!        U5       S35        [         R                  STA 35        [!        U5      SH:  a#  [         R                  S[!        U5       S35        OT[!        U5      S:  a#  [         R                  S[!        U5       S35        O"[         R                  S[!        U5       S35        0 n+S,n!U GH  n7[         R                  SU7 35        S n U	S:X  Ga  U R'                  S5      n8[         R                  SU7 35         [        U7U85      n9U9(       d-  [         R9                  SU7 35        [        SSU7 S305      S4s  $  [         R                  SU7 SU9R'                  SS5       35        TA GH%  n# [         R                  SyU# SU7 35        [        U9S   S   U9S   S   U#/S9n$U$(       a  U (       a	  U S|U$-   -  n OU$n [D        S+      U7 SrU# 3n%[D        S.   R                  U%5        [!        [D        S.   5      [!        [D        S8   5      -  S-  n:[         R                  S[!        [D        S.   5       S[!        [D        S8   5       SU:S S35        S S S 5        [         R                  SU# SU7 35        GM  [         R9                  SU# SU7 35        Sfn!GM(     GO7U	S:X  Ga0  [         R                  S5        U R'                  S5      n;[         R                  SU; 35        [         R                  S[        U;5       35        U;(       a  [         R                  S[+        U;[        5      (       a  [        U;R                  5       5      OS 35        [         R                  S[+        U;[        5      (       a  [        U;R                  5       5      OS 35        U;(       a@  [O        U;R                  5       5      (       a"  [         R                  SU; 35        [        U;S9n<Oc[         R                  S5        [         R                  S[        U;5       SU;(       a  [O        U;R                  5       5      OSf 35        [        5       n< U<R                  U7/5      n=U=(       a  [!        U=5      S:X  ax  [        U<S5      (       aR  U<R                  n>SU>;   a  [        SS05      S4s  $ SU>;   a  [        SSU7 S305      S4s  $ [        SSU> 305      S4s  $ [        SSU7 S305      S4s  $  U=S   n?TA H  n# [        U?S   U?S   U#/S9n$U$(       a  U (       a	  U S|U$-   -  n OU$n [D        S+      U7 SrU# 3n%[D        S.   R                  U%5        [!        [D        S.   5      [!        [D        S8   5      -  S-  n:[         R                  S[!        [D        S.   5       S[!        [D        S8   5       SU:S S35        S S S 5        [         R                  SU# SU7 35        M  Sfn!M     U (       d  [         R9                  SU7 S35        GMC  [         R                  SU7 S35        S1Rs                  S U7 5       5      n@SU@ 3n([        U U(5      n)[        U U(5      n*U)(       a1  U*(       a*  U)U*U S.U+U7'   [         R                  SU7 SU) SU* 35        GM  [         R                  SU7 SU) SU* 35        GM     [         R                  S[        U+R                  5       5       S[!        U+5       S35        [D        S+      Sf[D        S-'   S S S 5        U+(       dc  [         R                  S5        U	S:X  a  [        SS05      S4$ U	S:X  a  [        SS05      S4$ U	S6:X  a  [        SS05      S4$ [        SS05      S4$ / n,U GH  n7U7U+;   d  M  [        U+U7   R'                  SS15      R3                  S|5      5       H=  u  n-n.U.RK                  5       (       d  M  SU7 SrU-S-    3n/U,Rc                  U/U.S1S.5        M?     [5        5       nUR                  U+U,U	US.U(       a  US   OS X(       a  US&   OS 5      n[D        S+      U[D        S5'   S S S 5        [:        R<                  " 5       n5U5U
-
  R                  5       n6 U(       a  SUU	TA[!        U5      [!        U+5      U6U
R?                  5       U5R?                  5       U(       a  U6[!        U5      -  OSS.	U R'                  S#5      [        R.                  R'                  S$5      [        R@                  U	TA[!        U5      S%.nU(       a(  UR'                  S&5      US''   UR'                  S(5      US)'   URC                  U5        GM  GM     [        S,WU+S.5      $ ! [
         a1  n[         R                  SU 35        [        SS05      S4s S nA$ S nAff = f! [
         a,  n[         R9                  S[-        U5       35         S nAGNsS nAff = f! [
         a,  n[         R                  S*[-        U5       35         S nAGNES nAff = f! , (       d  f       GN}= f! [
         a2  n[I        SQU 35        [         R9                  SRU SP35         S nAGNS nAff = f! [
         aB  n[         R                  SWU 35        [I        SXU 35        [        SSWU 305      SY4s S nA$ S nAff = f! , (       d  f       GNx= f! [T        Rh                   aR  n[D        S+      Sf[D        S-'   S S S 5        O! , (       d  f       O= f[        SSg[-        U5       305      S4s S nA$ S nAf[
         as  n[         R                  Sh[-        U5       35        [D        S+      Sf[D        S-'   S S S 5        O! , (       d  f       O= f[        SSh[-        U5       305      SY4s S nA$ S nAff = f! , (       d  f       GNn= f! , (       d  f       GMj  = f! [         a  n[-        U5      n&U"Rc                  U&5        [         R                  S~U# SU& 3S,S9  Sfn!SU&R                  5       ;   d  SU&R                  5       ;   az  [n        Rp                  R                  U5      (       a  [n        R                  " U5        [D        S+      Sf[D        S-'   S S S 5        O! , (       d  f       O= f[        SU&S9S4s S nAs  $  S nAGMX  S nAf[
         aQ  nU"Rc                  S~U# S[-        U5       35        [         R                  S~U# S[-        U5       3S,S9  Sfn! S nAGM  S nAff = f! , (       d  f       GN= f! [
         a,  n[         R                  S[-        U5       35         S nAGNS nAff = f! , (       d  f       GN= f! , (       d  f       GNi= f! [
         Gae  n[n        Rp                  R                  U5      (       a  [n        R                  " U5        [D        S+      Sf[D        S-'   S S S 5        O! , (       d  f       O= f[         R                  S[-        U5       3S,S9  S[-        U5       S3n&S[-        U5      R                  5       ;   d  S[-        U5      R                  5       ;   a  Sn&OyS[-        U5      R                  5       ;   d  S[-        U5      R                  5       ;   a  Sn&O<S[-        U5      R                  5       ;   d  S[-        U5      R                  5       ;   a  Sn&[        SU&05      SY4s S nA$ S nAff = f! [
         aL  n[         R                  SU7 S[-        U5       35        [        SS[-        U5       S305      SY4s S nAs  $ S nAff = f! , (       d  f       GN= f! [
         a5  n[         R                  S~U# SU7 S[-        U5       35        Sfn! S nAGM#  S nAff = f! [
         aK  n[         R                  SU7 S[-        U5       35        [        SS[-        U5       305      SY4s S nAs  $ S nAff = f! , (       d  f       G
NR= f! [
         a2  n[         R                  S~U# S[-        U5       35        Sfn! S nAGMT  S nAff = f! , (       d  f       G	N]= f! , (       d  f       GN2= f! [
         a-  n[         R                  S[-        U5       35         S nAG	M6  S nAff = f! [
         a  n[         R                  S[-        U5       3S,S9  [        UW	TAW[        R.                  R'                  S$S5      [        R@                  S.5        [D        S+      Sf[D        S-'   S S S 5        O! , (       d  f       O= f[        S[-        U5      05      SY4s S nA$ S nAff = f)Nz === GENERATE ENDPOINT CALLED ===zRequest processed as JSONzFailed to parse JSON request: rF   zInvalid JSON requestrt   zRequest processed as FormDatazRequest data type: zRequest data keys: NonezRequest files: zFile : z, size: readunknownr   ztestCaseTypes[]testCaseTypesgetlistz)Please select at least one test case typeAuthorizationBearer     rG   userFailed to verify auth token: zNo request data received
sourceTypezSource type is requiredgenerate_button_clickitemId)source_typetest_case_types
item_countgeneration_start_time
session_id
User-Agent
event_type
event_datar   
user_agent
ip_addressr   r   r   iduser_idrole	user_rolez'Failed to track generate button click: r   Tr}   r~   startingr   r|   r   r   r   final_url_keyimagec              3   ,   #    U  H
  nS U 3v   M     g7f)image_Nr2   .0	test_types     r-   	<genexpr>generate.<locals>.<genexpr>D  s     6l]kPY	{7K]k   r   urlc              3   ,   #    U  H
  nS U 3v   M     g7f)url_Nr2   r   s     r-   r   r   G  s     6j[iii[7I[ir   c              3   D   >#    U  H  nT  H  o! S U 3v   M     M     g7f)_Nr2   )r   item_idr   selected_typess      r-   r   r   M  s4       7I_gT[  zHlu!I;7O  zH7O_gs    z === URL SOURCE TYPE DETECTED ===zReceived data: z[DEBUG] URL request received: 
url_configzURL from config: z[DEBUG] URL extracted: z[DEBUG] No URL found in requestURL is requiredz%[DEBUG] Starting URL processing for: z[DEBUG] Invalid URL formatInvalid URL formatz#[DEBUG] Testing URL accessibility: 
   zsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36)timeoutheadersz[DEBUG] URL response status:    i,  z$[DEBUG] URL not accessible, status: zURL returned status z, but continuing anywayz[DEBUG] URL access error: zCould not access URL: z"[DEBUG] Importing URL generator...generate_url_test_casesz#Successfully imported URL generatorz+[DEBUG] URL generator imported successfullyzError importing URL generator: z[DEBUG] Import error: rZ   dashboard_functionalzSelected types from request: zTest case types to generate: z[DEBUG] Test case types: z[DEBUG] Generated URL key: z/[DEBUG] Starting async URL generation thread...c                 
    [        SU  SU 35        [        R                  S5        [        R                  " 5       n[
        S      S[
        S'   [
        S   R                  SU  35        S S S 5        [        S	5        S
SKJn  [        SU  35        [
        S      S[
        S'   [
        S   R                  SU 35        S S S 5        U" X5      n[        R                  S[        U5       35        U(       d  [        S5      eSU S3n[        R                  R                  [        R                  R                  [        5      S5      n[        R                   " USS9  [        R                  R                  X5      n	[#        U	SSS9 n
U
R%                  SU  S35        U
R%                  S5        U
R%                  U5        S S S 5        SU 3n['        Xk5      n[        R                  SU 35        USU UU	S[        R(                  " 5       S.n [+        5       n[        R                  S [-        U5       S!U(       a  [/        U5      OS
 35        [        R                  S"U(       a  US S# OS$ 35        [1        U5      n[        R                  S%[-        U5       S!U(       a  [/        U5      OS
 35        U(       a  [3        U5       H  u  nnUR5                  S&/ 5      n[        R                  S'US(-    S)UR5                  S*S+5       S,[/        U5       S-35        U(       a  [        R                  S.US
    35        Mw  [        R7                  S/US(-    35        M     [9        U[:        5      (       a'  [        R=                  S0US S1  35        S2S3S4S5S6/S7S8./nO8[9        U[>        5      (       d#  [        R=                  S9[-        U5       35        / nURA                  USU UUS:.USU5      n[        R                  S;U 35         [        R                  " 5       nUU-
  RI                  5       nS?USUS(S(UURK                  5       URK                  5       US@.	S SASBSUS(SC.nU(       a  UUSD'   WRM                  U5        [        R                  SE5        [
        S      [O        [
        SG   5      [
        SH'   SI[
        SJ'   SK[
        SL'   S[
        S'   [
        S   R                  SM5        U[
        SN'   [        R                  SOU 35        S S S 5        g ! , (       d  f       GN= f! , (       d  f       GNg= f! , (       d  f       GNx= f! [B         ap  n[        R=                  S<U 35        [        R=                  S=[-        U5       35        S
S K"n[        R=                  S>URG                  5        35        Un S nAGNS nAff = f! [B         a#  n[        R=                  SFU 35         S nAGN[S nAff = f! , (       d  f       g = f! [B         av  n[        R=                  SPU 35        [
        S      SI[
        SJ'   SQ[
        S'   [
        S   R                  SRU 35        S S S 5         S nAg ! , (       d  f        S nAg = fS nAff = f)SNz [DEBUG ASYNC] Starting for URL: z	, types: z2[URL ASYNC] Starting direct URL content generationr   fetching_contentr   r   zFetching content from z([DEBUG ASYNC] Importing URL generator...r   r   z%[DEBUG ASYNC] Fetching content from: ai_generationz2Generating test cases from URL content for types: z9[URL ASYNC] Direct URL generation finished, has content: z.Failed to generate test cases from URL contenturl_test_cases_.txtuploadsTexist_okwutf-8encodingzURL: 
z9Generated Test Cases (via direct URL content analysis):

z"[URL ASYNC] Generated Excel file: r   	completed)url_keyr   r   r   content_filerY   
created_atz-[URL ASYNC] About to parse test cases. Type: z
, Length: z+[URL ASYNC] First 500 chars of test cases: rZ   r   z$[URL ASYNC] Parsed test data. Type: Stepsz[URL ASYNC] Test case r   z 'TitleUnknownz' has z stepsz[URL ASYNC] First step: z)[URL ASYNC] No steps found for test case zJ[URL ASYNC] parse_traditional_format returned a string instead of a list: r   GeneralzGenerated Test CasezTest scenario from URL contentzStep 1: Navigate to the URLzStep 2: Verify contentz+Content should be accessible and functional)Sectionr   Scenarior   Expected Resultz?[URL ASYNC] parse_traditional_format returned unexpected type: )
test_casesr   r   r   	test_dataz*[URL ASYNC] Saved test case with URL key: z&[URL ASYNC] Failed to save test case: z[URL ASYNC] Exception type: z[URL ASYNC] Full traceback: test_case_generated	r   r   r   r   files_generatedgeneration_duration_secondsr   generation_end_timeaverage_time_per_itemzURL Generator	127.0.0.1r   r   z2[URL ASYNC] Tracked URL test case generation eventz6[URL ASYNC] Failed to track URL test case generation: r   r~   Fr}   d   r   zGeneration completedr   z4[URL ASYNC] Set final_url_key in generation status: z[URL ASYNC] Error: rF   Error: )(printrS   rT   r   utcnowgeneration_statusappendai.url_generatorr   boolRuntimeErrorospathjoindirname__file__makedirsopenwriter   r+   r   typelenr   	enumeraterJ   rx   
isinstancer]   rF   listsave_test_caser\   	traceback
format_exctotal_secondsri   track_eventset)
target_urltypes
result_keyr   r   r   test_cases_localtest_cases_filename_localuploads_dirtest_cases_filepath_localffile_base_name
excel_file
task_localmongo_handler_localstructured_test_datai	test_casestepsurl_key_finalmer   r   generation_durationr   tracking_errorgen_errs                              r-   _run_url_generation_async+generate.<locals>._run_url_generation_async  s   XQ @IV[U\]^$XY 190A-.v69K-g6-e4;;>TU_T`<ab 7
 HIL Ej\RS /v69H-g6-e4;;>pqvpw<xy 7 ,C:+U(&_`deu`v_w$xy/"./_"`` 7Fj\QU4V1&(ggll277??83Li&XK$?46GGLL4h1!";S7SWXGGeJ<r$:;GG&acGG$45 T ,;:,)G%67G%X
&H$UV (2+0#-/4,E&1*2,,.&
172>./"KK*WX\]mXnWooy  Tdz}  O  {P  jk  zl  )m  n"KK*U  qAVfgkhkVl  GM  VN  )O  P3KL\3]0"KK*NtThOiNjjt  Sgux  zN  vO  mn  uo  )p  q  44=>R4SLAy,5MM'2,FE$*KK2H1RPYP]P]^egpPqOrrxy|  ~C  zD  yE  EK  1L  %M',(.6NuUVxj4Y(Z(.9bcdefcfbg7h(i 5T  **>DD &/y  {O  PT  QT  {U  zV  .W  !X 09-B0P.KMe-f7d9" 8# 4 &00Dd%K%K &/nos  uI  pJ  oK  .L  !M79 4 -@,N,N.>/4'138-AP  *5'-;M #KK*TUbTc(det2://2C/3FI^3^2m2m2o/ /D/<387<2378CV=R=\=\=^;N;X;X;Z=P
/" /3.=.9/438./%*J,  '8?
9 5/;;JG"KK*\^
 /v6CFGXYfGgCh-.?@AF-o>GJ-.CD9D-g6-e4;;<RSAN-o>"KK*^_l^m(no 76I 76 76  TS~  ) 7"LL+QRTQU)VW"LL+GRz)RS,"LL+G	H\H\H^G_)`a,6M7N  ) t"LL+abpaq)rsst 76 % Q':7)%DE.v6AF-o>9@-g6-e4;;ggY<OP 7666Qs   AX %T+0X %T  C	X 	8T2AX G3U BW 	X A.W1X 
TX  
T/*X 2
U<X 
V>A%V93X 9V>>X 
W.W)#X )W..X 1
W?;X ?X 
Z!Y=-.Y(Y=(
Y:	2Y=:Y==ZqueuedzQueued URL generation for z with types: )targetrI   daemonr   FzFailed to access URL: zError processing URL content: z"=== IMAGE SOURCE TYPE DETECTED ===zRequest form data: 	imageFilezNo imageFile in request.fileszNo image file uploadedzImage file received: zEmpty filename receivedzNo selected file%Y%m%d_%H%M%Sr      testsimagesr   r   r   zGenerating z test cases from image)r   

zFailed to generate zError generating z test cases from image: exc_infoapi keyauthorizationrq   rr   z test cases: z(Failed to generate test cases from imagemodel_not_foundinvalid_request_errorzThe OpenAI model required for image processing is not available or has been deprecated. Please check your OpenAI account access.zJOpenAI API authentication failed. Please check your API key configuration.test_image_)txtexcelz	TC_KAN-1_   )test_case_idcontentrY   default_section)r   r   image_idr   r   r   z,Failed to track image test case generation: )rG   r   fileszFailed to save test case fileszImage processing error: zN. Please ensure the image is clear and in a supported format (JPG, PNG, JPEG).ziThe OpenAI model required for image processing is not available. Please check your OpenAI account access.quota
rate limitzBOpenAI API quota exceeded or rate limited. Please try again later.jiraz$Processing request for source_type: zRaw item_ids from request: zProcessed item_ids: z	 (count: )zSelected test types: zLarge batch detected: z  items. Processing in batches...   zMedium batch detected: z items.zSmall batch: zProcessing item_id: jira_configz!Fetching Jira issue for item_id: zFailed to fetch Jira issue for zFailed to fetch Jira issue z<. Please check your credentials and ensure the issue exists.zJira connection error for zJira connection error: z'. Please check your Jira configuration.z Successfully fetched Jira issue rm   r   z test cases for fieldsdescriptionsummary)r6  r7  r   r   zProgress update: r&   z = z.1f%zSuccessfully generated zNo test cases generated for z for azurez=== AZURE SECTION ENTERED ===azure_configzAzure config received: zAzure config type: zAzure config keys: z
Not a dictzAzure config values: zUsing frontend Azure config: )r:  z,Using environment variables for Azure configzReason: azure_config exists: z, all values present: 
last_error401zAzure DevOps authentication failed. Please check your Personal Access Token (PAT) and ensure it has "Work Items (Read)" permissions.  404z
Work item zR not found in Azure DevOps. Please verify the work item ID exists in your project.rs   zAzure DevOps error: zFailed to fetch work item zB from Azure DevOps. Please check your configuration and try again.zAzure client error for item zAzure DevOps connection error: titlez%No test cases generated for item_id: z, skipping file creationzGenerated test cases for z, saving files...c              3   ^   #    U  H#  oR                  5       (       d  US ;   d  M  Uv   M%     g7f))-r   N)isalnum)r   cs     r-   r   r     s!     ']7aiikkQR\_7s   -	-test_)r&  r'  r   zSuccessfully saved files for z: txt=z, excel=zFailed to save files for zFinal results: z	 (total: z items)z%No results generated for any item IDszhNo Azure DevOps work items were successfully processed. Please check your credentials and work item IDs.zYNo Jira issues were successfully processed. Please check your credentials and issue keys.zTFailed to process the uploaded image. Please ensure the image is clear and readable.zEFailed to generate test cases. Please check your input and try again.r   TC_)r.  r   r   item_idsz&Failed to track test case generation: zError during generation: )r   r   rF  r   r   )N)YrS   rT   r	   is_jsonjsonr\   rF   r
   formr   r   keysr.  itemsfilenamehasattrr   r   seekrJ   r   r   r]   r   
startswithsplitr   verify_jwt_tokenrx   r   r   ri   remote_addrr   r   r   r   stripr   allschemenetlocrequestsstatus_coder   r   uuiduuid4	threadingr   ThreadstartRequestExceptionr+   r,   r   r   r   r   r   r   splitextsaveai.image_generatorr   removeadd
ValueErrorlowerexistsr   r   r   r   r   r   extendr   r   copyr   r   dictvaluesr   r   fetch_azure_work_itemsr;  r   )Bdatar^   rm   filecurrent_userauth_headerrD   rL   	user_infor   r   r   rF  r   r   
parsed_urlresponse	url_errorr   import_errorr   rY  r   r[  r  
image_file	unique_idimage_storagefile_extstored_filename
image_pathr   r   all_types_processederror_messagesr   type_test_casecompletion_keyrf   msgr  txt_filer  r{   formatted_test_casesidxr  r)  test_case_sectionsr  section_namesection_contentparsed_casesr   r  r   r4  issueprogressr:  azure_client
work_items	error_msg	work_itemsafe_filenamer   sB                                                                    @r-   generater     sn    /67??G||78
 <<DKK78)$t*67)t$tyy{*;)PQR==KK/$w}}/A/A/C*D)EFG$]]002	eC54==/V]^bdjVkVk#diikBRqzA{|}		! 3
 ??!XX&7/SU9VWN tY''!%.?!@ "&*;R!@nc22&4%5N nc**,-N G%PQRTWWW oo))/:;11)<<I#))#.q1 ,)::5A	y!9!9#,V#4L G%?@A3FFhh|,G%>?@#EE !) 1	M(NM5#.'5AE$((S[J\J\#dhhx&<"=bc-B-L-L-N	 #hh|4%oo11,?%11*#1=AdhhxFXFXc$((8R"89^_J" (4(8(8(>
9%*6*:*:6*B
;'%%j1 v&15o.365/0)3g&5712')e$783413o.g%366l]k6l3l!-0%366j[i6j3j!-0  88Hb1h,, (zH36  7I_g  7I  4I!-0) '2 %KK:;KK/$0124&9: H ,3J..+113CKK+C512+C51278):;<cAA`Z=cUCD%c]
J--z/@/@ABB67"G-A#BCSHH ;C5AB`'||C$  '\F  H 9(:N:N9OPQ++c1X5I5IS5P DXEYEYDZ[\)=h>R>R=SSj'kl :;eHKK EFGH 5C.I_H`;N;KLM;O;LMN1/1BCD djjl+3G9=> !GHYQx 'v.19%g.%e,336PQTPUUbcrbs4tu /   (Ao_f  COhthxhxy}h~  UY  IZ  cg   h  n  n  p 	7344 G#KK<=KK/$w}}/A/A/C*D)EFGKK-d7<<3D3D3F.G-HIJ H '--/<=)ABCSHH {3JKK/
0C0C/DHgnoy  |B  hC  hCSQ[Q`Q`QbMc  IR  MS  T  UOOA""b(67);<=sBB #<<>22?CDAc$**,FWXZYZF[E\]I GGLL)BGXVMKK5 ww''
(;(;<Q?H &yk(<Om_EJ OOJ'L>L &IIj)*62=B)/: 3"G-X#YZ\___ "
&*#!#!/I*4k)<R$ST)F&,5;*
 *) *f~.E E
-;
 "36!:4=;a	{1K 12C D H H X ";!:
 +114G	{Rh2ij"LL+>ykI_)`a27// "0Z "IIj)*62=B)/: 3 %OM%%2nQ.?-@)AA#1C0C7;RVY;Y 1s %!*ciik!9_PSPYPYP[=['6|  T`  (a  cf  (f  !f $2 #G]#;<cAA $/yk!:+JG.z>J

'!+G ,.(*3J4D4DV4L*MY$??,,-6sQwi+@L0770<+4*,9 	 +N *DJ)O& ,.()=O=U=U=W9L/+COeq+rL077E >X
 0H
/S, %1NM+::&:'.$-%9	<
 !'<+=SWYG +3//*;'+>AV+V*e*e*g'^(.C/63:7E237:7|CV=R=\=\=^;N;X;X;Z=P
/" /3hh|.D.5oo.A.A,.O.5.A.A/63A./%*J,  ,8D8H8H8N
9 5:F:J:J6:R
; 7)55jA
 +62?PQ^?_?d?d?f)*;<=B)/: 3 ##'#*!($   IIj)*62=B)/: 3"G-M#NOQTTT6 <<D((<8Kxx"-H KK>{mLMKK5hZ@A "XX&7/SU9VWN.#.."0!1!)TUVX[[[(C(($:KK.xj	#h-PQRSKK//?@A 8}r!4S]OCcdeX"5c(m_GLMmCM?'BCG"&#27)<=!
&("&((="9KKK"CG9 MNB +G[ A$"NN-LWI+VW#*G7RSZR[  \X  6Y  ,Z  $[  ]`  $`  `  % KK"B7)2eiiX]_hNiMj kl%3	8"KK+i[@PQXPY(Z[-?,1(OM,J(-h	(B09{.N  .#-$.&>2I$IJ1?J &7v%>8?y)5MN$56G$H$L$L^$\034EFW4X0Y\_`qr  aA  ]B  1B  FI  0IH$*KK2CCHYZkHlDmCnnops  uF  GT  uU  qV  pW  WZ  [c  dg  Zh  hi  1j  %k &? !'.Ei[P`ah`i,j k &1Mi[X]^e]f/g h6; 37 &4B !G+KK ?@#'88N#;LKK"9, HIKK"5d<6H5I JK#&9WabnptWuWu$|?P?P?R:S  |H  :I  %J  K&;[efrtx[y[yDATATAV<W  @L  <M  %N  O $L,?,?,A(B(B&CL>$RS'2'M$RS&CDDVCWWm  MYnqr~  sF  sF  sH  oI  _d  ne  %f  g'2}c%1%H%H'%S
)S_-A&|\BB,8,C,C	#(I#5+2G  >D  4E  ,F  HK  ,K  %K%*i%7+2Gz'  Se  >f  4g  ,h  jm  ,m  %m+2G?ST]S^=_3`+acf+f$f'.;UV]U^  _a  :b  0c  (d  fi  (i  !i .B" !+1I%3	8-?,5m,D(1'(:09{.N  .#-$.&>2I$IJ1?J &7v%>8?y)5MN$56G$H$L$L^$\034EFW4X0Y\_`qr  aA  ]B  1B  FI  0IH$*KK2CCHYZkHlDmCnnops  uF  GT  uU  qV  pW  WZ  [c  dg  Zh  hi  1j  %k &? !'.Ei[P`ah`i,j k6; 33 &4@ "NN%J7)Sk#lm7y@QRS !#']7'] ]#(!8+JG.z>J

'!+&0(GG$
 KK"?yxjX`ak`l mnLL#<WIVH:U]^h]i!jkk $n KK/$w||~*>)?yWV]^_ #6*5:!/2 + DE')"G  .X  $Y  Z  \_  _  _ F*"G  .I  $J  K  MP  P  P G+"G  .D  $E  F  HK  K  K"G-t#uvx{{{ $& #g%*3GG4D4H4HWY4Z4`4`ag4h*iY$??,,-0	37)+DL0770<+4*,9 	 +j %1NM+::!(&:'2$,	<
 '/x{D+]i|TXGYosuG +62=D)/: 3 +3//*;'+>AV+V*e*e*g'X(.C/63>7E25h-7:7|CV=R=\=\=^;N;X;X;Zdl=PSVW_S`=`rs
/" /3hh|.D.5oo.A.A,.O.5.A.A/:3A.1(m%*J,  ,8D8H8H8N
9 5:F:J:J6:R
; 7)55jA5 ); $v "   I  G=aSAB)?@A3FFG^  I!>s1vhGHHIL  	MLLB3q6(KLL	M
 '&~ ! `6ykBCNN%;I;F]#^__` ! eLL#B<.!QR2<.AB"G/N|n-]#^_addde` /. ,, R&v.9>%o6 /..+A#a&)JKLcQQ Z=c!fXFG&v.9>%o6 /..+I#a&)RSTVYYY	Zn 322 ";!: & c(+A&--m<'8C[\i[j%kvz{.3+ %(;(;(==TaTgTgTiAi!ww~~j99 "		* 5!26!:EJ 1/ B ";!:!: $3<}#]_b#bb Bj % 4&--0A)MZ]^_Z`Ya.bc'8C[\_`a\b[c%dost.3+4 32~ % ^'STWXYTZS[%\]]^ 32 32  >77>>*--IIj)&v.9>%o6 /.. 7Ax@4P #;3q6(  CQ  !R A./SV\\^2S$pM&#a&,,.8<SWZ[\W]WcWcWe<e %PMA.,#a&,,.2P$hM78#==+>P % B'A'"SQRVH%UV&3J3q6(Ry1z'{|  B   B  BB. &?%>  ) 8"LL+<YKGWX_W``bcfghcibj)kl27/8P % c'CG9BsSTvh%WX&3RSVWXSYRZ1['\]_bbbc. &?%>  ) 8"LL+<YK}UXYZU[T\)]^27/8> +*L 32F % X'McRSfX%VWWX  /0Q9DI!&, !//--lIF!--
 	 v&16o. '&&Q()3../s  ,BA %Ac9 HBA %>BA $AAd7 5BA &BA 2BA 
DAe0 	BA %CAf)3CBA 9AAi Ai !BAf; ,Ai 8&Ag: BAi 0(Ai	AAi (CBA 8B&BA DBA ",At 
Al?At /At ;AAm$> AmAm$&At (0Am$*At 
Ar0AAt 'At 5At A'At 1CAt ?B;As :	At (As;+At At !
At+At B3BA 6D/BA B&=AzC#BA C&2BA DAA{=E.BA{+G6#A{=HBA HA{=H9F*BA O$AA|?P=BA Q A|?QBA QA|?Q,BA Q/A|?RBA RBA R4A~)SBA~U#A~)U/BA U1A~)U3DBA Z
A(Z8BA [BA [ BA [5BA \BA \ABA ]A'BA _
A:_0BA ` C"B@c"BA c9
Ad4d&Ad/d)Ad4d*BA d/Ad4d4BA d7
Ae-e!Ae(e"BA e(Ae-e-BA e0
Af&e:!Af!fBA f!Af&f&BA f)
Af8f3BA f;
Ag7g'Ag2g,Ai g2Ag7g7Ai g:
Aih7Aih;Aih<Ai iAiiAi i	
AiiAi iAl<i/	Aj<i8
Ajj	Aj<j
Aj	j!Aj<j6Al<j7BA j<Al<k	*Al7k3
Alk=	Al7l
Al	l!Al7l1Al<l2BA l7Al<l<BA l?
Amm	At m
Am!	mAm$mAt m!Am$m$
Ar-m.B#Aqp
Ap$p	Aqp$
Ap2p.Aqq Ar-qAt qAt qAr-qAAr(r!At r(Ar-r-At r0
Ar?r:At s
As8s!As3s-At s3As8s8At s;
At
tAt t
AttAt tAzt*AAz
u-
Av u7	Az
v 
Av	v
C:Az
zAzzBA z
AzzBA z
A{(z?A{#{A{({BA {#A{({(BA {+
A{:{5A{={=
A|<|)A|7|0BA |7A|<|<BA |?
A~}	>A~~A~~BA ~A~~BA ~
A~&~!A~)~)
A%~3&A BA  A%%BA (
A72BA :
B@		@BA @
BA@!B@>@7BA @>BAABA A
BC=AA'BC8B7
BC
C	BC8C

BC	CBC8C2BC=C8BC=z/api/download/<path:filename>c                 h  ^   [        5       nSU SU ;   a  U R                  S5      S   OSS.[        R                  R	                  S5      [        R
                  S / SS.nUR                  U5        [        R                  R                  [        5      n[        R                  R                  US
S5      n[        R                  R!                  U5      (       d-  [        R"                  " USS9  [        R%                  SU 35        [        R                  R                  XP5      n[        R%                  SU 35        [        R                  R!                  U5      (       d  [        R                  SU 35        [        R%                  SU 35        / n[        R                  R!                  U5      (       a5  [        R&                  " U5       H  nX;   d  M
  UR)                  U5        M     U(       a=  US   n [        R                  R                  XP5      n[        R%                  SU  35        O'[        R                  SU  35        [+        SS05      S4$ [        R,                  R	                  S5      n	[        R,                  R	                  S5      n
U	(       Ga  U R/                  S5      (       a   [0        R2                  " U	5      n[        R%                  SU 35        SS KnUR7                  U5      nSnUR9                  5        HB  u  nnUR	                  SS5      nU(       d  M!  UU;   d  M)  UU   UR:                  US4'   US-  nMD     [        R%                  SU S 35        U S!3mUR=                  TS"S#9  U
(       a  [?        TSU
S$9nO
[?        TSS%9n[@        U4S& j5       nGO0U	(       Ga  U R/                  S(5      (       a   [0        R2                  " U	5      n[        R%                  S)U 35        [C        US*S+S,9 nURE                  5       nS S S 5        U S-3m[C        TS.S+S,9 nURG                  W5        URG                  S/5        URI                  5        H&  u  nnU(       d  M  URG                  U S0U S135        M(     S S S 5        U
(       a  [?        TSU
S$9nO
[?        TSS%9n[@        U4S2 j5       nOU
(       a  [?        USU
S$9nO
[?        USS%9n S4U SU ;   a  U R                  S5      S   OS[        R                  R!                  U5      (       a  [        R                  RK                  U5      OSU
S5.[        R                  R	                  S5      [        R
                  S / SS.nWR                  U5        S7UR                  S8'   S9UR                  S:'   S;UR                  S<'   U$ ! [         a,  n[        R                  S	[        U5       35         S nAGNsS nAff = f! [         aE  n[        R                  S'U 35        U
(       a  [?        USU
S$9n S nAGNK[?        USS%9n S nAGN[S nAff = f! , (       d  f       GN1= f! , (       d  f       GN= f! [         aE  n[        R                  S3U 35        U
(       a  [?        USU
S$9n S nAGN[?        USS%9n S nAGNS nAff = f! [         a,  n[        R                  S6[        U5       35         S nAGNaS nAff = f! [         a:  n[        R                  S=U 35        [+        S[        U5      05      S>4s S nA$ S nAff = f)?Nfile_download_attempted.r   )rL  	file_typer   r   r   r   r   r   r   r   r   z"Failed to track download attempt: r  	generatedTr   Created generated directory: zAttempting to download file: File not found: zSearching for file in: Found matching file: zNo matching files found for: rF   File not foundrs   rY   rL  .xlsxz(Updating Excel file with status values: r   r|   Statusr   zUpdated z rows with status valuesz
.temp.xlsxF)r.   as_attachmentdownload_name)r  c                    >  [         R                  R                  T5      (       a  [         R                  " T5        U $ ! [         a#  n[
        R                  SU 35         S nAU $ S nAff = fNzError removing temp file: r   r   rf  rb  r\   rS   rF   rr  r^   temp_file_paths     r-   remove_temp_file'download_file.<locals>.remove_temp_file  _    G77>>.99IIn5 $O % G'A!%EFF#OG   :? 
A,	A''A,z)Error updating Excel with status values: r   z&Updating TXT file with status values: rr   r   z	.temp.txtr   z

# STATUS VALUES
r   r   c                    >  [         R                  R                  T5      (       a  [         R                  " T5        U $ ! [         a#  n[
        R                  SU 35         S nAU $ S nAff = fr  r  r  s     r-   r  r    r  r  z'Error updating TXT with status values: file_download_successful)rL  r  	file_sizecustom_filenamez%Failed to track successful download: z#no-cache, no-store, must-revalidateCache-Controlno-cachePragma0ExpireszError downloading file: rZ   )&r   rP  r	   r   rJ   rR  r   r\   rS   rF   r]   r   r   r   r   r   rf  r   rT   listdirr   r
   rI   endswithrH  loadspandas
read_exceliterrowsatto_excelr   r   r   r   r   rK  getsize)rL  rL   r   r^   base_dirgenerated_dir	file_pathmatching_filesrm  status_valuesr  status_dictpddfupdated_countr.   rowr?  rr  r  r  r*  rY   r  s                          @r-   download_filer  X  s=   z/	H(NM7 (<?8O!4R!8QZ &oo11,?%11##%J %%j1
 77??8,XwD ww~~m,,KK5KK7GHGGLL9	 	3I;?@ww~~i((LL+I;78KK1-ABNww~~m,,JJ}5D'&--d3 6 )!,GGLLA	3H:>?<XJGH)9:;S@@  ((2 ",,**:6 X..w77,H"jj7F{mTU $]]9- !""$++-JE3GGGR0Eu+!51<U1CeXo.%*	 #0 h}o5MNO %.;j!9N%8 #(t[jkH(tLH $$ $$" x0088)H"jj7D[MRS )S7;qffhG < %.;i!8 .#@AGGG$GG34)4):):)<v!6GGugRxr$:; *= A #(t[jkH(tLH $$ $$" $YdRab$YdC	K8 (<?8O!4R!8QZ?Aww~~i?X?X!;^_'6	 &oo11,?%11##%J %%j1
 -R)%/"&)#M  	HLL=c!fXFGG	Hf  HHLM"($VefH($GHH <; A@.  HFqcJK"($VefH($GHH>  	KLL@QIJJ	K  //s34Q()3../s,  A-V3 1E"[- A?[- A[- 4A2W, *W, 2A7W, ) [- 
9Y" X>Y" ,>Y.Y	4Y" =[- B(Z4 .[- 3
W)=!W$[- $W))[- ,
X;6*X6 [- &
X60[- 6X;;[- >
YY" 
YY" "
Z1,*Z,[- 
Z,&[- ,Z11[- 4
[*>![%[- %[**[- -
\17/\,&\1,\1z/api/files/<url_key>c           	          [         R                  SU  35        [        5       nUR                  R	                  SU 05      nU(       d'  [         R                  SU  35        [        SS05      S4$ / nSU;   a  [        US   [        5      (       a  US   nSU;   a  [        US   [        5      (       ai  US   R                  5        HR  u  pV[        U[        5      (       d  M  S	U;   a  UR                  US	   5        S
U;   d  M>  UR                  US
   5        MT     SU;   a,  [        US   [        5      (       a  UR                  US   5        U(       d  UR                  SS5      nUR                  SS5      nU(       a  U(       a  [        R                  R!                  [        R                  R#                  [$        5      SS5      n[        R                  R'                  U5      (       ac  [        R(                  " U5       HI  n	XY;   d  M
  U	R+                  S5      (       d  U	R+                  S5      (       d  M8  UR                  U	5        MK     [         R                  S[-        U5       SU  SU 35        [        SU05      $ ! [.         aE  n
[         R                  SU  S[1        U
5       3SS9  [        S[1        U
5      05      S4s Sn
A
$ Sn
A
ff = f)z+Get list of files associated with a URL keyzRequested files for URL key: r   No document found for URL key: rF   Document not foundrs   r   r.  r'  r&  r   r|   r   r  r  r  r   zFound z files for URL key r   z Error getting files for URL key Tr  rZ   N)rS   rT   r   rv   rw   rF   r
   r   ri  rK  r   r   rg  rJ   r   r   r   r   r   rf  r  r  r   r\   r]   )r   rL   docr.  r   r   	file_infor   r  rL  r^   s              r-   get_files_for_url_keyr    sa   3/3G9=> %&&//G0DELL:7)DEG%9:;S@@ #*S-=t"D"DK(I )#
9W3Et(L(L*3G*<*B*B*D&G!)T22"i/!LL7);< I-!LL5)9: +E )#
9W3Et(L(LYw/0 ''-4Kggi,Gw77<<(A7KX77>>(++$&JJx$8".H4E4Eg4N4NRZRcRcdjRkRk!LL2 %9 	fSZL(;G9BugNO'(( /7y3q6(KVZ[Q()3../s?   A,J /A.J !J DJ *J :AJ 
K:KKKz/api/ai-content/<url_key>c                     [         R                  SU  35        [        5       nUR                  R	                  SU 05      nU(       d'  [         R                  SU  35        [        SS05      S4$ SU;   a  [        US   [        5      (       a}  US   nSU;   ar  US   n[        U[        5      (       a  [        S	U05      $ [        U[        5      (       a6  [        S	S
R                  U Vs/ s H  n[        U5      PM     sn5      05      $ SU;   Ga4  [        US   [        5      (       Ga  US   nSU;   Ga  [        US   [        5      (       a  US   R                  5        H  u  pg[        U[        5      (       d  M  SU;   d  M$   [        R                  R                  [        R                  R                  [         5      SS5      n[        R                  R                  XS   5      n	[        R                  R#                  U	5      (       a3  [%        U	SSS9 n
U
R'                  5       nSSS5        [        S	W05      s  $ M     [         R+                  SU  35        [        SS05      S4$ s  snf ! , (       d  f       NM= f! [(         a*  n[         R+                  SUS    SU 35         SnAGMP  SnAff = f! [(         aE  n[         R                  SU  S[        U5       3SS9  [        S[        U5      05      S4s SnA$ SnAff = f)z&Get AI-generated content for a URL keyz"Requested AI content for URL key: r   r  rF   r  rs   r   r   r*  r  r.  r&  r  r  r  r   r   NzCould not read file r   z!No AI content found for URL key: zNo AI content foundz%Error getting AI content for URL key Tr  rZ   )rS   rT   r   rv   rw   rF   r
   r   ri  r]   r   r   rK  r   r   r   r   rf  r   r   r\   rx   )r   rL   r  r   r*  itemr   r  r  r  r  r^   s               r-   get_ai_contentr  N  s   0/8	BC %&&//G0DELL:7)DEG%9:;S@@ #*S-=t"D"DK(I y(#L1gs++"Iw#788.."Iv{{RY;ZRY$CIRY;Z/[#\]] #*S-=t"D"DK(I)#
9W3Et(L(L*3G*<*B*B*D&G!)T22u	7I	[')ww||BGGOOH4MwXc'dH(*X?O(PI!ww~~i88%))S7%Kq./ffhG &L'.	7/C'D D  9 +E 	:7)DE!678#==- <[ &L%K  ) ["NN-A)EBRASSUVWUX+YZZ[  /<WIRAxP[_`Q()3../s   A,J9 /AJ9 ?*J9 )I,>J9 
A/J9 =J9 BJI1*J>J9 *J9 ,J9 1
I?	;J
J6J1*J9 1J66J9 9
L:L=LLz!/api/results/<url_key>/test-casesc           	          [         R                  SU  35        [        5       nUR                  R	                  SU 05      nU(       d'  [         R                  SU  35        [        SS05      S4$ SU;   a(  [        US   [        5      (       a  [        SUS   05      $ SU;   Ga  [        US   [        5      (       Ga~  US   nS	U;   Gar  [        US	   [        5      (       GaY  US	   R                  5        GHA  u  pE[        U[        5      (       d  M  S
U;   d  M%   [        R                  R                  [        R                  R                  [        5      SS5      n[        R                  R                  XeS
   5      n[        R                  R!                  U5      (       a  SSKnUR%                  U5      n	/ n
U	R'                  5        HO  u  p0 nU	R(                   H'  nX   nUR+                  U5      (       a  SX'   M#  XU'   M)     U
R-                  U5        MQ     U
(       a  [        SU
05      s  $ GMA  GMD     [         R1                  SU  35        [        SS05      S4$ ! [.         a*  n[         R1                  SUS
    SU 35         SnAGM  SnAff = f! [.         aE  n[         R                  SU  S[3        U5       3SS9  [        S[3        U5      05      S4s SnA$ SnAff = f)z!Get test cases data for a URL keyz"Requested test cases for URL key: r   r  rF   r  rs   r   r   r.  r'  r  r  r   NCould not read Excel file r   z!No test cases found for URL key: zNo test cases foundz%Error getting test cases for URL key Tr  rZ   rS   rT   r   rv   rw   rF   r
   r   r   ri  rK  r   r   r   r   r   rf  r  r  r  columnsisnar   r\   rx   r]   r   rL   r  r   r   r  r  r  r  r  recordsr.   r  recordcolumnvaluer^   s                    r-   get_test_cases_for_url_keyr    s   7/8	BC %&&//G0DELL:7)DEG%9:;S@@ #*S-=t"D"DL#k*:;<< #*S-=t"D"DK(I )#
9W3Et(L(L*3G*<*B*B*D&G!)T22w)7Kc')ww||BGGOOH4MwXc'dH(*X?Q(RI!ww~~i88 3%']]9%= +-24++-JE-/F24**03+-775>>=AFN=B6N 3= %,NN6$: 3@ $++2L'3J+K$K $+!  9 +E8 	:7)DE!678#==	  ) c"NN-G	RYHZG[[]^_]`+abbc  /<WIRAxP[_`Q()3../b   A,J /-J A1J J DI"0J 3.J "
J,J
J JJ 
K(#:K#K(#K(z/api/ai-tests/<url_key>c           	          [         R                  SU  35        [        5       nUR                  R	                  SU 05      nU(       d'  [         R                  SU  35        [        SS05      S4$ SU;   a(  [        US   [        5      (       a  [        SUS   05      $ SU;   Ga  [        US   [        5      (       Ga~  US   nS	U;   Gar  [        US	   [        5      (       GaY  US	   R                  5        GHA  u  pE[        U[        5      (       d  M  S
U;   d  M%   [        R                  R                  [        R                  R                  [        5      SS5      n[        R                  R                  XeS
   5      n[        R                  R!                  U5      (       a  SSKnUR%                  U5      n	/ n
U	R'                  5        HO  u  p0 nU	R(                   H'  nX   nUR+                  U5      (       a  SX'   M#  XU'   M)     U
R-                  U5        MQ     U
(       a  [        SU
05      s  $ GMA  GMD     [         R1                  SU  35        [        SS05      S4$ ! [.         a*  n[         R1                  SUS
    SU 35         SnAGM  SnAff = f! [.         aE  n[         R                  SU  S[3        U5       3SS9  [        S[3        U5      05      S4s SnA$ SnAff = f)zGet AI test cases for a URL keyz Requested AI tests for URL key: r   r  rF   r  rs   r   r   r.  r'  r  r  r   Nr  r   zNo AI tests found for URL key: zNo AI tests foundz#Error getting AI tests for URL key Tr  rZ   r  r  s                    r-   get_ai_tests_for_url_keyr    s   7/6wi@A %&&//G0DELL:7)DEG%9:;S@@ #*S-=t"D"DL#k*:;<< #*S-=t"D"DK(I )#
9W3Et(L(L*3G*<*B*B*D&G!)T22w)7Kc')ww||BGGOOH4MwXc'dH(*X?Q(RI!ww~~i88 3%']]9%= +-24++-JE-/F24**03+-775>>=AFN=B6N 3= %,NN6$: 3@ $++2L'3J+K$K $+!  9 +E8 	8	BC!456;;	  ) c"NN-G	RYHZG[[]^_]`+abbc  /:7)2c!fXNY]^Q()3../r  z/api/content/<path:filename>c           	          [         R                  SU  35        U S:X  d  U c(  [         R                  SU  S35        [        SS05      S4$ [        R
                  R                  [        5      n[        R
                  R                  USS	5      n[        R
                  R                  U5      (       d-  [        R                  " US
S9  [         R                  SU 35        [        R
                  R                  X 5      n[         R                  SU 35        [        R
                  R                  U5      (       d  [         R                  SU 35        / n[        R
                  R                  U5      (       a5  [        R                  " U5       H  nX;   d  M
  UR                  U5        M     U(       a=  US   n [        R
                  R                  X 5      n[         R                  SU  35        O'[         R                  SU 35        [        SS05      S4$ U R                  S5      (       Ga  SS KnSS KnSS Kn[         R                  SU  35         UR#                  U5      n	[         R                  S[%        U	5       S['        U	R(                  5       35        [*        R,                  R/                  S5      n
0 nU
(       a+   UR0                  " U
5      n[         R                  SU 35        / nU	R5                  5        GH  u  p0 nU	R(                   H*  nUU   nUR7                  U5      (       a  S UU'   M%  UUU'   M,     UR/                  SS5      nU(       a  UU;   a  UU   US'   SU;   a  [9        US   [:        5      (       a{  US   n[<        R>                  " SU5      (       aZ  [<        R@                  " S U5      nU Vs/ s H*  nURC                  5       (       d  M  URC                  5       PM,     nnU(       a  UUS'   UR                  U5        GM     [         R                  S!U  S"[%        U5       S#35        U(       a2  [%        U5      S$:X  GaM  [E        US   RG                  5       5      (       Gd+  [         RI                  S%5        UR#                  US S&9n[%        U5      S$:  a  URJ                  S    Vs/ s H  n[;        U5      RC                  5       PM     nn/ n[M        S$[%        U5      5       Hy  n0 n[O        U5       HT  u  nnU[%        UR(                  5      :  d  M!  URJ                  UU4   nUR7                  U5      (       a  S UU'   MO  UUU'   MV     UR                  U5        M{     U(       a&  [         R                  S'[%        U5       S(U 35        Un[        S)U05      $  [Q        US/S0S19 nURS                  5       nS S S 5        [         R                  S2U  S3[%        W5       S435        [        S)U05      $ ! [2         a#  n[         R                  SU 35         S nAGN?S nAff = fs  snf s  snf ! [2         aH  n[         R                  S*U  S+[;        U5       3S
S,9  [        SS-[;        U5       305      S.4s S nA$ S nAff = f! , (       d  f       N= f! [2         aI  n[         R                  S5U  S+[;        U5       35        [        SS6[;        U5       305      S.4s S nA$ S nAff = f! [2         aE  n[         R                  S7U  S+[;        U5       3S
S,9  [        S[;        U5      05      S4s S nA$ S nAff = f)8NzRequested content for file: 	undefinedzInvalid filename: ''rF   zInvalid filename providedrt   r  r  Tr   r  zLooking for file at: z+File not found at exact path, searching in r   r  r  r  rs   r  zReading Excel file: z"Excel file read successfully with z rows and columns: rY   z#Applying status values to content: zError parsing status values: r   r|   r  r   z^\d+\.z\n\s*\d+\.|\nzConverted Excel file z to  recordsr   z@No valid records found in Excel file, checking for column issues)headerzManually extracted z records with headers: r*  zError processing Excel file r   r  zError processing Excel file: rZ   r  r   r   zSuccessfully read text file:  (z characters)zError reading text file zError reading text file: zError in get_file_content for )*rS   rT   rF   r
   r   r   r   r   r   rf  r   r  r   r  r  numpyrH  r  r   r   r  r	   rI   rJ   r  r\   r  r  r   r]   researchrP  rS  anyrj  rx   ilocranger   r   r   ) rL  r  r  r  r  rm  r  nprH  r  r  r  r^   r  r.   r  r  r  r  r?  
steps_textr  sraw_datahr   manual_recordsr  jr  r  r*  s                                    r-   get_file_contentr    sW   K/28*=> {"h&6LL.xj:;G%@ABCGG 77??8,XwD ww~~m,,KK5KK7GH GGLL9	+I;78ww~~i((KKEm_UV  Nww~~m,,JJ}5D'&--d3 6 )!,GGLLA	3H:>?/	{;<)9:;S@@W%%KK.xj9:OY]]9-@R	I\]abdblbl]m\nop !( 0 0 :  J&*jj&?&I+$WX
 "$++-JEF"$** #F775>>-1F6N-2F6N #- #JJw3E+!5+6u+=x( &(Zw-M-M%+G_
99Y
;;$&HH-=z$JE8=$K1YQWWYE$K$27wNN6*5 #08 3H:T#g,xXY 3w<1#4SARARAT=U=UNN%eg  "}}Yt}DH8}q(;C==;K"L;Ka3q6<<>;K"L *,!&q#h-!8A%'F-6w-?	6#$s8+;+;'<#<,4MM!Q$,?E')wwu~~9=v9>v .@ +11&9 "9 *"KK*=c.>Q=RRijqir(st&4Gw   U)S7;qffhG <;H:RG~Uabc	7344S % J'DQC%HIIJ6 %L  #M,  Y;H:RAxP[_`+HQ)QRSUXXXY
 <;  U7zCF8LM+DSVH)MNOQTTTU  /5hZr#a&JUYZQ()3../s   A[= E
[= A?[= ;[= A0Y *X 0CY X7"X76CY =#X< AY *BY 1Z' <Z9Z' 
X4X/)Y /X44Y 
Z=ZZ	[= Z[= 
Z$ Z' '
[:1>[5/[:0[= 5[::[= =
]:]]]z/api/update-statusc                      [         R                  n [        R                  SU  35        U R	                  S5      nU R	                  S5      nU R	                  S5      nU R	                  SS5      nU(       d  [        SS05      S	4$ U(       d  [        SS
05      S	4$ U(       d  [        SS05      S	4$ UR                  5       S:X  a  [        SS05      S	4$ [        5       nUR                  R                  SU05      nU(       d)  SU 3n[        R                  U5        [        SU05      S4$ UR                  XU5      nU(       Ga	  UR                  R                  SU0SSU 3USU 3[        R                  " 5       S[        R                  " 5       005      n	U(       a  SU;   a  [        US   [         5      (       al  [#        US   5       HZ  u  pUR	                  S5      U:X  d  M  UR                  R                  SU0SSU
 S3U005        [        R                  SU
 35          O   [        R                  SU S35        [        SS05      $ SU SU 3n[        R                  U5        [        SU05      S4$ ! [$         aC  n[        R                  S ['        U5       35        [        S['        U5      05      S!4s S nA$ S nAff = f)"Nz Received status update request: rm   r)  rY   shared_viewFrF   zMissing required parameter: keyrt   z(Missing required parameter: test_case_idz"Missing required parameter: statusr|   zStatus cannot be emptyr   z No document found with url_key: rs   $setzstatus.zstatus_timestamps.status_updated_atr   r   
test_data..Statusz(Updated status in test_data array index z+Successfully updated status for test case 'r  rG   Tz&Failed to update status for test case z in document zError updating status: rZ   )r	   rH  rS   rT   rJ   r
   rS  r   rv   rw   rF   update_test_case_status
update_oner   r   r   r   r   r\   r]   )rl  r   r)  rY   is_shared_viewrL   r  r  rG   resultr  tcr^   s                r-   update_statusr    s   D/||6tf=>((5/xx/(#-7 G%FGH#MMG%OPQSVVVG%IJKSPP <<>RG%=>?DD$ &&//G0DE:7)DILL#GY/0#55  77vV #--88G$!,0&,\N;X__=N+X__->	F +"4CDTVZ9[9[&s;'78EAvvg,6%00;;&0#
1#W&=v%FG &Nqc$RS 9 KKEl^STUVIt,--@m\c[deILL#GY/0#55 /.s1vh78Q()3../sK   BI: I: I: 1"I: AI: +B7I: &A'I: +I: :
K8K<KKz
/api/sharec                      S n [         R                  R                  S5      nU(       ah  UR                  S5      (       aR   UR	                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S5      (       a  US   n [         R                  (       a  [         R                  nO[         R                  R                  5       nUR                  5        HM  u  px[!        U[        5      (       d  M  UR                  S5      (       d  M4   [        R"                  " U5      Xg'   MO     [        R%                  S	U 35        UR                  S
5      n	UR                  S5      n
UR                  S/ 5      nUR                  S0 5      nUR                  S5      nU	(       d  ['        SS05      S4$ [        5       nU(       d$  [        R)                  S5        ['        SS05      S4$ U(       aC  [+        U5      S:  a4  UR-                  U	[+        U5      S:X  a  US   OUX(       a  U S   OS 5      nOUR-                  XX(       a  U S   OS 5      nU(       a-   UR/                  X5        [        R%                  SU SU 35        SSKJn  [         R                  R                  S5      (       a$  S[         R                  R                  S5       3nGOK[         R                  R                  S5      (       ai  [         R                  R                  S5      (       aE  [         R                  R                  SS5      nU S [         R                  R                  S5       3nO[         R                  R                  S5      (       a  [         R                  R                  S5      R                  S!5      (       dV  [         R                  R                  S5      R                  S"5      (       d#  S[         R                  R                  S5       3nOUR5                  S#5      nU S$U 3n[        R%                  S%5        [        R%                  S&[         R                  R                  S5       35        [        R%                  S'[         R                  R                  S5       35        [        R%                  S([         R                  R                  S5       35        [        R%                  S)U 35        [        R%                  S*U 35        [        R%                  S+U 35        [        R%                  S,[         R6                   35        [        R%                  S-[         R8                   35         S.UU[!        U	[:        5      (       a  [+        U	5      OS[=        U5      U(       a  [+        U5      OSS/.[         R                  R                  S05      [         R>                  S / SS1.nURA                  U5        ['        S3UUS4.5      $ ! [         a,  n[        R                  S[        U5       35         S nAGNS nAff = f!    GMe  = f! [         a#  n[        R)                  SU 35         S nAGNS nAff = f! [         a+  n[        R)                  S2[        U5       35         S nANS nAff = f! [         aC  n[        R)                  S5[        U5       35        ['        S[        U5      05      S4s S nA$ S nAff = f)6Nr   r   r   r   rG   r   r   {zShare request data: r   r   rF  r  r   rF   zNo test data providedrt   zMongoDB handler not initializedzDatabase connection errorrZ   r   r   zSaved status values for r   zError saving status values: )BASE_URLzX-Forwarded-Hosthttps://zX-Forwarded-ProtoHosthttpsz://r   	localhostr&   z/view/zURL generation details:z  - X-Forwarded-Host: z  - X-Forwarded-Proto: z
  - Host: z  - BASE_URL from settings: z  - Selected base_url: z  - Generated share URL: z  - Request URL: z  - Request base URL: share_created_successfully)r   	share_urltest_data_counthas_status_valuesstatus_values_countr   r  z+Failed to track successful share creation: T)rG   r  r   zError in share_test_case: )!r	   r   rJ   rO  rP  r   rQ  r\   rS   rx   r]   rG  rH  rI  to_dictrK  r   r  rT   r
   rF   r   r   update_status_dictconfig.settingsr  rstripr   base_urlr   r   rR  r   )rn  ro  rD   auth_mongo_handlerrp  r^   rl  rm   r  r   r   rF  r  r   rL   r   r  r  protocolr  r   s                        r-   share_test_caser    s   y/oo))/:;11)<<I#))#.q1%1^".??F	y!9!9#,V#4L ??<<D <<'')D"jjl
eS))e.>.>s.C.C$(JJu$5	 + 	*4&12HH[)	((9%88J+"5hh}-G%<=>CC %LL:;G%@ABCGG H)#229SQY]^_M_hqkemoz  S_  }I  JN  }O  ei  jG#229{jvT`aeTf  }A  BG A00H6wir-QR 	- ??122!'//"5"56H"I!JKH__  !455'//:M:Mf:U:U**+>HH"3w':':6'B&CDH__  ((1D1DV1L1W1WXc1d1dmtm|m|  nA  nA  BH  nI  nT  nT  U`  na  na!'//"5"5f"=!>?H  s+Hjwi0	 	-/,W__-@-@AS-T,UVW-goo.A.ABU.V-WXYj!4!4V!< =>?28*=>-hZ89/	{;<'}56,W-=-=,>?@	Q:&!*9CIt9T9Ts9~Z[)-m)<AN3}+=TU &oo11,?%11##%J %%j1 "
  	O  I!>s1vhGHHI>  A;A3?@@Aj  	QLLFs1vhOPP	Q  /1#a&:;Q()3../s   >Z6 AX A,Z6 Z6 Y3BZ6 <4Z6 1A/Z6 !,Y K(Z6 6BY> =Z6 
Y!X=7Z6 =YZ6 YZ6 
Y;Y60Z6 6Y;;Z6 >
Z3!Z.)Z6 .Z33Z6 6
\ 8[>8\>\z/view/<url_key>c           	      
     [        5       nSU [        R                  R                  SS5      S.[        R                  R                  S5      [        R
                  S / SS.nUR                  U5        [        R                  R                  SS	5      R                  5       nUS
:H  nWR                  U 5      nU(       d#  U(       a  [        SS05      S4$ [        S5      S4$ XS'   SU;   Ga  [        US   [         5      (       a*  [        R#                  SU  S[%        US   5       S35        GO[        US   [&        5      (       a;  SUS   ;   a2  US   S   US'   [        R#                  S[%        US   5       S35        GOI[        US   [&        5      (       Ga0  SUS   ;   Ga&   US   R                  S0 5      nUR                  S5      nU(       a  [(        R*                  R-                  [(        R*                  R/                  [0        5      SSU5      n	[(        R*                  R3                  U	5      (       aL  SS Kn
U
R7                  U	5      nUR9                  S5      nXS'   [        R#                  S[%        U5       S35        [        US   [         5      (       Gd,  SU;   Ga%  UR                  S5      nU(       Ga  [(        R*                  R-                  [(        R*                  R/                  [0        5      SSU5      n[(        R*                  R3                  U5      (       a  [;        USSS 9 nUR=                  5       nS S S 5        SS!KJ nJ!n  U" W5      n/ nU(       a3  URE                  5        H  u  nnU" UUS"9nURG                  U5        M      OU" U5      nU(       a&  XS'   [        R#                  S#[%        U5       S35        S%U;   a  [        US%   [&        5      (       ao  [        US   [         5      (       aW  US%   nUR                  S&0 5      nUS    H7  nS'U;   d  M  US'   U;   d  M  UUS'      US('   US'   U;   d  M,  UUS'      US)'   M9     U(       a"  S*U;   a  [        US*   5      US*'   [        U5      $ [        S+US,9$ ! [         a,  n[        R                  S[        U5       35         S nAGNHS nAff = f! , (       d  f       GN= f! [         a,  n[        R                  S$[        U5       35         S nAGN<S nAff = f! [         aZ  n[        R                  S-[        U5       3S.S/9  WS
:X  a  [        S[        U5      05      S04s S nA$ [        S5      S4s S nA$ S nAff = f)1Nshared_page_visitedr%   html)r   r%   r   r   r  z!Failed to track view page visit: r|   rH  rF   Test case not foundrs   z404.htmlrm   r   zTest data for z is already a list with  itemsr   z Extracted test_cases array with r.  r'  r  r  r  zParsed Excel file into r  r&  r  r   r   )r   r   r+  zParsed text file into z!Error processing files for view: rY   ro   r   r  StatusUpdatedAtrn   z	view.html)r  z Error in view_shared_test_case: Tr  rZ   )$r   r	   rI   rJ   r   rR  r   r\   rS   rF   r]   re  get_test_caser
   r   r   r   rT   r   ri  r   r   r   r   r   rf  r  r  r	  r   r   utils.file_handlerr   r   rK  rg  )r   rL   r   r^   format_param	want_jsonr  r.  r  
excel_pathr  r  structured_datar  txt_pathr  txt_contentr   r   sectionsr  r  r  r  ro   r  s                             r-   view_shared_test_caser   R  s   q4	G(NM3&%ll..x@ &oo11,?%11##%J %%j1
 ||''"5;;= F*	!//8	)>?@#EE&z2C77 #% )#)K0$77nWI5McR[\gRhNiMjjpqr i4d;;PYZePf@f-6{-CL-QIk*KK"B3yQ\G]C^B__e fg	+ 6=='YWbMcBc(S )+ 6 : :7B G%*YYw%7
%)+bggooh6OQXZegq)rJ!ww~~j99 3%']]:%>24**Y2G9H+ 6 &.Ec/FZE[[c,d e  *)K*@$GGEUZN',yy'7H'+-77<<8QSZ\giq+r#%77>>(#;#;)-hg)NRS67ffh *O %x/I+/VH68O'/MU^^M],IL/;STc  vB  <CL,;,B,B<,P N^ ;SS^:_'6AP+(>(.6LSQ`MaLbbj4k(l
 y Z	(0CT%J%JzZcdoZprvOwOw#H-K ).A2 F,b=R[K%?#.r'{#;BxL'{&770A"W+0N,- - 	!#&y'7#8	% 9%%";)DDu  	GLL<SVHEFF	Gd *O)N$ % S'HQ%QRRS.  47Ax@4P6!GSV,-s22":.334s   A1R 4A T T "CT &FS 1SB	S AT (T 3T 	7T 	T 
S!R<6T <ST 
SS 
T !TT TT 
U3=U.U3U.(U3.U3z/api/shared/excel/<url_key>c                 P    [         R                  U 5      nU(       d  [        SS05      S4$ [        R                  R                  S5      n[        R                  R                  S5      n0 nU(       a8   WR                  " U5      n[        R                  S[        U5       SU 35        O[        R                  S	5        U(       d)  UR                  S
5      (       a
  SUS
    S3nO	SU S S  S3nUR                  S
5      (       a	  SUS
    3nOSU S S  3nUS   nSS KnSn	[        5       n
SnU GH@  nU	S-  n	SU;   a  UR                  SS5      nU	SU S3-  n	SU;   a  U	SUR                  SS5       S3-  n	SU;   aX  UR                  SS5      nU	S-  n	[        U[        5      (       a#  [!        U5       H  u  nnXS-    SU S3-  n	M     O	U	SU S3-  n	SU;   a  U	SUR                  SS5       S3-  n	UR                  SS5      nSnU(       a   X;   a  XM   nU
R#                  U5        US-  nOUR                  SS5      nU	S U S!3-  n	S"U;   a  U	S#UR                  S"S5       S3-  n	U	S!-  n	GMC     [        R                  S$U S%35        U	S&-  n	UR%                  5        H  u  nnU(       d  M  X S'U S3-  n	M     U	nSS(KJn  U" UU5      nU(       d  [        SS)05      S*4$ [*        R,                  R/                  [*        R,                  R1                  [2        5      S+S,U5      n[5        US-US.9nS/UR6                  S0'   S1UR6                  S2'   S3UR6                  S4'   [9        U5      UR6                  S5'   [9        [:        R<                  " 5       5      UR6                  S6'   U$ ! [         a#  n[        R                  SU 35         S nAGNS nAff = f! [         aC  n[        R                  S7[9        U5       35        [        S[9        U5      05      S*4s S nA$ S nAff = f)8NrF   r  rs   rL  rY   zSHARED EXCEL: Received z status values: z+SHARED EXCEL: Error parsing status values: z'SHARED EXCEL: No status values providedr   rD  r  test_shared_r  r   r   r|   zTEST CASE:
r   zTitle: r   r   z
Scenario: r   zSteps to reproduce:
r   z. z1. r   zExpected Result: r  zStatus: r  Priorityz
Priority: zSHARED EXCEL: Updated z test cases with status valuesz

# STATUS SUMMARY
r   )r   zFailed to generate Excel filerZ   r  r  Tr  .no-cache, no-store, must-revalidate, max-age=0r  r  r  r  r  zX-Status-Updated-CountzX-Status-Update-TimezError generating Excel file: )rL   r  r
   r	   rI   rJ   r  rS   rT   r   r\   rF   rH  r   r   r   r   rc  rK  r  r   r   r   r   r   r   r   r   r]   r   r+   )r   r  r  r  r  rH  r^   r  r   formatted_datastatus_updatedr  r  r?  r  r  steprY   test_data_strr   r  r  rr  s                          r-   download_shared_excelr)    so   t/!//8	G%:;<cAA ",,**:6  ((2P"jj75c+6F5GGWXcWdef KKAB }}Y''$))I*>)?u"E$0!U"C ==##$Yy%9$:;N+GBQK=9N k*	 	 Bn,N"}w+GE7""55RJrvvj"/E.Fb"II "}w+"99eT**#,U#34&qSED6*<< $4 #E7"o5N B&$5bff=NPR6S5TTV"WW FF7B'EF-$+""5)""- 55NRJrvvj"/E.Fb"IIf$NM P 	,]O;YZ[ 	22(..0ME6vG2fXR"88 1 ' 	9&}nE
G%DEFKK GGLL!:G[R\]	Yd/Z -])%/"&)#585G1236x||~3F/0C  PJ1#NOOPD  /4SVH=>Q()3../s[   *O AO 56N( +HO 34O (B?O (
O2O
O OO 
P%"8P P% P%z/api/generation-statusc                  4    [         S      Sn [         S   (       a(  [        [         S   5      [        [         S   5      -  S-  n [        R                  " U 5      (       d  U S:  a  Sn OU S:  a  Sn [         S   [	        [         S   5      [	        [         S   5      U [         S   (       + [         R                  SS5      [         R                  S	S5      [	        [         R                  S
/ 5      5      [         R                  SS5      S.	n[        R                  SUS    35        S S S 5        [        W5      $ ! , (       d  f       N= f! [         aF  n[        R                  S[        U5       35        [        [        U5      SSSS.5      S4s S nA$ S nAff = f)Nr   r   r   r~   r   r}   r   r|   r   r   r   )	r}   r~   r   r   files_readyr   r   r   r   z,Generation status response - final_url_key: z!Error getting generation status: FT)rF   r   r}   r+  rZ   )r   r   mathisnanr   rJ   rS   rT   r
   r\   rF   r]   )r   rr  r^   s      r-   get_generation_statusr.  @  s}   vv&"# /'*+<=N+O'PSVWhivWwSx'x|&# zz-..2E2I&'#$s*&)# "3?!C#'(9:K(L#M#$5m$DE':#4_#EE*..w;%6%:%:;NPR%S-11%<=!2!6!6!K
H KKFxP_G`Fabc/ '0 x  1 '&2  v8QABQTYjnopruuuvs5   	E DD6#E 6
E E 
F;FFFz/api/shared-statusGETc            	      8    [         R                  R                  S5      n [         R                  R                  SS5      R                  5       S:H  nU (       d  [	        SS05      S4$ [
        R                  SU  35        [        5       nUR                  U S	S
9nUc  [	        SS05      S4$ S	U[        [        R                  " 5       5      S.nU(       Gab  UR                  R                  SU 05      nU(       Ga=  XTS'   SU;   Ga2  SUS   ;   Ga  US   S   US'   US   S   nU(       a  [        UR                  5       5      n[
        R                  SU 35        XuS'   SU;   a  US	 SUS   ;   a'  US   S   US'   [
        R                  SUS    35        OSUS'   [
        R                  S5        XTS'    SSKJn  / n	UR%                  5        H  u  p[
        R                  SU
 35        SU;   a  ['        US   [        5      (       a  US   n[
        R                  SU
 S[)        U5       S35        U" U5      nU(       aV  U H  nS U;   d  M  US     S!U
 S3US '   M     U	R+                  U5        [
        R                  S"[)        U5       S#U
 35        M  [
        R-                  S$U
 35        M  [
        R-                  S%U
 35        M     U	(       a1  XS'   [
        R                  S&[)        U	5       S'35        [	        U5      $ [
        R-                  S(5        GOSU;   a  ['        US   [        5      (       a  [
        R                  S+UR                  SS,5       S-35        US   US'   UR                  S5      S.:X  a+  S.U;   a%  US.   /US'   [
        R                  S/US.    35        O0UR                  S5      S0:X  a  S1/US'   [
        R                  S25        XTS'   [
        R                  S3[)        US   5       S435        [	        U5      $ SU;   Ga  ['        US   [4        5      (       Ga  [
        R                  S5UR                  SS,5       S-35        US   nUR                  S5      S6;   a  SU;   a  US   S.:X  a  [
        R                  S75        SU;   a  ['        US   [        5      (       ao  US   US'   US   US'   UR                  S.S85      US.'   UR                  S.S85      /US'   XTS'   [
        R                  S3[)        US   5       S935        [	        U5      $ OUR                  S5      S:;   a  SU;   a  US   S0:X  a  [
        R                  S;5        SU;   aw  ['        US   [        5      (       a_  US   US'   US   US'   UR                  S<S85      US<'   S1/US'   XTS'   [
        R                  S3[)        US   5       S=35        [	        U5      $ SUS   ;   Ga2  ['        US   S   [        5      (       Ga  US   S   n[
        R                  S>[)        U5       S?35        / nU H  n['        U[4        5      (       d  M  S@U;   d  M"  UR                  S@S85      nU(       d  M=  ['        U[        5      (       d  MT  SSKJn  U" U5      nU(       a  UR+                  U5        M|  UR                  SASB5      SCSDSEUR                  SFSG5      SH.nUR7                  U5        M     U(       a'  UUS'   [
        R                  SI[)        U5       SJ35        O ['        US   [        5      (       a  US   US'   [	        U5      nSKUR8                  SL'   SMUR8                  SN'   SOUR8                  SP'   U$ ! [.         aM  n[
        R-                  S)U 35        SS Kn[
        R-                  S*UR3                  5        35         S nAGNS nAff = f! [.         aC  n[
        R;                  SQ[        U5       35        [	        S[        U5      05      SR4s S nA$ S nAff = f)SNrm   includeFilesfalsetruerF   Missing URL key parameterrt   z$Fetching shared status for URL key: T)force_refreshr  rs   )rG   r  r*   r   rz   r   r.  zExtracted item IDs from files: rF  r   r   zAdded source_type to document: JirazUsing default source_type: Jirar   )r   zProcessing file: r   zFound test cases content for z
 (length: r2  r   r  zSuccessfully parsed z test cases from zNo test cases parsed from zNo test_cases string found in zSuccessfully combined z  total test cases from all filesz No test cases found in any filesz%Error parsing test cases from files: Traceback: z Found direct test_data list for r   z source typer   zSet URL as item_id: r   zUploaded Imagez!Set Image item_id: Uploaded ImagezSuccessfully loaded z! test cases from direct test_dataz Found nested test_data dict for )Nr|   r   z$Found URL data with nested structurer|   z% URL test cases from nested structure)Nr|   r   z&Found Image data with nested structurer-  z' Image test cases from nested structurezFound test_cases list with r  r*  r)  r   zScenario extracted from contentzSteps extracted from contentz&Expected result extracted from contentrY   z
Not Tested)r   r   r   r   r  zSuccessfully converted z% test cases from test_cases structurer$  r  r  r  r  r  z Error retrieving shared status: rZ   )r	   rI   rJ   re  r
   rS   rT   r   get_test_case_status_valuesr]   r   r+   rv   rw   r   rJ  r  r   rK  r   r   rg  rx   r\   r   r   ri  r   r   rF   )r   include_filesrL   r  response_datar  
files_datarF  r   all_test_casesfile_key	file_datatest_cases_contentparsed_test_casesr  r^   r   nested_test_datatest_cases_listconverted_test_casesr*  parsedr  rr  s                           r-   get_shared_statusrE  `  sO   U/,,""5)((AGGIVSG%@ABCGG:7)DE$ &AA'Y]A^ G%:;<cAA *X\\^,
 **33Y4HIC,/j)#%#k"2214[1A'1Jg. &)%5g%>
%'+JOO,='>H"KK*I((TU /7
O(C/$'	N  -K0@@585Em5TM 2 &.McR_N`Ma,b c 6<M 2 &.M O 9<*5%SS-/N 8B7G7G7I 3 &.?z,J K#/9#<IVbLcehAiAi9B<9P$6$*KK2OPXzYcdghzd{c||}0~$8PQc8d$5'82CB/6"}ACGRPXzYZ>[7 3D )7(=(=>O(P(.6J3O`KaJbbst|s}4~((.9ST\S]7^(_$*NN5ST\S]3^$_' 8J*  .=Kk : &.DSEXDYYy,z {'.}'= = &/Q R %+
3{;KT0R0R&Fsww}^gGhFiiu$vw585Ek2 77=1U:u|/25zlC
O"KK*>s5zl(KL WW]3w>/?.@C
O"KK*KM47j1&:3s;?O;P:QQr$st&}55 %+
3{;KT0R0R&Fsww}^gGhFiiu$vw+.{+;( !WW]37HH -1A A 0 ?5 H"KK*NP  +.>>:N^_jNkmqCrCr=Mk=Zk : 6Fm5TM 2-=-A-A%-LE
3C3G3Gr3R2SJ<?j 9 &.B3GWXcGdCeBf  gL  -M  !N'.}'= = !WW]37JJ -1A A 0 ?7 J"KK*PR  +.>>:N^_jNkmqCrCr=Mk=Zk : 6Fm5TM 22B2F2FzSU2VJ3C2DJ<?j 9 &.B3GWXcGdCeBf  gN  -O  !P'.}'= = $s;'77Js;GWXdGegk<l<l*-k*:<*H&A#oBVAWW]$^_ 02,"1B)"d33	R*,&&B*?#*7z'3/G/G$[-Eg-NF'-(<(C(CF(K 68VVNI5V8Y5S?g68ffX|6T5*	 )=(C(CI(N' #2* 09MM+6"KK*A#FZB[A\  ]B  )C  D#C$4d;;585Ek2=) -])%/"&)#g  ) S"NN-RSTRU+VW,"NN[9M9M9O8P+QRRSh  /7Ax@AQ()3../s   A%_ (A_ ,D
_ 7B]2 B6]2 ]2 C4_ D_ %B6_ A*_ 
_ _ -_ C-_ 2
_	<A_>_ _		_ 
`8```z/api/analytics/trackc                       [         R                  n U (       d  [        SS05      S4$ U R                  S5      U R                  S0 5      U R                  S5      [         R                  R                  S5      [         R
                  U R                  S5      U R                  S	/ 5      U R                  S
S5      S.n[         R                  R                  S5      nU(       a  UR                  S5      (       az   UR                  S5      S   n[        5       nUR                  U5      nU(       aC  UR                  S5      (       a-  US   nUR                  S5      US'   UR                  S5      US'   [        5       nUR                  U5      nU(       a  [        SSS.5      $ [        SS05      S4$ ! [         a     NKf = f! [         aC  n	[        R                  S[        U	5       35        [        S[        U	5      05      S4s Sn	A	$ Sn	A	ff = f)z"Track user events and interactionsrF   No data providedrt   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   r   r   r   TzEvent tracked successfullyrG   rR   zFailed to track eventrZ   zError tracking analytics: N)r	   rH  r
   rJ   r   rR  rO  rP  r   rQ  r\   r   rS   rF   r]   )
rl  r   ro  rD   mhverification
event_userrL   rG   r^   s
             r-   track_analyticsrL  :	  s   )/||G%7893>> ((<0((<4((<0!//--l;!--88M2#xx(92>((<3	

 oo))/:;11)<<	#))#.q1!^!2259L$4$4Y$?$?!-f!5J,6NN4,@Jy).8nnV.DJ{+ %++J7t8TUVVG%<=>CC    /1#a&:;Q()3../sN   %G  CG  8A9F0 1/G  !G  0
F=:G  <F==G   
H
8HHHz/api/analytics/sessionc            	          [         R                  n U (       d  [        SS05      S4$ U R                  S5      [         R                  R                  S5      [         R
                  [         R                  R                  S5      U R                  S5      U R                  S5      U R                  S	5      S
.n[         R                  R                  S5      nU(       a  UR                  S5      (       az   UR                  S5      S   n[        5       nUR                  U5      nU(       aC  UR                  S5      (       a-  US   nUR                  S5      US'   UR                  S5      US'   [        5       nUR                  U5      nU(       a  [        SSS.5      $ [        SS05      S4$ ! [         a     NKf = f! [         aC  n	[        R                  S[        U	5       35        [        S[        U	5      05      S4s Sn	A	$ Sn	A	ff = f)z"Track user session and page visitsrF   rG  rt   r   r   Refererpage_visitedcountrycity)r   r   r   referrerrO  rP  rQ  r   r   r   r   rG   r   r   r   r   r   TzSession tracked successfullyrH  zFailed to track sessionrZ   zError tracking session: N)r	   rH  r
   rJ   r   rR  rO  rP  r   rQ  r\   track_user_sessionrS   rF   r]   )
rl  session_dataro  rD   rI  rJ  r   rL   rG   r^   s
             r-   track_sessionrU  h	  s   (/||G%7893>> ((<0!//--l;!--++I6 HH^4xx	*HHV$
 oo))/:;11)<<	#))#.q1!^!2259L$4$4Y$?$?'/D.2hhtnL+040@L- %22<@t8VWXXG%>?@#EE    //Ax89Q()3../sN   %F; C
F; 3A9F+ ,/F; F; +
F85F; 7F88F; ;
H8H=HHz/api/analytics/summaryc            	          [         R                  R                  S5      n [        5       nSnU (       a^  U R	                  S5      (       aH   U R                  S5      S   nUR                  U5      nU(       a  UR                  S5      (       a  US   nU(       d  [        SS	S
.5      S4$ [         R                  R                  S5      n[         R                  R                  S5      n[         R                  R                  S5      n[         R                  R                  SS[        S9nUn	UR                  S5      S:X  a  U	R                  UUUUS9n
O"U	R                  UUUUUR                  S5      S9n
U
(       a  [        SU
S.5      $ [        SS05      S4$ ! [         a     GNf = f! [         aC  n[        R                  S[        U5       35        [        S[        U5      05      S4s SnA$ SnAff = f)zMGet analytics summary with RBAC: admin gets system-wide, users get their own.r   Nr   r   r   rG   r   FAuthentication requiredrH  r=  
start_dateend_dater   r"   r    )r   r   admin)rX  rY  r"   r   r   )rX  rY  r"   r   r   TrG   rl  rF   zFailed to get analytics summaryrZ   z!Error getting analytics summary: )r	   r   rJ   r   rO  rP  rQ  r\   r
   rI   intget_analytics_summaryrS   rF   r]   )ro  rI  rn  rD   rp  rX  rY  r   r"   rL   r7  r^   s               r-   r]  r]  	  s   6/oo))/:^;11)<<#))#.q1//6	y!9!9#,V#4L u9RSTVYYY \\%%l3
<<##J/ ll&&}5 ||5F#w.#99%!'	 : G $99%!'$((. : G tW=>>G%FGH#MMO  R  /8QABQ()3../sP   AF* AF F* )C F* 
F* 
F'#F* &F''F* *
G748G2,G72G7z/api/analytics/detailedc                  <    [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ [        5       nU R                  S5      S   nUR                  U5      nU(       a.  UR                  S	5      (       a  US
   R                  S5      S:w  a  [	        SSS.5      S4$ 0 n[         R                  R                  S5      nU(       aU   [        U5      S:X  a  [        R                  " US5      US'   O*[        R                  " UR                  SS5      5      US'    [         R                  R                  S5      nU(       aj   [        U5      S:X  a0  [        R                  " US5      [        SS9-   [        SS9-
  nXtS'   O*[        R                  " UR                  SS5      5      US'    [         R                  R                  S5      nU(       a  XS'   [         R                  R                  S5      n	U	(       a  XS'   [        5       n
U
R!                  U5      nUb  [	        SUS.5      $ [	        SS05      S4$ ! [         a!    [        R                  " USS S5      US'    GNIf = f! [         a5    [        R                  " USS S5      [        SS9-   [        SS9-
  nXtS'    Nf = f! [         aC  n["        R%                  S['        U5       35        [	        S['        U5      05      S4s SnA$ SnAff = f) z0Get detailed analytics with filters. Admin only.r   r   FrW  rH  r=  r   r   rG   r   r   rZ  	Forbidden  rX  r   %Y-%m-%dZ+00:00NrY  r!   )millisecondsr   r   Tr[  rF   z Failed to get detailed analyticsrZ   z"Error getting detailed analytics: )r	   r   rJ   rO  r
   r   rP  rQ  rI   r   r   strptimefromisoformatreplacer\   r   get_detailed_analyticsrS   rF   r]   )ro  rI  rD   rJ  filtersrX  rY  end_dtr   r   rL   eventsr^   s                r-   rh  rh  	  s   9/oo))/: 6 6y A Au9RSTVYYY^!!#&q)**51<#3#3I#>#>,vBVBZBZ[aBbfmBmuEFKK \\%%l3
Wz?b(,4,=,=j*,UGL),4,B,B:CUCUVY[cCd,eGL) <<##J/	-x=B&%..xDyVWGXX[drs[ttF*0J'*2*@*@AQAQRUW_A`*aGJ' \\%%l3
$.L!ll&&}5%0M"$55g>tV<==G%GHI3NN?  W(0(9(9*Sb/:(V%W  -!**8CR=*E	WXHYY\est\uu&,
#-*  /9#a&BCQ()3../s   AK A3K (K +)I K )I >'K &>J $K %)J B K K 'J	K J		K <KK 
KK 
L8LLLz/api/test-cases/recentc                      [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ [        5       nU R                  S5      S   nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  USS9nU(       aL  U H8  nSU;   a  [        US   5      US'   SU;   d  M"  US   R                  5       US'   M:     [	        SUS.5      $ [	        S/ S.5      $ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)z0Get recent test cases for the authenticated userr   r   FrW  rH  r=  r   r   rG   zInvalid tokenr   r   r   )limitrn   r   T)rG   r   z!Error getting recent test cases: zFailed to retrieve test casesrZ   N)r	   r   rJ   rO  r
   r   rP  rQ  get_user_test_casesr]   ri   r\   rS   rF   )ro  rI  rD   rp  r   r   r  r^   s           r-   get_recent_test_casesro  
  sz   &\oo))/: 6 6y A Au9RSTVYYY^!!#&q)''.		i 8 8uIJCOOF#D) ++G2+>
 B; #BuIBuI2%'),'7'A'A'CB|$	 ! (  
    
  \8QAB55TUVX[[[\s7   AD# AD# *?D# -'D# D# #
E(-0E#E(#E(z/api/analytics/errorsc                      [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ [        5       nU R                  S5      S   nUR                  U5      nU(       a.  UR                  S	5      (       a  US
   R                  S5      S:w  a  [	        SSS.5      S4$ SSKJ	n  [         R                  R                  S5      n[         R                  R                  S5      n[         R                  R                  S5      nU(       aQ  U(       aJ   [        R                  " US5      n[        R                  " US5      n	X-
  R                  n
[        U
S5      nO)[%        [         R                  R                  SS5      5      nUR'                  UUUUS9nSU;   a  [	        SUS   05      S4$ [	        SUS.5      $ ! [         a$  n[         R#                  SU 35        Sn SnANaSnAff = f! [         aC  n[         R)                  S[+        U5       35        [	        S[+        U5      05      S4s SnA$ SnAff = f)z-Get error analytics from MongoDB (admin only)r   r   FrW  rH  r=  r   r   rG   r   r   rZ  r_  r`  r   )error_loggerrX  rY  r$   ra  r    z1Error parsing date range, using default 30 days: Nr"   )r"   r$   rX  rY  rF   rZ   Tr[  zError getting error analytics: )r	   r   rJ   rO  r
   r   rP  rQ  utils.error_loggerrq  rI   r   re  r"   maxr\   rS   rx   r\  get_error_summaryrF   r]   )ro  rI  rD   rJ  rq  rX  rY  r$   start_datetimeend_datetime	days_diffr"   r^   error_summarys                 r-   get_error_analyticsry  9
  s    1/oo))/: 6 6y A Au9RSTVYYY^!!#&q)**51<#3#3I#>#>,vBVBZBZ[aBbfmBmuEFKK3 \\%%l3
<<##J/  ) (	!)!2!2:z!J'00:F):@@	9b) w||''34D %66!	 7 
 m#G]7%;<=sBB4?@@%  !RSTRUVW(  /6s1vh?@Q()3../s^   AH A3H A1H 4AG <AH H 
H(HH HH 
I8IIIz/api/mongo-document/<url_key>c                 n    U (       d  [        SS05      S4$ [        R                  SU  35        [        5       nUR                  R                  SU 05      nU(       d  UR                  R                  SU 05      nU(       d  [        SS05      S4$ SU;   a  [        US   5      US'   S	US
.n[        U5      nSUR                  S'   SUR                  S'   SUR                  S'   U$ ! [         aC  n[        R                  S[        U5       35        [        S[        U5      05      S4s SnA$ SnAff = f)z%Get MongoDB document content directlyrF   r4  rt   z)Retrieving MongoDB document for URL key: r   rn   r  rs   T)rG   rz   r$  r  r  r  r  r  z#Error retrieving MongoDB document: rZ   N)
r
   rS   rT   r   rv   rw   r]   r   r\   rF   )r   rL   r  r:  rr  r^   s         r-   get_mongo_documentr{  o
  s=   "/G%@ABCGG?yIJ$ &&//G0DE**33UG4DECG%9:;S@@ C<SZCJ 

 =) -])%/"&)# /:3q6(CDQ()3../s*   C' A8C' AC' '
D418D/)D4/D4z/api/notify-status-changec            	          [         R                  R                  S5      n [         R                  R                  S5      n[         R                  R                  S5      nU (       d  [        SS05      S4$ [        R                  SU  SU S	U 35        [        R                  R                  S
U 0S[        R                  " 5       UU[        R                  " 5       S.S.05        [        SSS.5      nSUR                  S'   SUR                  S'   SUR                  S'   U$ ! [         aC  n[        R                  S[        U5       35        [        S[        U5      05      S4s S nA$ S nAff = f)Nrm   
testCaseIdrY   rF   r4  rt   z,Received status change notification for key=z, testCaseId=z	, status=r   r  )r)  rY   r*   )r  last_status_changeTz#Status change notification receivedrH  r$  r  r  r  r  r  z-Error processing status change notification: rZ   )r	   rI   rJ   r
   rS   rT   rL   rv   r  r   r   r   r\   rF   r]   )r   r)  rY   rr  r^   s        r-   notify_status_changer  
  s]   )/,,""5)||''5!!(+G%@ABCGG 	B7)=YeXffopvowxy 	  ++ )1):(4"(%-__%6+		
 <
  -])%/"&)# /DSVHMNQ()3../s%   A2D! 5B+D! !
E.+8E)#E.)E.z/api/debug/force-syncc            	          [         R                  R                  S5      n U (       d  [        SS05      S4$ [	        5       nUR
                  R                  SU 05      nU(       d  [        SS05      S4$ [        UR                  S5      [        5      n0 nU(       a  [        US   5       H6  u  pVUR                  S	S
5      nUR                  SS
5      nU(       d  M2  XU'   M8     [        US   5       HF  u  pVUR                  S	S
5      nXt;   d  M  UR
                  R                  SU 0SSU S3XG   005        MH     OSU;   a  SUS   ;   a  [        US   S   5       HV  u  pVUR                  S	UR                  SS
5      5      nUR                  SUR                  SS
5      5      nU(       d  MR  XU'   MX     [        US   S   5       HV  u  pVUR                  S	UR                  SS
5      5      nXt;   d  M.  UR
                  R                  SU 0SSU S3XG   005        MX     U(       a"  UR
                  R                  SU 0SSU005        UR
                  R                  SU 0S[        R                  " 5       UR                  SS5      S-   S.05        [        SSUUS.5      $ ! [         aC  n	[        R                  S[!        U	5       35        [        S[!        U	5      05      S4s Sn	A	$ Sn	A	ff = f)z;Debug endpoint to force sync of status values between viewsrm   rF   r4  rt   r   r  rs   r   r   r|   r  r  r  r  r   r?  rY   ztest_data.test_cases.z.statusstatus_force_sync_countr   r   )status_force_synced_atr  TzStatus values forced to sync)rG   rR   r  r  zError during force sync: rZ   N)r	   rI   rJ   r
   r   rv   rw   r   r   r   r  r   r+   r\   rS   rF   r]   )
r   rL   r  r  updated_statusr  r  r?  rY   r^   s
             r-   debug_force_syncr  
  s   Z/,,""5)G%@ABCGG % &&//G0DEG%9:;S@@ $CGGK$8$? "3{#34w+"-5,25) 5 #3{#34w+*!,,77"G,Jqc"9>;P!QR	 5 c!lc+6F&F&s;'7'EFEAFF7BFF7B,?@EVVHbffXr.BCFu06u- G 's;'7'EFEAFF7BFF7B,?@E.%00;;&0#(=aS&H.J_%`a	 G $$//G$(N34 	  ++ *2,,.+.773La+PST+T 	
 5+,	
  	  /0Q9:Q()3../sD   4J$ <J$ 4A$J$ 0J$ BJ$ /AJ$ 6B-J$ $
K1.8K,&K1,K1z/healthc            	      :    Sn  [         (       a  [         R                  R                  5         OSn  Sn [
        R                  R                  [        5      n[
        R                  R                  USS5      n[
        R                  R                  U5      (       d  [
        R                  " USS9  [        S	[        R                  " 5       R                  5       U U[
        R                   " S
5      (       a  SOSS.5      $ ! [         a  nS[	        U5       3n  SnANSnAff = f! [         a  nS[	        U5       3n SnANSnAff = f! [         aE  n[        S[	        U5      [        R                  " 5       R                  5       S.5      S4s SnA$ SnAff = f)z*Health check endpoint for cloud deploymentOKzNot initializedr   Nr  r  Tr   healthyRENDER
productiondevelopment)rY   r*   mongodb
filesystemenvironment	unhealthy)rY   rF   r*   rZ   )rL   rv   rw   r\   r]   r   r   r   r   r   rf  r   r
   r   r+   ri   getenv)mongo_statusr^   	fs_statusr  r  s        r-   health_checkr  "  sP   "	.}((1130
 		+wwx0HGGLL7KHM77>>-00MD9 !113##+-99X+>+><M
  	  	.$SVH-L	.  	+!#a&*I	+  !V!113
  	 	sz   E )D E D E A=D& 2AE 
D#DE D##E &
E0E>E EE 
F:FFFz/api/verify-api-keyc                     SSK n SSKn SSKJn  U(       a  US:X  d  US:X  a  [	        SSSS	.5      S
4$ SSK Jn  U" US9n UR                  R                  5       nU(       a  UR                   Vs/ s H  ofR                  PM     nnU Vs/ s H1  nUR                  S5      (       d  M  SU;   d  US:X  d  US:X  d  M/  UPM3     nnU(       a  [	        SSUS.5      $ [	        SSSUSS S.5      S4$ [	        SSSS	.5      S
4$ s  snf s  snf ! [         aH  n	[        R                  S[        U	5       35        [	        SS[        U	5       3SS	.5      S
4s Sn	A	$ Sn	A	ff = f! [         a  n
[        U
5      nSnSUR                  5       ;   d  S UR                  5       ;   a  S!nO-S"UR                  5       ;   a  S#nOS$UR                  5       ;   a  S%n[	        SS&U 3US	.5      S
4s Sn
A
$ Sn
A
ff = f)'zB
Endpoint to verify if the OpenAI API key is configured correctly
r   N)OPENAI_API_KEYyour_openai_api_key_heremissing_api_keyrF   z$OpenAI API key is missing or invalidzWPlease configure a valid API key in your .env file. The API key should start with "sk-")rY   rR   detailsrt   )OpenAI)api_keyzgpt-4ovisionzgpt-4o-minirG   z0API key is valid and vision models are available)rY   rR   available_vision_modelsrx   z3API key is valid but no vision models are availablez?Your OpenAI account may not have access to gpt-4o Vision modelsr   )rY   rR   r  available_modelsr   zCould not validate API keyz4API responded without error but no data was returnedzError validating API key: zAPI verification failed: z5There was an error verifying your API key with OpenAIzHCheck that your API key is valid and your account has sufficient creditsauthenticationr!  z'Invalid API key or authentication issuer0  zARate limited by OpenAI. Try again later or check your usage tier.r/  zNYou have exceeded your quota. Check your billing settings on OpenAI dashboard.zAPI key verification failed: )openairH  r  r  r
   r  modelsr   rl  r   rO  r\   rS   rF   r]   re  )r  rH  r  r  clientrr  modelr  vision_models	api_errorr^   rf   error_detailss                r-   verify_api_keyr  I  sX   
 E23M!MQ_ctQt!At  	  	"/$	}}))+H :B--#H-HH- #H4D !d4D5#(#3#3H#= "'!)U!2ex6G5TaKa "'4D !d !""+#U3@$   #"+#X#d,<Sb,A	$ 
   %;U   	 ' $I!d.  	LL5c)n5EFG!6s9~6FGR  	 	  Ab}2244	]EXEXEZ8ZEM]0022_M++--lM6}oF$
  	 	s   )E  E  /D 0DD D)D=DD D 0D 
D 
E=EEE  EE   
G-*A8G("G-(G-z/setup-helpc                      [        SSS9$ )z5Page with setup instructions and API key verificationrq   z1This page helps you configure your OpenAI API keyrr   r1   r2   r/   r-   
setup_helpr    s     <7jkkr/   z/api/shorten-urlc                      [         R                  n [        R                  SU  35        U (       d$  [        R	                  S5        [        SS05      S4$ [        5       nU R                  S5      nU R                  S5      nU R                  S5      nU(       d$  [        R	                  S5        [        SS	05      S4$ U(       a|  [        U5      S
:  am  [        R                  SU S35        UR                  R                  UUSS.5      nU(       a.  [        R                  SUS    35        [        SSUS    305      $ UR                  U 5      n[        R                  SU 35        [        SSU 305      $ ! [         aC  n[        R	                  S[        U5       35        [        S[        U5      05      S4s S nA$ S nAff = f)Nz$Received URL params for shortening: zNo URL parameters providedrF   rt   rm   r.  rF  zNo files parameter in URL datazNo files parameter providedr  zFound long key z!, checking for existing short URLshortened_url)zurl_params.fileszurl_params.item_idsr   zFound existing short URL: rn   z/results?token=z"Generated new short URL with key: zError creating shortened URL: rZ   )r	   rH  rS   rT   rF   r
   r   rJ   r   rv   rw   save_url_datar\   r]   )rp   rL   existing_keyr.  rF  existing_docry   r^   s           r-   shorten_urlr    s   -/\\
::,GHLL56G%ABCSHH % "~~e,w'>>*-LL9:G%BCDcII C-1KK/,7XYZ(33<<$)'/'> L
 8e9L8MNO#|E7J6K%L   
 "//
;	8DEyk:
  	  /5c!fX>?Q()3../s2   AE9 A'E9 =BE9  8E9 9
G8G;GGz/api/verify-jirac                       [         R                  n U R                  SS5      R                  5       nU R                  SS5      R                  5       nU R                  SS5      R                  5       nU(       a  U(       a  U(       d  [	        SSS.5      S4$ UR                  S	5      (       d  S
U-   nSSKJn  U" XU5      nUR                  5       nU(       aG  [        R                  SUR                  SS5       35        [	        SSUR                  SS5      S.5      $ [	        SSS.5      S4$ ! [         aD  n[        R                  S[        U5       35        [	        S[        U5      S.5      S4s SnA$ SnAff = f)z&Verify Jira connection and credentialsjiraUrlr|   jiraUser	jiraTokenFMissing required fieldsrG   rF   rt   zhttp://r   r   r   
JiraClientz%Jira connection successful for user: displayNamer   TConnection successful)rG   rR   r   z Could not authenticate with Jirar=  zJira verification error: rZ   N)r	   rH  rJ   rS  r
   rO  jira.jira_clientr  get_current_userrS   rT   r\   rF   r]   )rl  jira_url	jira_user
jira_tokenr  jira_clientrp  r^   s           r-   verify_jira_connectionr    s_    A||88Ir*002HHZ,224	XXk2.446
y
u7PQRTWWW ""#:;;!H,H 	0 jA  002	KK?	m]f@g?hij2!mY?   u7YZ[]``` A0Q9:53q6:;S@@As+   BD/ BD/ D/ /
E=99E82E=8E=z/api/test-urlc                      [         R                  n U R                  SS5      R                  5       nU(       d  [	        SSS.5      S4$  [        U5      n[        UR                  UR                  /5      (       d  [	        SSS.5      S4$ [        R                  " USS	9nUR                  S
:X  a  [	        SSS.5      $ [	        SSS.5      UR                  4$ ! [        R                   a  n[	        SSS.5      S4s SnA$ SnAff = f! [         aD  n[        R                  S[        U5       35        [	        S[        U5      S.5      S4s SnA$ SnAff = f)zTest if a URL is accessibler   r|   Fr   r  rt   r   r   )r   r   TzURL is accessiblerH  zURL is not accessiblezFailed to connect to URLNzURL test error: rZ   )r	   rH  rJ   rS  r
   r   rT  rU  rV  rW  rX  r^  r\   rS   rF   r]   )rl  r   rq  rr  r^   s        r-   test_urlr    sF   A||hhub!'')u7HIJCOO	Y!#J
)):+<+<=>>5;OPQSVVV  ||C4H##s*4<OPQQ5;RSTV^VjVjjj(( 	Yu7QRSUXXX	Y  A'Ax0153q6:;S@@AsU   AD	 
A C 2C >C D,D;D<D	 DD	 	
E9EEEz/api/verify-azurec                  P    [         R                  n U R                  SS5      R                  5       nU R                  SS5      R                  5       nU R                  SS5      R                  5       nU R                  SS5      R                  5       nU(       a  U(       a  U(       a  U(       d  [	        SSS.5      S	4$ UR                  S
5      (       d  SU-   nSSKJn  U" XU5      nUR                  U5      nU(       aG  [        R                  SUR                  SS5       35        [	        SSUR                  SS5      S.5      $ [	        SSS.5      S4$ ! [         aD  n[        R                  S[        U5       35        [	        S[        U5      S.5      S4s SnA$ SnAff = f)z.Verify Azure DevOps connection and credentialsazureUrlr|   azureOrgazureProjectazurePatFr  r  rt   r  r   r   r   z)Azure connection successful for project: namer   Tr  )rG   rR   projectz(Could not authenticate with Azure DevOpsr=  zAzure verification error: rZ   N)r	   rH  rJ   rS  r
   rO  azure_integration.azure_clientr   get_projectrS   rT   r\   rF   r]   )	rl  	azure_url	azure_orgazure_project	azure_patr   r  project_infor^   s	            r-   verify_azure_connectionr    s   !A||HHZ,224	HHZ,224	4::<HHZ,224		iu7PQRTWWW ##$;<<"Y.I 	?"9C $//>KKCLDTDTU[]fDgChij2'++FI>   u7abcehhh A1#a&:;53q6:;S@@As+   B;E >BE E 
F%!9F F% F%z/api/fetch-jira-itemsc            
      <    [         R                  n U R                  SS5      R                  5       nU R                  SS5      R                  5       nU R                  SS5      R                  5       nU(       a  U(       a  U(       d  [	        SSS.5      S4$ UR                  S	5      (       d  S
U-   nSSKJn  U" XU5      n/ SQnUR                  SUS9nU(       a  / nU H  n	UR                  U	R                  SS5      U	R                  S0 5      R                  SS5      U	R                  S0 5      R                  S0 5      R                  SS5      U	R                  S0 5      R                  S0 5      R                  SS5      S.5        M     [        R                  S[        U5       S35        [	        SUS.5      $ [	        SSS.5      S4$ ! [         aD  n
[        R                  S[        U
5       35        [	        S[        U
5      S.5      S4s Sn
A
$ Sn
A
ff = f) z'Fetch recent Jira items for suggestionsr  r|   r  r  Fr  r  rt   r  r   r   r  )zTo DoReady for QAzReady for QazReady For QAN)rm  statusesrm   r5  r7  	issuetyper  IssuerY   r   r?  r   rY   Fetched z Jira items for suggestionsTrG   rK  zNo issues foundrs   zError fetching Jira items: rZ   )r	   rH  rJ   rS  r
   rO  r  r  get_recent_issuesr   rS   rT   r   r\   rF   r]   )rl  r  r  r  r  r  desired_statusesissuesrK  r  r^   s              r-   fetch_jira_itemsr  7  s   .A||88Ir*002HHZ,224	XXk2.446
y
u7PQRTWWW ""#:;;!H,H/ jA
 ..TDT.UE))E2."YYx488BG!IIh377RHLLVU\]#ii"599(BGKKFTVW	    KK(3u:,.IJK  
 u7HIJCOO A23q6(;<53q6:;S@@As+   BG D%G =G 
H9HHHz/api/fetch-azure-itemsc                      [         R                  n [        R                  SU  35        U R	                  SS5      R                  5       nU R	                  SS5      R                  5       nU R	                  SS5      R                  5       nU R	                  SS5      R                  5       n[        R                  SU SU S	U S
U(       a  S[        U5      -  OS 35        U(       a  U(       a  U(       a  U(       dU  [        R                  S[        U5       S[        U5       S[        U5       S[        U5       35        [        SSS.5      S4$ UR                  S5      (       d  SU-   nSSKJn  U" XU5      nX6l        [        R                  SU 35        UR                  U5      nU(       d,  [        R                  SU 35        [        SSU S3S.5      S4$ [        R                  SUR	                  SU5       35        [        R                  S U S!35        / S"QnUR                  US#US$9n	[        R                  S%U	(       a  [        U	5      OS S&35        U	(       a  / n
U	 H  nU
R!                  [#        UR	                  S'S5      5      UR	                  S(0 5      R	                  S)S5      UR	                  S(0 5      R	                  S*S+5      UR	                  S(0 5      R	                  S,S5      S-.5        M     [        R                  S.[        U
5       S/35        [        S0U
S1.5      $ [        SS2S.5      S34$ ! [$         a  n[        R                  S4[#        U5       35        [        R                  S5['        U5       35        SS#Kn[        R                  S6UR+                  5        35        [        S[#        U5      S.5      S74s S#nA$ S#nAff = f)8z4Fetch recent Azure DevOps work items for suggestionszReceived Azure data: r  r|   r  r  r  zProcessed Azure fields - URL: 'z	', Org: 'z', Project: 'z', PAT: *r   zMissing Azure fields - URL: z, Org: z, Project: z, PAT: Fr  r  rt   r  r   r   r   zTesting Azure project access: z Failed to access Azure project: zCannot access project z . Please check your permissions.r`  z%Successfully accessed Azure project: r  z'Fetching Azure work items for project: z with QA-ready filters)r  zRe-openReopenedz	Re-openedN)rm  statesz
Retrieved z Azure work itemsr   r5  zSystem.TitlezSystem.WorkItemTypez	Work ItemzSystem.Stater  r  z! Azure work items for suggestionsTr  zNo work items foundrs   zError fetching Azure items: zError type: r7  rZ   )r	   rH  rS   rT   rJ   rS  r   rF   r   r
   rO  r  r   r  r  get_recent_work_itemsr   r]   r\   r   r   r   )rl  r  r  r  r  r   r  r  desired_statesr  rK  r  r^   r   s                 r-   fetch_azure_itemsr  j  s   EA||+D623HHZ,224	HHZ,224	4::<HHZ,224	5i[	)Taboappx  R[y|  @C  DM  @N  zN  ag  yh  i  	j	iLL7Y7HPTU^P_O``klpq~l  lA  AH  IM  NW  IX  HY  Z  [u7PQRTWWW ##$;<<"Y.I>"9C &3" 	4]ODE#//>LL;M?KLu9OP]^~7  A  B  DG  G  G;L<L<LVUb<c;def 	=m_Lbcd
 "77TZh7i
jJZA FFWXYE"dhhtR01!XXh377K HHXr2667LkZ"hhx488L	  # KK(3u:,.OPQ  
 u7LMNPSSS A3CF8<=|DG9-.{9#7#7#9":;<53q6:;S@@As3   EL? BL? EL? /L? ?
O	BOOOz/api/export-excelc                      [         R                  n U (       d  [        SS05      S4$ U R                  S/ 5      nU R                  S0 5      nU R                  SS5      nU R                  S/ 5      nU(       d  [        SS	05      S4$ [        R                  S
[        U5       SU 35        SSKJn  U" XX45      n[        R                  " 5       R                  S5      nSU SU S3nSSKJn	  U	" USSSU S30S9n
U
$ ! [         aF  n[        R                  S[!        U5       35        [        SS[!        U5       305      S4s SnA$ SnAff = f)zExport test cases to Excel filerF   rG  rt   r   r  r   r   rF  zNo test cases providedz
Exporting z test cases to Excel for r   )create_excel_reportr  test_cases_r   r  ResponsezAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetContent-Dispositionzattachment; filename=""mimetyper   zError exporting to Excel: zExport failed: rZ   N)r	   rH  r
   rJ   rS   rT   r   r  r  r   r+   r,   flaskr  r\   rF   r]   )rl  r   r  r   rF  r  
excel_datar*   rL  r  rr  r^   s               r-   export_excelr    sW   #C||G%7893>>XXlB/
"5hh}i888J+G%=>?DDjZ 11J;-XY 	;(KZ
 LLN++O<	 Qyk? 	#X*.DXJa,PQ
  C1#a&:;?3q6(!;<=sBBCs*   %C< AC< A5C< <
E;EEEz/api/auth/signupc                      [         R                  n U (       d  [        SSS.5      S4$ U R                  SS5      R	                  5       nU R                  SS5      R	                  5       nU R                  SS5      nU(       a  [        U5      S	:  a  [        SS
S.5      S4$ U(       a  SU;  a  [        SSS.5      S4$ U(       a  [        U5      S:  a  [        SSS.5      S4$ [        5       nUR                  X#U5      nUS   (       a  [        SSS.5      $ [        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [        SSS.5      S4s SnA$ SnAff = f)zHandle user registrationFrG  rH  rt   r  r|   rH   passwordr(  z'Name must be at least 2 characters long@$Please provide a valid email addressr  z+Password must be at least 8 characters longrG   Tz-Account created successfully! Please sign in.rR   zError in signup API: z%An error occurred during registrationrZ   N)r	   rH  r
   rJ   rS  r   r   create_userr\   rS   rF   r]   )rl  r  rH   r  rL   r  r^   s          r-   
signup_apir    sp   !d||u9KLMsRRxx#))+"%++-88J+ s4y1}u9bcdfiii5(u9_`acfff3x=1,u9fghjmmm %**5DA)J  
 u	9JKLcQQ d,SVH5655\]^`cccds;   &D+ A7D+ !D+ >%D+ $3D+ D+ +
E050E+%E0+E0z/api/auth/signinc                      [         R                  n U (       d  [        SSS.5      S4$ U R                  SS5      R	                  5       nU R                  SS5      nU(       a  U(       d  [        SSS.5      S4$ [        5       nUR                  X5      nUS	   (       a  [        S
SUS   US   S.5      $ [        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [        SSS.5      S4s SnA$ SnAff = f)zHandle user loginFrG  rH  rt   rH   r|   r  zEmail and password are requiredrG   TzLogin successful!rD   r   )rG   rR   rD   r   rR   r=  zError in signin API: zAn error occurred during loginrZ   N)r	   rH  r
   rJ   rS  r   authenticate_userr\   rS   rF   r]   )rl  rH   r  rL   r  r^   s         r-   
signin_apir    s   ]||u9KLMsRR"%++-88J+ Hu9Z[\^aaa %00A).v	   u	9JKLcQQ ],SVH5655UVWY\\\]s/   &C AC 9:C 4C 
D0DDDz/api/auth/dashboardc            
          [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  U5      n[        U5      n[        R                  " 5       R                  n[        R                  " 5       R                  nSn	Sn
U(       Ga  U H  nUR                  S5      nU(       d  M   [        U[        5      (       a'  [        R                   " UR#                  SS5      5      nOUnUR                  U:X  a  UR                  U:X  a  U	S-  n	M  M  M      [+        US S9nUR                  S5      (       aT  US   n[        U[        5      (       a'  [        R                   " UR#                  SS5      5      nOUnUR-                  S5      n
UU	U
S.n[	        SUUS.5      $ ! [$         a?  n[&        R)                  SUR                  S5       S[        U5       35         SnAGMX  SnAff = f! [$         a-  n[&        R)                  S[        U5       35        Sn
 SnANSnAff = f! [$         a:  n[&        R/                  S[        U5       3SS9  [	        SS S.5      S!4s SnA$ SnAff = f)"zGet user dashboard datar   r   FAuthorization token requiredrH  r=  r   r   rG   Invalid or expired tokenr   r   r   Neverr   rb  rc  z#Failed to parse date for test case rn   r   Nc                 B    U R                  S[        R                  5      $ )Nr   )rJ   r   min)xs    r-   <lambda>dashboard_api.<locals>.<lambda>Z  s    quu\8<<7Xr/   )rm   z	%B %d, %Yz&Failed to determine latest test case: r   )total
this_monthlast_generatedT)rG   r   statszError in dashboard API: r  z)An error occurred while loading dashboardrZ   )r	   r   rJ   rO  r
   rP  r   rQ  rn  r   r   r+   monthyearr   r]   rf  rg  r\   rS   rx   rs  r,   rF   )ro  rD   rL   rp  r   r   total_countcurrent_monthcurrent_yearthis_month_countr  r  r   parsed_dater^   latest	last_dater  s                     r-   dashboard_apir  $  s   Mhoo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) #66w?
 *o ,,||~**  VVL1
:!%j#66*2*@*@ASASTWYaAb*cK +5K ',,=+BRBRVbBb,1, Cc= !*+Z-XY::l++!'!5J!*c22$,$:$::;M;McS[;\$]	$.	%.%7%7%DN !*,
 $
  	1 % !)LRVVTY]O[]^abc^d]e'fg !  +!GAxPQ!*+   h/Ax84H55`abdggghs   AJ4 AJ4 *B	J4 8A#H.J4 $A5I: J4 .
I783I2+J4 2I77J4 :
J1#J,'J4 ,J11J4 4
K8>/K3-K83K8/api/auth/reset-passwordc            	      *    [         R                  n U (       d  [        SSS.5      S4$ U R                  SS5      R	                  5       nU(       a  SU;  a  [        SSS.5      S4$ [        5       nUR                  R                  SU05      nU(       d  [        S	S
S.5      $ UR                  U5      nUS   (       d9  [        R                  SU SUR                  SS5       35        [        S	S
S.5      $  SSKJn  U" UUS   US   S9nU(       a  [        R                  SU 35        O[        R                  SU 35         [        R                  SU 35        [        S	SS.5      $ ! [         a.  n[        R                  SU S[        U5       35         SnANYSnAff = f! [         ac  n[        R                  S[        U5       35        [!        USW (       a  U R                  SS5      OSS.5        [        SSS.5      S4s SnA$ SnAff = f) zHandle password reset requestFrG  rH  rt   rH   r|   r  r  TzJIf an account with that email exists, a password reset link has been sent.rG   z!Failed to create reset token for r   rR   Unknown errorr   )send_password_reset_emailrD   
expires_at)rH   reset_tokenr  z+Password reset email sent successfully to: z(Failed to send password reset email to: z&Error sending password reset email to Nz$Password reset requested for email: zcIf an account with that email exists, a password reset link has been sent. Please check your email.zError in reset password API: r  )rd   rH   'An error occurred during password resetrZ   )r	   rH  r
   rJ   rS  r   users_collectionrw   create_password_reset_tokenrS   rF   r[   r  rT   r\   r]   r   )	rl  rH   rL   r   rM   r  
email_sentemail_errorr^   s	            r-   reset_password_apir  v  s   =f||u9KLMsRR"%++- 5(u9_`acfff %--667GHg   %@@GI&LL<UG2lFVFVW`bqFrEstug  	_F2(1'5J I%QRGwOP 	:5'BC|
  	  	_LLA%3{K[J\]^^	_  f4SVH=>!*DhltxxX_acOdrtuv55^_`beeefsf   &F% <F% &;F% "AF% 73E* *F% +E* &F% *
F"4$FF% F""F% %
H/AHHH /api/auth/reset-password-confirmc            	          [         R                  n U (       d  [        SSS.5      S4$ U R                  SS5      R	                  5       nU R                  SS5      R	                  5       nU R                  SS5      R	                  5       nU(       d  [        SS	S.5      S4$ U(       d  [        SS
S.5      S4$ [        U5      S:  a  [        SSS.5      S4$ X#:w  a  [        SSS.5      S4$ [        5       nUR                  X5      nUS   (       a*  [        R                  SUSS  S35        [        SSS.5      $ [        R                  SUSS  SUR                  SS5       35        [        SUR                  SS5      S.5      S4$ ! [         af  n[        R                  S[        U5       35        [        USW (       a  U R                  SS5      SS OSS.5        [        SSS.5      S4s SnA$ SnAff = f)z"Handle password reset confirmationFrG  rH  rt   rD   r|   new_passwordconfirm_passwordzReset token is requiredzNew password is required   z+Password must be at least 6 characters longzPasswords do not matchrG   z1Password reset successfully completed for token: Nr   z...TzHPassword reset successfully. You can now sign in with your new password.z!Password reset failed for token: z... - rR   r  zFailed to reset passwordz%Error in reset password confirm API: r  )rd   rD   r  rZ   )r	   rH  r
   rJ   rS  r   r   use_password_reset_tokenrS   rT   rx   r\   rF   r]   r   )rl  rD   r  r  rL   r  r^   s          r-   reset_password_confirm_apir"    s#   *f||u9KLMsRR"%++-xx399;88$6;AAC u9RSTVYYYu9STUWZZZ|q u9fghjmmm+u9QRSUXXX %77L)KKKERUSUJ<WZ[\e  
 NN>uSbzl&QWQ[Q[\egvQwPxyz !::i1KL   
  f<SVHEF!*LuyW[W_W_`gikWlmpnpWq  @B  C  	D55^_`beeefsD   &F A6F  F 7F F +AF :AF 
G8AG3-G83G8z/api/auth/system-overviewc                  f    [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  U5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)z Get system overview (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   rR   r`  zError in system overview API: z/An error occurred while loading system overviewrZ   N)r	   r   rJ   rO  r
   rP  r   rQ  get_system_overviewr\   rS   rF   r]   )ro  rD   rL   rp  r   system_overviewr^   s          r-   system_overview_apir&    s,   noo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) (;;GD9%?++u9STUWZZZ n5c!fX>?55fghjmmmn1   AC+ AC+ *-C+ C+ +
D050D+%D0+D0z/api/auth/recent-usersc                      [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  U5      nUS	   (       a  SU;   a  US   SS O/ n[	        SUS.5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)zGet recent users (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   usersNr   T)rG   r)  rR   r`  zError in recent users API: z,An error occurred while loading recent usersrZ   )r	   r   rJ   rO  r
   rP  r   rQ  get_all_usersr\   rS   rF   r]   )ro  rD   rL   rp  r   r)  recent_usersr^   s           r-   recent_users_apir,    sS    koo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) ++G429U2B5>#2.L%  
 uy9IJKSPP k23q6(;<55cdegjjjks2   AC> AC> *A C> +C> >
E0D>8E>Ez/api/auth/all-usersc                      [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   n[        [         R                  R                  SS5      5      n[        [         R                  R                  SS5      5      nUR                  XEU5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)z*Get all users with pagination (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   pageper_pager   rR   r`  zError in all users API: z%An error occurred while loading usersrZ   N)r	   r   rJ   rO  r
   rP  r   rQ  r\  rI   get_all_users_paginatedr\   rS   rF   r]   )	ro  rD   rL   rp  r   r.  r/  r)  r^   s	            r-   all_users_apir1  -  sd   doo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) 7<<##FA./w||''
B78 55gXN5>!uy9IJKSPP d/Ax8955\]^`cccds2   AD> AD> *B D> +D> >
F0E>8F>Fz/api/auth/system-healthc                  f    [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  U5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)z%Get system health status (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   rR   r`  zError in system health API: z.An error occurred while checking system healthrZ   N)r	   r   rJ   rO  r
   rP  r   rQ  get_system_healthr\   rS   rF   r]   )ro  rD   rL   rp  r   healthr^   s          r-   system_health_apir5  Q  s*   moo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) 009)6?"u	9JKLcQQ m3CF8<=55efgilllmr'  z/api/auth/user-analyticsc                  f    [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  U5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)z(Get detailed user analytics (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   rR   r`  zError in user analytics API: z.An error occurred while loading user analyticsrZ   N)r	   r   rJ   rO  r
   rP  r   rQ  get_detailed_user_analyticsr\   rS   rF   r]   )ro  rD   rL   rp  r   	analyticsr^   s          r-   user_analytics_apir9  q  s,   moo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) "==gF	Y9%%u99MNOQTTT m4SVH=>55efgilllmr'  z/api/auth/create-userc                      [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   n[         R                  " 5       nU(       d  [	        SSS.5      S4$ UR                  XE5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)zCreate a new user (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   rG  rt   rR   zError in create user API: z%An error occurred while creating userrZ   N)r	   r   rJ   rO  r
   rP  r   rQ  get_jsoncreate_user_by_adminr\   rS   rF   r]   ro  rD   rL   rp  r   rl  r  r^   s           r-   create_user_apir>    sS    doo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) !u9KLMsRR 33GB)6?"u	9JKLcQQ d1#a&:;55\]^`cccd7   AD AD *3D %D D 
E!0EEEz/api/auth/export-datac            	          [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  U5      nUS	   (       aO  SSK	J
n  SSKJn  UR                  US   SS9nU" USSS[        R                  " 5       R!                  S5       S30S9$ [	        SUS   S.5      S4$ ! ["         a;  n	[$        R'                  S[)        U	5       35        [	        SSS.5      S4s Sn	A	$ Sn	A	ff = f)zExport system data (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   r   r  )	json_utilrl  r(  )indentzapplication/jsonr  z#attachment; filename=system-export-z%Y%m%dz.jsonr  rR   r`  zError in export data API: z&An error occurred while exporting datarZ   N)r	   r   rJ   rO  r
   rP  r   rQ  export_system_datar  r  bsonrA  dumpsr   r+   r,   r\   rS   rF   r]   )
ro  rD   rL   rp  r   export_resultr  rA  payloadr^   s
             r-   export_data_apirH    s   %eoo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) &88A#&&oomF&;AoFG+)-PQYQ]Q]Q_QhQhiqQrPssx+y  uy9QRSUXXX e1#a&:;55]^_adddes2   AD/ AD/ *A1D/ D/ /
E490E/)E4/E4z/api/auth/system-logsc                  f    [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  U5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)zGet system logs (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   rR   r`  zError in system logs API: z+An error occurred while loading system logsrZ   N)r	   r   rJ   rO  r
   rP  r   rQ  get_system_logsr\   rS   rF   r]   )ro  rD   rL   rp  r   logsr^   s          r-   system_logs_apirL    s(   joo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) ,,W5	?4= uiIJCOO j1#a&:;55bcdfiiijr'  z/api/auth/backup-systemc                  f    [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  U5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)z!Create system backup (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   rR   r`  zError in backup system API: z'An error occurred while creating backuprZ   N)r	   r   rJ   rO  r
   rP  r   rQ  create_system_backupr\   rS   rF   r]   )ro  rD   rL   rp  r   backup_resultr^   s          r-   backup_system_apirP     s,   foo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) &::7C#=))uy9QRSUXXX f3CF8<=55^_`beeefr'  z/api/auth/system-settingsc                      [         R                  R                  S5      n U (       a  U R                  S5      (       d  [	        SSS.5      S4$ U R                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   n[         R                  " 5       nU(       d  [	        SSS.5      S4$ UR                  XE5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)z#Update system settings (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   rG  rt   rR   zError in system settings API: z)An error occurred while updating settingsrZ   N)r	   r   rJ   rO  r
   rP  r   rQ  r;  update_system_settingsr\   rS   rF   r]   r=  s           r-   system_settings_apirS     sS    hoo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZF#D) !u9KLMsRR 55gD)6?"u	9JKLcQQ h5c!fX>?55`abdggghr?  z /api/auth/user-details/<user_id>c                 f    [         R                  R                  S5      nU(       a  UR                  S5      (       d  [	        SSS.5      S4$ UR                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   nUR                  XP5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)zGet user details (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   rR   r`  zError in user details API: z,An error occurred while loading user detailsrZ   N)r	   r   rJ   rO  r
   rP  r   rQ  get_user_detailsr\   rS   rF   r]   )r   ro  rD   rL   rp  admin_user_idr  r^   s           r-   user_details_apirW  E  s*   koo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZ!&)$/ //G)6?"u	9JKLcQQ k23q6(;<55cdegjjjkr'  z/api/auth/update-user/<user_id>PUTc                     [         R                  R                  S5      nU(       a  UR                  S5      (       d  [	        SSS.5      S4$ UR                  S5      S   n[        5       nUR                  U5      nU(       a  UR                  S	5      (       d  [	        SS
S.5      S4$ US   S   n[         R                  " 5       nU(       d  [	        SSS.5      S4$ UR                  XPU5      nUS	   (       a  [	        U5      $ [	        SUS   S.5      S4$ ! [         a;  n[        R                  S[        U5       35        [	        SSS.5      S4s SnA$ SnAff = f)zUpdate user (admin only)r   r   Fr  rH  r=  r   r   rG   r  r   r   rG  rt   rR   zError in update user API: z%An error occurred while updating userrZ   N)r	   r   rJ   rO  r
   rP  r   rQ  r;  update_user_by_adminr\   rS   rF   r]   )	r   ro  rD   rL   rp  rV  rl  r  r^   s	            r-   update_user_apir[  e  sU    doo))/:+"8"8"C"Cu9WXY[^^^!!#&q) %!2259		i 8 8u9STUWZZZ!&)$/ !u9KLMsRR 33MDQ)6?"u	9JKLcQQ d1#a&:;55\]^`cccds7   AD AD *3D &D D 
E"0EEErs   c                     [         R                  S[        R                   35        [        R                  R                  S5      (       a  [        SS05      S4$ [        SSS9S4$ )	zHandle 404 Not Found errorsz404 error: /api/rF   zAPI endpoint not foundrs   rq   zNThe page you're looking for doesn't exist. Please check the URL and try again.rr   rS   rx   r	   r   r   rO  r
   r   rE   s    r-   not_found_errorr_    sj     NN[./||w''!9:;S@@<  8H  I  KN  N  Nr/   rZ   c                     [         R                  S[        U 5       35        [        R                  R                  S5      (       a  [        SS05      S4$ [        SSS9S4$ )	z!Handle 500 Internal Server errorsz500 error: r]  rF   zInternal server error occurredrZ   rq   z8Something went wrong on our end. Please try again later.rr   )rS   rF   r]   r	   r   rO  r
   r   rE   s    r-   internal_errorra    sZ     LL;s5zl+,||w''!ABCSHH<7qrtwwwr/   r`  c                     [         R                  S[        R                   35        [        R                  R                  S5      (       a  [        SS05      S4$ [        SSS9S4$ )	zHandle 403 Forbidden errorsz403 error: r]  rF   zAccess forbiddenr`  rq   z2You don't have permission to access this resource.rr   r^  rE   s    r-   forbidden_errorrc    sZ     NN[./||w''!345s::<7klnqqqr/   rt   c                     [         R                  S[        R                   35        [        R                  R                  S5      (       a  [        SS05      S4$ [        SSS9S4$ )	zHandle 400 Bad Request errorsz400 error: r]  rF   zBad requestrt   rq   z?The request was invalid. Please check your input and try again.rr   r^  rE   s    r-   bad_request_errorre    sY     NN[./||w''/0#55<7xy{~~~r/   c                      SU R                   ;  a  SU R                   S'   SU R                   ;  a  SU R                   S'   SU R                   ;  a  SU R                   S'   U $ ! [         a     U $ f = f)Nr  r$  r  r  r  r  )r   r\   )rr  s    r-   add_global_no_cache_headersrg    s    	("2"220`H_-8+++)3HX&H,,,*-HY' O  Os   AA! !
A/.A/__main__z0.0.0.0i  )hostport)rr  r   r   r   r   r   r  r   r	   r
   r   r   r   
flask_corsr   r  r   r  r   ai.generatorr   ra  r   r  r   r   r   r   utils.mongo_handlerr   r   rH  r   r   r,  r  loggingrW  urllib.parser   r[  r   	functoolsr   __name__appenvironrJ   configbasicConfigINFO	getLoggerrS   router.   r3   r6   r8   r:   r=   r?   rB   rN   rP   rU   r_   rk   r{   r   r   r  r  r  r  r  r  r  r  rL   r  r   r)  r.  rE  rL  rU  r]  rh  ro  ry  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r&  r,  r1  r5  r9  r>  rH  rL  rP  rS  rW  r[  errorhandlerr_  ra  rc  re  after_requestrg  runr2   r/   r-   <module>r|     s\
   j j / 0 Y Y  ( 6 + < x x , 	  (  	   !  Ho S	  "zz~~.>@fg

 )2);

% &   ',,/e f			8	$3> >
 <- - 1 1 =. . 9* * 9* * <- - 2 2 $%d &d 3 3 7l l = 6 %&& '&P :o o0  u5F	  ?VH-@/ .@/D *+{/ ,{/z !"5/ #5/n &'2/ (2/h ./9/ 09/v $%9/ &9/v )*L/ +L/\ &2E/ 3E/P <&*z/ +z/x r4 r4h ()u/ *u/p #$v %v> %1V/ 2V/r !F84+/ 5+/Z #fX6*/ 7*/X #eW58/ 68/t $ug6;/ 7;/z #eW5(\ 6(\T "UG43/ 53/j *UG<$/ =$/L &8*/ 9*/X "UG4\/ 5\/| 9$ $L  !L "L\ =l l x0./ 1./` x0"A 1"AH ?VH-A .A: 1#A 2#AJ "VH50A 60Ad #fX6GA 7GAR 1%C 2%CP x0#d 1#dJ x0] 1]@  5'2Oh 3Ohb %x8?f 9?fB -x@,f A,f^ &8n 9n> #eW5"k 6"kH  5'2!d 3!dF $ug6m 7m> %w7m 8m> "VH5"d 6"dH "UG4'e 5'eR "UG4j 5j> $vh7f 8f> &9"h :"hH -w?k @k> ,ug>"d ?"dJ #N N #x x #r r #    zGGG% r/   