
    li0                         S SK Jr  S SKJrJr  S SKJr  S SKrS SK	J
r
  S SKrS SKJr  SS1r/ S	Q/ S
QS.rS rS rS rS rS rg)    )db)StudentTableTeacherTable)SelectN)flag_modified)encrypt_passwordxlsxxls)	firstnamelastnameroll_nogradesection)r   r   r   r   )studentteacherc                 n    SU ;   =(       a*    U R                  SS5      S   R                  5       [        ;   $ )N.   )rsplitlowerALLOWED_EXTENSIONS)filenames    >D:\beyond school\05_solvesmart\server\src\utils\upload_file.pyallowed_filer      s0    (?WxsA6q9??AEWWW    c           
         US:X  a  [        [        5      R                  [        R                  U:H  5      n[        R
                  R                  U5      R                  5       R                  5       n/ nU HW  nUR                  UR                  UR                  UR                  UR                  UR                  UR                  S.5        MY     [         R"                  " U5      nO[        [$        5      R                  [$        R                  U:H  5      n[        R
                  R                  U5      R                  5       R                  5       n/ nU Hi  nUR&                   HV  n	UR                  UR                  UR                  U	R)                  S5      U	R)                  S5      UR                  S.5        MX     Mk     [         R"                  " U5      n[*        R,                  " 5       n
[         R.                  " U
SS9 nUR1                  USS	S
9  / SQU R)                  SS5      U R)                  SS5      U R)                  SS5      U R)                  SS5      -   /S.nUS:X  a:  US   R3                  SS5        US   R3                  SU R)                  SS5      5        [         R"                  " U5      nUR1                  USS	S
9  SSS5        U
R5                  S5        U
$ ! , (       d  f       N!= f)z'Generate Excel file with processed datar   )	FirstnameLastnamezRoll NoGradeSectionUsernameclassr   )r   r   r   r    r!   openpyxl)engineDataF)
sheet_nameindex)AddedSkippedTotaladdedr   skipped)MetricCountr   r-   r   Updatedr.   updatedSummaryN)r   r   where	school_idr   sessionexecutescalarsallappendr   r   r   r   r   usernamepd	DataFramer   gradesgetioBytesIOExcelWriterto_excelinsertseek)result	file_typer3   stmtall_recordsdatar   dfr   
grade_infooutputwritersummary_data
summary_dfs                 r   generate_excel_reportrO      sk    Il#)),*@*@I*MNjj((.668<<> "GKK$..#,,"?? "??#,,  # \\$ l#)),*@*@I*MNjj((.668<<> "G%nn
!(!2!2 ' 0 0'^^G4)~~i8 ' 0 0  - # \\$ ZZ\F	z	2f
FvU; 4

7A&

9a(

7A&Iq)AA
 	!"))!Y7!((FJJy!,DE\\,/
FyF' 
3* KKNM- 
3	2s   CK##
K1c                 	   [         R                  " U 5      nUR                   Vs/ s H   o3R                  5       R	                  5       PM"     snUl        [        [        5      R                  [        R                  U:H  5      n[        R                  R                  U5      R                  5       R                  5       n[        U5      S-   n[        S U 5       5      n0 nU Hw  n	[!        U	R"                  5      R	                  5       [!        U	R$                  5      R	                  5       4n
X;  a  [        5       X'   X   R'                  U	R(                  5        My     SnSn/ nUR+                  5        GH9  u  p [!        UR-                  SS5      5      R	                  5       n[!        UR-                  SS5      5      R	                  5       n[!        UR-                  SS5      5      R	                  5       n[!        UR-                  SS5      5      R	                  5       nUR-                  S	5      nU(       a0  U(       a)  U(       a"  U(       a  [         R.                  " U5      (       a   US-  nUR1                  S
US-    S35        GM   [3        U5      nUR                  5       UR                  5       UUU4nUU;   a  US-  nGMP  UU4nUU;   a1  UUU   ;   a(  US-  nUR1                  S
US-    SU SU SU 35        GM  UR                  5        SU U U U 3nUR                  5        U 3n[        UUUUUUUUUUS9
nUR9                  U5        [        R                  R'                  U5        UR'                  U5        UU;  a  [        5       UU'   UU   R'                  U5        US-  nGM<     [        R                  R=                  5         SU SU S3nU(       a&  [        U5      S::  a  USSR?                  U5       3-  nSUUUS.$ s  snf ! [4        [6        4 a"    US-  nUR1                  S
US-    S35         GM  f = f! [:         a4  nUS-  nUR1                  S
US-    S[!        U5       35         SnAGM  SnAff = f)z7Process student Excel file and add students to databaser   c              3   r  #    U  H  nUR                   R                  5       R                  5       UR                  =(       d    S R                  5       R                  5       [	        UR
                  5      R                  5       [	        UR                  5      R                  5       UR                  4v   M     g7f) N)r   r   stripr   strr   r   r   ).0stus     r   	<genexpr>'process_student_file.<locals>.<genexpr>c   s      	  C MM!'')\\R&&(..0		N  """$KK	
  s   B5B7r   r   rR   r   r   r   r   Row    : Missing required fieldsz: Invalid roll numberz: Roll number z already exists in Grade z
, Section _)
r9   r   r   r   r   r   r3   overall_rankingspeed_rankingaccuracy_ranking: NzStudents processed:  added,  skipped   
. Errors: ; T)successmessager+   r,   ) r:   
read_excelcolumnsr   rS   r   r   r2   r3   r   r4   r5   r6   r7   lensetrT   r   r   addr   iterrowsr=   isnar8   int
ValueError	TypeErrorset_password	Exceptioncommitjoin)	file_pathr3   rI   colstmt_all_studentall_studentsranking_startexisting_student_setexisting_roll_nosrV   keyadded_countskipped_counterrorsidxrowr   r   r   r   r   student_keygrade_section_keyr9   default_passwordnew_studenterg   s                               r   process_student_filer   X   si   	y	!B13<#))+##%<BJ l+11,2H2HI2UV::%%&67??AEEGL%)M  	  	 	 399~##%s3;;'7'='='?@'%(U"""3;;/	  KMFKKMH	6CGGK45;;=I377:r2399;H,-335E#'')R01779Gggi(G HEBGGT[L\L\"S1WI-FGHg, ! K 22" "' 0 $55'EVWhEi:i"S1WI^G9D]^c]ddnovnwxy $//+,Ai[	%	RH #,//"3!4WI> '!#!# -+!.K $$%56JJNN;' !$$[1 (997:u!"34/044W=1KK "X JJ$[M-QG#f+"Z		& 1233  	 c =^ 	* "S1WI-BCDn  	6QMMMDq	CF8455	6sO   'P:D	QP.Q8Q>B.Q-Q>QQQ
R(Q??Rc                   ^^ [         R                  " U 5      nUR                   Vs/ s H   oDR                  5       R	                  5       PM"     snUl        [        [        5      R                  [        R                  U:H  5      n[        R                  R                  U5      R                  5       R                  5       n0 nU H`  nUR                  R                  5       R	                  5       UR                  =(       d    SR                  5       R	                  5       4n	XU	'   Mb     Sn
SnSn/ nUR!                  5        GH  u  p [#        UR%                  SS5      5      R	                  5       n[#        UR%                  SS5      5      R	                  5       n[#        UR%                  SS5      5      R	                  5       m[#        UR%                  SS5      5      R	                  5       mU(       a  U(       a  T(       a  T(       d  US-  nUR'                  SUS	-    S
35        M  UR                  5       UR                  5       4nUU;   a  UU   n[)        UU4S jUR*                   5       5      nU(       a  US-  nGM@  UR*                  R'                  TTS.5        [-        US5        [        R                  R/                  U5        US-  nGM  UR                  5        UR                  5        SU 3nUR                  5        UR                  5        3n[        UUUTTS./U[1        U5      US9n[        R                  R/                  U5        UUU'   U
S-  n
GM      [        R                  R5                  5         SU
 SU SU S3nU(       a&  [7        U5      S::  a  USSR9                  U5       3-  nSUU
UUS.$ s  snf ! [2         a4  nUS-  nUR'                  SUS	-    S[#        U5       35         SnAGM  SnAff = f)z>Process teacher Excel file and add/update teachers in databaserR   r   r   r   r   r   r   rY   rZ   r[   c              3      >#    U  H4  nUR                  S 5      T:H  =(       a    UR                  S5      T:H  v   M6     g7f)r"   r   N)r=   )rU   gr   r   s     r   rW   'process_teacher_file.<locals>.<genexpr>   s;      ++ EE'Ne+Ki0@G0KK+s   <?)r"   r   r<   r\   )r   r   r9   r<   r3   passwordstreamr`   NzTeachers processed: ra   z
 updated, rb   rc   rd   re   T)rf   rg   r+   r0   r,   )r:   rh   ri   r   rS   r   r   r2   r3   r   r4   r5   r6   r7   r   r   rm   rT   r=   r8   anyr<   r   rl   r   rs   rt   rj   ru   )rv   r3   r   rI   rw   stmt_all_teachersall_teachersexisting_teachersr   r}   r~   updated_countr   r   r   r   r   r   teacher_keygrade_section_existsr9   r   new_teacherr   rg   r   r   s                            @@r   process_teacher_filer      s   	y	!B13<#))+##%<BJ |,22<3I3IY3VW::%%&78@@BFFHL   &&(..073C3C3Ir2P2P2R2X2X2Z[!(#   KMMFKKM:	6CGGK45;;=I377:r2399;H,-335E#'')R01779G HE"S1WI-FGH$??,hnn.>?K //+K8 (+ +$^^+ ($
 (!Q&M NN))Eg*NO "'84JJNN7+!Q&M (oo/01A0B!I;O&/oo&7%89I8J#K *'%%&+@A'-.>?! 

{+1<!+.q o "| JJ$[M-
S`RaaijG#f+"Z		& 1233    k =T  	6QMMMDq	CF8455	6s3   'OCO&AO AOBO
P(O??Pc                 z    [         R                  " U 5      nUR                   Vs/ s H   o3R                  5       R	                  5       PM"     nn[
        R                  U/ 5      nU Vs/ s H  ofU;  d  M
  UPM     nnU(       a  SSSR                  U5       34$ U Vs/ s H  ofU;  d  M
  UPM     nnU(       a  SSSR                  U5       34$ [        U5      [        U5      :w  a  SS[        U5       S[        U5       S34$ gs  snf s  snf s  snf ! [         a  n	SS	[        U	5       34s S n	A	$ S n	A	ff = f)
NFzMissing required headers: z, zExtra invalid headers found: z Header count mismatch. Expected z headers but found r   )TzHeaders validated successfullyzError reading file: )r:   rh   ri   r   rS   REQUIRED_HEADERSr=   ru   rj   rs   rT   )
rv   rE   rI   rw   file_headersrequired_headershmissing_headersextra_headersr   s
             r   validate_headersr   5  s?   6]]9%79zzBz		))+zB+//	2>&6P&6<:O1&6P6tyy7Q6RSSS$0NLq=M4MLN9$))M:R9STTT|$4 55<SAQ=R<SSfgjkwgxfyyz{{{5! C Q
 O  6,SVH5556s^   $D 'DD )	D6D<D D 	D,D2D 4D D 
D: D5/D:5D:)srcr   
src.modelsr   r   
sqlalchemyr   pandasr:   sqlalchemy.orm.attributesr   r>   src.lib.bcryptr   r   r   r   rO   r   r   r    r   r   <module>r      sU     1   3 	 +e_  H< 
XBJyx^B6r   