
    &6j?                     J   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
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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!J"r"  S SK#J$r$  \" SS/S9r%S\S\\&   S\\&   4S jr'\%RQ                  S5      \" SSSSS9\" \$5      \" \5      4S\S\\&   S\S\4S jj5       r)\%RU                  S 5      S\" SSSSS9\" SS!S"9\" \$5      \" \5      4S#\&S\\&   S$\\&   S\S\4
S% jj5       r+S\S\\&   4S& jr,\%RQ                  S'5      \" SSSS(S9\" \$5      \" \5      4S\\&   S\S\4S) jj5       r-\%RQ                  S*5      \" SSSSS9\" \$5      \" \5      4S\S\\&   S\S\4S+ jj5       r.\%RU                  S,5      \" SSSSS9\" \$5      \" \5      4S-\&S\\&   S\S\4S. jj5       r/\%Ra                  S/5      \" \$5      \" \5      4S-\&S\S\S\4S0 jj5       r1\%Re                  S15      \" \$5      \" \5      4S-\&S\S\4S2 jj5       r2g)3    )datetime)Optional)	APIRouterDependsQuerystatus)JSONResponse)get_db)Session)	UserLogin
CourseListStoreCourseUpdateCourse)CourseClass)InspectionApiClient)SchoolClass)_normalize_school_id)or_)CourseModelProfessionalModelProfessionalTeachingCourseModelSchoolModel	UserModel)get_current_active_userz/coursesCourses)prefixtagscourseperiod_year_queryreturnc                 &    Ub  U$ [        U SS5      $ )z<Prioriza query (interceptor/cookie); si no, body CourseList.Nperiod_year)getattr)r   r   s     LC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\routes\courses.py_course_period_yearr%      s    $  6=$//    /Ni  i4  u   Año período escolar)geledescriptionr"   session_userdbc                 
   U(       a  UR                   OS nU(       a  UR                  OS nU(       aX  U(       dQ  [        U5      R                  SUS9n[	        U[
        5      (       a#  [        U5      S:  a  US   R                  S5      n/ nUR                  (       Ga  U(       Ga  UR                  [        5      R                  [        R                  UR                  :H  [        [        R                  S:H  [        R                  R                  S 5      5      5      R                  5       nU(       Ga  UR                  [         R"                  5      R                  [         R$                  UR"                  :H  5      R'                  [         R"                  R)                  5       5      R                  5       n	U	(       a  [+        U	S   5      OS n
U
bp  UR                  [,        5      R                  [,        R.                  U
:H  [,        R                  S:H  5      R1                  5       nU Vs/ s H  oR2                  PM     nn[5        X5      nU(       Ga[  U R6                  c  SOU R6                  n[9        U5      R                  UU R:                  S US9n[	        U[
        5      (       aE  U Vs/ s H  nUR                  S5      U;   d  M  UPM     nn[=        [>        R@                  SSUS.S9$ [	        U[B        5      (       a  S	U;   a  US	    Vs/ s H  nUR                  S5      PM     nnUS	    Vs/ s H  nUR                  S5      U;   d  M  UPM     nn[=        [>        R@                  SS[        U5      [        U5      S:  a  S
OSUR                  SS
5      U R:                  US.S.S9$ Uci  U R6                  c  SOSn[=        [>        R@                  SUU R6                  c  / O.SSU R6                  (       a  U R6                  OS
U R:                  / S.S.S9$ U R6                  c  SOU R6                  n[9        U5      R                  UU R:                  U RD                  U RF                  UUS9n[	        U[B        5      (       aA  UR                  S5      S:X  a,  [=        [>        RH                  SUR                  SS5      S S.S9$ U R6                  c  SOSn[=        [>        R@                  SUUS.S9$ s  snf s  snf s  snf s  snf )Nr   pagecustomer_idid)r/   items_per_page	school_idr"      zCourses retrieved successfullyr   messagedatastatus_codecontentr7      current_page)total_itemstotal_pagesr<   r2   r7   z,Complete courses list retrieved successfully)r/   r2   r   teaching_idr3   r"   r   error  r6   Error)%r0   r3   r   get_all
isinstancelistlengetrutqueryr   filterr   deleted_status_idis_firstr   r1   user_idorder_bydescintr   professional_idall	course_idr%   r/   r   per_pager	   r   HTTP_200_OKdictcourse_namer?   HTTP_404_NOT_FOUND)r   r"   r+   r,   r0   r3   schools_listprofessional_course_idsuser_rowprof_pkpidptc_recordsptcpy
page_valueall_coursesccourse_dataavailable_course_idsr6   results                        r$   indexrh   #   sf    /;,**K*6&&DI9"2..A;.OlD))c,.?!.C$Q++D1I !IHHYV!1!11I//14i6Q6Q6U6UVZ6[\ UW 	 *--.)11X[[@A+..3356	  &-#gaj/$C hh'FGNN3CCsJ3EEJ #%  EP*PKS==K'*P	V	1B  ++-Q6;;
!"o--!??	 . 
 k4((&1\kQUU4[D[5[1kK\"..!?'  T**v/D9DV9L#M9LAAEE$K9L #M&1&&9d&9QUU4[Lc=c1&9Kd"..!?'*;'7,/,<q,@qa(3(J*0// +
   DJKKDW@]}**"$kk1#$#$39;;FKKA&,oo8

 	
 kk)v{{J_$$!!&& % F &$FJJx$8G$C11!::i9
 	
 AG@S<YyG&&
 i +Q" ] $Nds$   )S3,S8	S8S=3TTz/listur   Colegio explícito (p. ej. estudiante). Debe pertenecer al customer de la sesión, o sesión sin customer (admin).)r*   r?   r3   c                    U(       a  UR                   OS nU(       a  UR                  OS nUb  UR                  [        5      R	                  [        R
                  [        U5      :H  [        R                  S:H  5      R                  5       nU(       a7  [        USS 5      nUb  Ub$  [        U5      [        U5      :X  a  UR
                  nUcX  U(       aQ  [        U5      R                  SUS9n	[        U	[        5      (       a#  [        U	5      S:  a  U	S   R                  S5      nUc  [!        ["        R$                  SS/ S.S9$ ['        U5      R)                  X`US	9n
[        U
[*        5      (       aA  U
R                  S
5      S:X  a,  [!        ["        R,                  SU
R                  SS5      S S.S9$ [!        ["        R$                  SSU
S.S9$ )Nr   r0   r.   r1   r4   z#Courses list retrieved successfullyr5   r8   )r3   r?   r"   r   r@   rA   r6   rB   )r0   r3   rI   r   rJ   r1   rQ   rK   rM   r#   r   rC   rD   rE   rF   rG   r	   r   rV   r   get_all_listrW   rY   )r?   r"   r3   r+   r,   r0   effective_school_idschcustrZ   rg   s              r$   rj   rj      s    /;,**K4@,00d HH[!VKNNc)n4k6S6SWX6XYUW 	
 3t4D"t'7CI[IY<Y&)ff#"{"2..A;.OlD))c,.?!.C".q/"5"5d";"**@
 	
 _))%K * F &$FJJx$8G$C11!::i9
 	
 &&<
 r&   c                 *   U (       a  U R                   OS nU (       a  U R                  OS nU(       aX  U(       dQ  [        U5      R                  SUS9n[	        U[
        5      (       a#  [        U5      S:  a  US   R                  S5      n[        U5      $ )Nr   r.   r1   )	r0   r3   r   rC   rD   rE   rF   rG   r   )r+   r,   r0   r3   rZ   s        r$   _resolve_session_school_idro      sv    .:,**K*6&&DI9"2..A;.OlD))c,.?!.C$Q++D1I	**r&   z/import_from_inspectionu*   Año escolar para Inspection y period_yearc                 L   [        X5      nUc  [        [        R                  SSS S.S9$ [	        5       nUR                  5       (       d  [        [        R                  SSS S.S9$ U b  [        U 5      O[        R                  " 5       R                  nUR                  X5S9nUR                  S5      (       d4  [        [        R                  S	UR                  S
5      =(       d    SUS.S9$ [        U5      R                  X6U5      n[!        U["        5      (       aA  UR                  S5      S:X  a,  [        [        R$                  SUR                  S
S5      S S.S9$ UR                  SS5      nUR                  SS5      n	SU SU	 S3n
[        [        R&                  SU
US.S9$ )Ni  u:   No se pudo determinar el colegio (school_id) de la sesiónr5   r8   i  zQInspection API not configured (INSPECTION_API_USERNAME / INSPECTION_API_PASSWORD))
colegio_idaniooki  r6   z(Error al obtener cursos desde Inspectionr   r@     zError al importar cursosimportedr   skippedu#   Importación de cursos finalizada: z	 nuevos, z# omitidos (duplicados o sin datos).r4   )ro   r	   r   HTTP_400_BAD_REQUESTr   is_configuredHTTP_503_SERVICE_UNAVAILABLErQ   r   nowyearfetch_courses_listrG   HTTP_502_BAD_GATEWAYr   import_from_inspectionrD   rW   HTTP_500_INTERNAL_SERVER_ERRORrV   )r"   r+   r,   r3   clientrr   remoterg   ru   rv   msgs              r$   r~   r~      s    +<<I33W
 	
 !"F!!;;n
 	
  +63{HLLN<O<OD&&)&GF::d33!::i0^4^
 	
 _33ItLF&$FJJx$8G$C==!::i1KL
 	
 zz*a(HjjA&G/z7)Kn
oC&&
 r&   z/storec                    [        U S5      (       a  U R                  5       OU R                  5       nUb  XS'   OUR                  S5      c   U(       a  UR                  OS nS nU(       aQ  [        U5      R                  SUS9n[        U[        5      (       a#  [        U5      S:  a  US   R                  S5      nXdS'   [        U5      R                  U5      n[        U[        5      (       aA  UR                  S5      S:X  a,  [        [        R                  S	UR                  S
S5      S S.S9$ [        [        R                  SSUS.S9$ )N
model_dumpr"   r   r.   r1   r3   r   r@   rt   r6   zError creating courser5   r8      zCourse created successfully)hasattrr   rW   rG   r0   r   rC   rD   rE   rF   r   storer	   r   r   HTTP_201_CREATED)	r   r"   r+   r,   course_inputsr0   r3   rZ   rg   s	            r$   r   r   4  s8    ,36<+H+HF%%'fkkmM'2m$			=	)	1 /;,**KI"2..A;.OlD))c,.?!.C$Q++D1I "++_""=1F&$FJJx$8G$C==!::i1HI
 	
 ++4
 r&   z
/edit/{id}r1   c                 v   [        U5      R                  X5      n[        U[        5      (       ao  UR                  S5      (       d  UR                  S5      S:X  aD  [	        [
        R                  SUR                  S5      =(       d    UR                  SS5      S S.S9$ [	        [
        R                  SS	US.S9$ )
Nr@   r   rA   r6   Course not foundr5   r8   r4   zCourse retrieved successfully)r   rG   rD   rW   r	   r   rY   rV   )r1   r"   r+   r,   rg   s        r$   editr   a  s     _  1F&$VZZ%8%8FJJx<PT[<[11!::g.[&**YHZ2[
 	
 &&6
 r&   z/update/{id}c                 *   UR                  SS9nU(       a  UR                  OS nS nU(       aQ  [        U5      R                  SUS9n[	        U[
        5      (       a#  [        U5      S:  a  US   R                  S5      nSU;  a  XdS'   [        U5      R                  X5      n[	        U[         5      (       aA  UR                  S5      S:X  a,  [        [        R                  S	UR                  S
S5      S S.S9$ [        [        R                  SSUS.S9$ )NT)exclude_unsetr   r.   r1   r3   r   r@   rt   r6   zError updating courser5   r8   r4   zCourse updated successfully)rW   r0   r   rC   rD   rE   rF   rG   r   updater	   r   r   rV   )	r1   r   r+   r,   r   r0   r3   rZ   rg   s	            r$   r   r   }  s
   KKdK3M /;,**KI"2..A;.OlD))c,.?!.C$Q++D1I -'%.k"_##B6F&$FJJx$8G$C==!::i1HI
 	
 &&4
 r&   z/delete/{id}c                    [        U5      R                  U 5      n[        U[        5      (       aA  UR	                  S5      S:X  a,  [        [        R                  SUR	                  SS5      S S.S9$ [        [        R                  SS	US.S9$ )
Nr   r@   rA   r6   r   r5   r8   r4   zCourse deleted successfully)	r   deleterD   rW   rG   r	   r   rY   rV   )r1   r+   r,   rg   s       r$   r   r     s    _##B'F&$FJJx$8G$C11!::i1CD
 	
 &&4
 r&   )3r   typingr   fastapir   r   r   r   fastapi.responsesr	   app.backend.db.databaser
   sqlalchemy.ormr   app.backend.schemasr   r   r   r    app.backend.classes.course_classr   )app.backend.classes.inspection_api_clientr    app.backend.classes.school_classr   "app.backend.classes.teaching_classr   
sqlalchemyr   app.backend.db.modelsr   r   r   r   r   app.backend.auth.auth_userr   coursesrQ   r%   postrh   rG   rj   ro   r~   r   r   putr   r    r&   r$   <module>r      sE     5 5 * * " P P 8 I 8 C   ?


0
 0x} 0QYZ]Q^ 0 	c "'tKb!c%&=>&/	CC#C C 		C CJ 	W!&tKb!c$ I  &&=>&/==#= }= = 	= =@+ +Xc] + 	'(!&tKw!x%&=>&/<#<< 	< )<~ 	h "'tKb!c%&=>&/	**#* * 		* *X 	\ "'tKb!c%&=>&/	#  		 6 	^DKLcDdt{  }C  uD "s "L "	 "jq " "H 	.56M.N^efl^m s ) T[   r&   