
    hu>                         U d dl m Z mZ d dlmZ d dlmZmZ d dlmZ d dl	Z
d dlmc mc mZ d dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ d dlm Z  dZ!e"ed   df   e#d<    G d d      Z$y)    )datetime	timedelta)Literal)HTTPException
UploadFile)OAuth2PasswordRequestFormN)Session)
JWTManagerJWTPayloadSchema)Messages)TblGroup)StudentBase
TblStudent)generate_secure_password)
send_email)CustomResponse)studentadmin
superadmin.VALID_ROLESc                       e Zd ZdedefdZdej                  fdZde	fdZ
de	fdZde	fd	Zdej                  fd
Zededefd       Zd ZdefdZdefdZd Zy)StudentServicedbtokenc                      || _         || _        y N)r   r   )selfr   r   s      2/var/www/html/RetailAPI/app/api/student/service.py__init__zStudentService.__init__   s    
    requestc                    K   t        j                  |      }t        j                  || j                         | j                  j                          t        dt        j                        S w)N1statusmessage)	r   model_validater   creater   commitr   r   STUDENT_CREAT)r   r!   created_students      r   create_studentzStudentService.create_student   sK     %44W=/4773S(2H2HIIs   A+A-
student_idc                    K   t        j                  || j                        }t        j                  j                  |      S wr   )r   	get_by_idr   schemasStudentResponser'   r   r-   r   s      r   get_studentzStudentService.get_student   s3     &&z477;&&55g>>s   A Ac                    K   t        j                  || j                        }|st        dt        j
                        t        j                  j                  |d      S wN  status_codedetailT)from_attributes)	r   r/   r   r   r   STUDENT_NOT_FOUNDr0   r1   r'   r2   s      r   get_student_getzStudentService.get_student_get#   sN     %%j$'':C8R8RSS&&55gt5TTs   AA!c                 (  K   t        j                  || j                        }|st        dt        j
                        |j                  st        dt        j                        t        j                  j                  |j                  d      S wr5   )r   r/   r   r   r   r;   groupGROUP_NOT_ASSIGNEDr0   GroupResponser'   r2   s      r   get_student_groupz StudentService.get_student_group)   sm     &&z477;C8R8RSS}}C8S8STT$$33GMMSW3XXs   BBc                 B  K   t        j                  |      }|j                  t        dt        j
                        S t        j                  |j                  || j                         | j                  j                          t        dt        j                        S w)N-1r$   r#   )r   r'   r-   r   r   SEGMENT_NOT_FOUNDr   updater   r)   STUDENT_UPDATE)r   r!   updated_students      r   update_studentzStudentService.update_student1   sr     %44W=%%-!x7Q7QRR/44_dggNS(2I2IJJs   BBcredentialsc           	        K   |j                  t              j                  t        j                  | j                  k(        j                         }|st        dt        j                        | j                  |j                  k7  rt        dt        j                        |j                  r|j                  t              j                  t        j                  |j                  k(  t        j                  dk(  t        j                  |j                  k7        j                         }|rt        dd|j                   d      d|_        |j                          t!        |j                  ddt#        j$                         t'        d	
      z         }t)        j*                  |      }|j,                  r|j,                  j.                  nd }|d|j                  d|j                  |dS w)Nr6   r7   i  r#   i  z	Student 'z'' from your group is already logged in.r      )minutes)r-   	user_type	user_roleexpbearer)access_token
token_typeemail_idroler-   group_id)queryr   filterstudent_emailusernamefirstr   r   r;   passwordINCORRECT_PASSWORD
group_codelogin_statusr-   
first_namer)   r   r   utcnowr   r
   create_access_tokenr>   rU   )rI   r   r   activepayloadrQ   rU   s          r   student_loginzStudentService.student_login9   s    ((:&--j.F.F+J^J^.^_eegC8R8RSS7#3#33C8S8STTXXj)00%%););;''3.%%););; eg	 
 # #&v'8'8&99`a   #
		"))!Ib$99	
 "55g>-4]]7==))("-- ++!
 	
s   G(G*c                 ,   | j                   j                  t        dt        j                        | j
                  j                  t              j                  t        j                  | j                   j                  k(        j                         }|st        dt        j                        |j                  dk7  rt        dt        j                        d|_        | j
                  j                          t        dt        j                        S )Ni  r7   r6   r#   i  0r$   )r   r-   r   r   STUDENT_ID_REQUIEDr   rV   r   rW   rZ   CATCHMENT_NOT_FOUNDr^   STUDENT_NOT_LOGINr)   r   STUDENT_LOGOUT)r   r   s     r   student_logoutzStudentService.student_logout_   s    ::  (C8S8STT''--
+22:3H3HDJJLaLa3aciikC8T8TUU3&C8R8RSS"S(2I2IJJr    filec                 |	  K   	 |j                   j                  d       t        j                  |j                   dd       }g d}d }|j	                         D ]R  \  }}|D cg c]9  }t        |      j                         j                         j                  dd      ; }}||k(  sP|} n |.dd||j                  d	      j                  j                         d
S |j                   j                  d       t        j                  |j                   d|      }|j                  j
                  j                         j
                  j                         j
                  j                  dd      |_        |j                  t        j                  |      d       }d|j                  v r|j                  dgd       i }	|j	                         D ]:  \  }
}|j!                  d      }|s|	j#                  |g       j%                  |       < g }g }|	j'                         D ]B  \  }}|d   }t)        |      }| j*                  j-                  t.              j1                  |      j3                         }|s|d   rt5        |d         n|}t/        ||d   |d   |d   ||j!                  d            }| j*                  j7                  |       | j*                  j9                          | j*                  j;                  |       n|j<                  xs d}||k  r|j%                  d| d| d| d       ||kD  r ||z
  }|j%                  d| d| d| d       d}|j<                  r|j<                  dk(  r	||_        d}dD ]9  }|j!                  |      st?        ||      ||   k7  s(tA        ||||          d}; |r| j*                  j9                          |D ]  }| j*                  j-                  tB              j1                  |d          j3                         rDtE               }tC        |d!   |d"   |d   |d#|$      }| j*                  j7                  |        E | j*                  j9                          |rd%d&||d'S d(d)|d*S c c}w # tF        $ r}tI        d+d,t        |       -      d }~ww xY ww).Nr   openpyxl)engineheader)	r_   	last_namerX   r]   simulation_code
group_namegroup_emailnumber_of_memberscategory_assigned _rC   z&Missing required headers in Excel file   )r%   errorexpected_headerssample_rowsr[   T)columnsinplacer]   )r]   ru   rr   rs   rt   rv   )r]   rr   rs   rt   ru   rv   zGroup z: You can only add z  students, but you tried to add .z: You added z students, but z spots are still available.F)rs   rt   rr   rv   rX   rX   r_   rq   r   )r_   rq   rX   r[   rT   r]   rf   zMSome groups were not uploaded due to exceeding the allowed number of members.)r%   r&   errorswarningsr#   zUpload successful)r%   r&   r     zUpload failed: r7   )%rl   seekpd
read_exceliterrowsstrstriplowerreplaceheadvaluestolistr}   wherenotnulldropget
setdefaultappenditemslenr   rV   r   	filter_byrZ   intaddr)   refreshru   getattrsetattrr   r   	Exceptionr   )r   rl   dfr{   header_row_indexirowcol
normalizedgroup_student_maprx   r]   error_messageswarning_messagesstudentsrZ   student_countr>   ru   	remainingupdatedfieldpassword_plainr   es                            r   upload_students_from_excelz)StudentService.upload_students_from_excelk   s    y	TIINN1tyyDIB   $++-3TWXTWSc#hnn.446>>sCHTW
X!11'($	 (  '"E(8#%771:#4#4#;#;#=	  IINN1tyyDTUB--/3399;??GGSQBJ"**R.$/BRZZ'd; "++-3 WW\2
%00R@GGL (
  N!(9(?(?(A$
H  #Hh/99Z9PVVXKPQdKeE2E,F(Gkx%$#-(-.?(@#(#6$)-$8*;*/))4G*HE GGKK&GGNN$GGOOE*(-(?(?(D1% )=8&--$ZL0CDUCVVv  xE  wF  FG  H !*]:$5$E	(//$ZL]O?[dZe  fA  B
 $G 22e6M6MQR6R2?/"&!f 99U+u0Eu0U#E5%,?&*G "g (#Cww}}Z0::_I]:^ddf %=%?N(#&|#4"%k"2&)/&:!/&#-G GGKK( $_ )B| GGNN!n, 0	  ., M YX  	TC/#a&8RSS	Tsn   R<AR !>RR '4R R<D
R 'F/R R *CR R<R R<R 	R9R44R99R<rX   c                    | j                   j                  t              j                  |      j	                         }|st        dd      d}d|j                   d|j                   d}t        |||	      }|st        d
d      dddS )Nr   r6   zStudent not foundr7   Your Student Portal PasswordHello ,

Your password is: 

Please keep it secure.tosubjectbodyr   zFailed to send emailr#   zPassword sent to emailr$   )	r   rV   r   r   rZ   r   r_   r[   r   )r   rX   r   r   r   successs         r   send_password_to_emailz%StudentService.send_password_to_email   s    ''--
+55M5RXXZC8KLL0**++B7CSCSBTTnowTJC8NOO*BCCr    c                 P   | j                   j                  t              j                         }|st	        dd      g }|D ]W  }d}d|j
                   d|j                   d}t        |j                  ||      }|r=|j                  |j                         Y |rd	d
|dS dddS )Nr6   zNo students foundr7   r   r   r   r   r   rf   zSome emails failed to send)r%   r&   failed_emailsr#   z$Passwords sent to all student emailsr$   )
r   rV   r   allr   r_   r[   r   rX   r   )r   r   failuresr   r   r   r   s          r   send_passwords_to_all_studentsz-StudentService.send_passwords_to_all_students   s    77==,002C8KLLG4GG..//FwGWGWFXXrsD G$9$97QUVG 5 56   7!) 
 *PQQr    N)__name__
__module____qualname__r	   r   r   r0   StudentCreater,   r   r3   r<   rA   StudentUpdaterH   staticmethodr   rd   rk   r   r   r   r   r    r    r   r   r      s    7 )9 JG,A,A J?S ?U UY# YKG,A,A K "
)B "
 "
 "
J
KzTZ zTz	DC 	DRr    r   )%r   r   typingr   fastapir   r   fastapi.securityr   pandasr   app.api.student.schemasapir   r0   sqlalchemy.ormr	   app.dependency.authanticationr
   r   app.locale.messagesr   app.models.main.groupr   app.models.main.studentr   r   app.utils.common_utilsr   app.utils.emailr   app.utils.schemas_utilsr   r   tuple__annotations__r   r   r    r   <module>r      sb    ( (  - 6  ) ) " F ( * ; ; & 2FU7;<cAB pR pRr    