
    &6j(                        S r SSKJr  SSK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JrJr  SrS	rS
rSrSS jr " S S5      rg)zKCRUD y reglas para la tabla `alerts` (campana / notificaciones revisables).    )annotationsN)datetime)AnyDictListOptional)Session)
AlertModelCourseModel#ProfessionalDocumentAssignmentModel professional_document_assignmentassignment_scopedocument_assignment_pendingdocument_assignments_pendingc                T    [        U 5      S-  [        U5      S-  -   [        U5      -   $ )u`   ID estable y único por (año escolar, curso, profesional) para una sola fila de alerta resumen.l    J)i@B )int)period_year	course_idprofessional_ids      UC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\app_alert_class.pyscope_reference_idr      s*    {f$s9~'==O@TTT    c                      \ rS rSrSS jrSS jr        SS jrSS.           SS jjr        SS jrSS	 jr	SS
 jr
SSS.       SS jjrSS jrSS jrSrg)AppAlertClass   c                    Xl         g )Ndb)selfr   s     r   __init__AppAlertClass.__init__   s    r   c                D    [        U5      nU R                  R                  [        5      R	                  [        R
                  S:H  [        R                  U:H  5      R                  5       nUb  UR                  c  g[        UR                  5      $ ! [         a     gf = f)z<Obtiene school_id desde `courses` si no viene en el request.r   N)
r   r   queryr   filterdeleted_status_ididfirst	school_id	Exception)r   r   cidrows       r   _school_id_for_course#AppAlertClass._school_id_for_course   s    	i.C''--,33K4Q4QUV4VXcXfXfjmXmnttvC{cmm3s}}%% 		s   A:B =B 
BBc               $   [        U5      [        U5      [        U5      penU R                  R                  [        5      R	                  [        R
                  U:H  [        R                  U:H  [        R                  U:H  5      R                  SS9  g)uV   Quita todas las alertas de ese curso/período/profesional (resumen y legado por fila).Fsynchronize_sessionN)	r   r   r#   r
   r$   r   r   r   delete)r   r   r   r   pyr*   pids          r   "delete_alerts_for_assignment_scope0AppAlertClass.delete_alerts_for_assignment_scope'   sp     ;'Y_9Mj!((""b(  C'&&#-	
 &U&
+r   N)r(   c               ^   [        U5      [        U5      [        U5      pn[        U5      n	U R                  R                  [        5      R	                  [        R
                  U:H  [        R                  U:H  [        R                  U:H  [        R                  [        :H  5      R                  SS9  [        XgU5      n
U R                  R                  [        5      R	                  [        R                  [        :H  [        R                  U
:H  5      R                  5       nU	S::  a#  U(       a  U R                  R                  U5        gUb  UOU R                  U5      nU	S:X  a  SnOSU	 S3nS	nU	UUUS
.nUb  XS'   [         R"                  " 5       nU(       aJ  [$        Ul        Xl        Xl        [,        R.                  " USS9Ul        SUl        UUl        Ub  Xl        ggU R                  R9                  [        UUUU[$        UU[        U
S[,        R.                  " USS9UUS95        g)uY   Una sola alerta por (período, curso, profesional) con el total de documentos pendientes.Fr/   r   N   zKTienes 1 documento asignado pendiente de subir a la carpeta del estudiante.zTienes zF documentos asignados pendientes de subir a la carpeta del estudiante.z Documentos pendientes por cargar)pending_countr   r   r   r(   )ensure_ascii)r(   r   r   r   
alert_typetitlemessagereference_kindreference_id	status_idextra
added_dateupdated_date)r   r   r#   r
   r$   r   r   r   r=   REF_KIND_PDAr1   r   REF_KIND_SCOPEr>   r'   r,   r   nowALERT_TYPE_SCOPE_SUMMARYr:   r;   r<   jsondumpsr@   r?   rB   r(   add)r   r   r   r   r8   r(   r2   r*   r3   nref_idr+   resolved_school_idr<   r;   r@   rE   s                    r   upsert_scope_summary"AppAlertClass.upsert_scope_summary6   s    ;'Y_9Mj!((""b(  C'&&#-%%5		

 &U&
+#BS1GGMM*%V))^;''61 UW 	 6s#*3*?YTE_E_`cEd6cGs"hiG2"	
 )!3+lln5CNI!K

5u=CICM"C!- 2 . GGKK0$'! "7##1!'**U?"!$r   c                  U R                   R                  5         [        U5      [        U5      [        U5      penU R                   R                  [        5      R                  [        R                  U:H  [        R                  U:H  [        R                  U:H  [        R                  S:H  5      R                  5       nU R                  UUUUS9  g)uo   Recalcula el resumen según filas pendientes en professional_document_assignments (p.ej. tras subir a carpeta).r   )r   r   r   r8   N)r   flushr   r#   r   r$   r   r   r   r?   countrM   )r   r   r   r   r2   r*   r3   rJ   s           r   #sync_scope_summary_from_assignments1AppAlertClass.sync_scope_summary_from_assignments   s     	;'Y_9MGGMM=>V3??2E3==D3CCsJ3==B	 UW 	
 	!!	 	" 	
r   c                .    [        U5      nU R                  R                  [        5      R	                  [        R
                  U:H  [        R                  S:H  5      R                  5       nSUS.$ ! [         a  nS[        U5      SS.s S nA$ S nAff = f)Nr   success)statusrQ   error)rV   r<   rQ   )
r   r   r#   r
   r$   r   r?   rQ   r)   str)r   r   r3   rJ   es        r   count_unreadAppAlertClass.count_unread   s    		Fo&Cj)
22c9:;O;OST;TU 
 (!44 	F%#a&1EE	Fs   A.A1 1
B;B	BBc                     [        U5      nU R                  R                  [        5      R	                  [        R
                  U:H  5      R                  5       nUS:  $ ! [         a     gf = f)uV   True si ya existe al menos una alerta para el profesional (migración / uso de tabla).r   F)r   r   r#   r
   r$   r   rQ   r)   )r   r   r3   cs       r   has_any_alert_for_professional,AppAlertClass.has_any_alert_for_professional   s_    		o&Cj)
22c9: 
 q5L 		s   AA 
A,+A,d   )r?   limitc               d    [        U5      nU R                  R                  [        5      R	                  [        R
                  U:H  5      nUb+  UR	                  [        R                  [        U5      :H  5      nUR                  [        R                  R                  5       5      R                  [        [        U5      S5      5      R                  5       n/ nU GH  nS n	UR                  (       a!   [        R                  " UR                  5      n	UR"                  (       a  UR"                  R%                  5       OS n
UR&                  (       a  UR&                  R%                  5       OS n[        UR                  =(       d    S5      nUR)                  0 S[        UR                  5      _SUR*                  _S[        UR
                  5      _S[        UR,                  5      _S[        UR.                  5      _SUR0                  _S	UR2                  _S
UR4                  _SUR6                  _S[        UR8                  5      _SU_SU	_SU
_SU_SU
_SUS:X  a  UOS _5        GM     SUS.$ ! [          a    UR                  n	 GNuf = f! [          a  nS[;        U5      / S.s S nA$ S nAff = f)Ni  r   r&   r(   r   r   r   r:   r;   r<   r=   r>   r?   r@   rA   rB   
created_atreviewed_atr7   rU   )rV   datarW   )rV   r<   re   )r   r   r#   r
   r$   r   r?   order_byr&   descra   minallr@   rG   loadsr)   rA   	isoformatrB   appendr(   r   r   r:   r;   r<   r=   r>   rX   )r   r   r?   ra   r3   qrowsre   r	extra_objaddedupdstrY   s                 r   list_alertsAppAlertClass.list_alerts   sv   (	Fo&Cj)001K1Ks1RSA$HHZ11S^CD::jmm002399#c%j#:NOSSUD)+D!%	77,$(JJqww$7	 56LL..0d45NNann..0)*c!$$i#Q[[ *3q/@/@+A $S%5	
 &s1=='9 %all   "199 )!*:*: 'ANN(; $R   %e '  %e!" &bAgs4# > (665 % ,$%GG	,6  	F%#a&"EE	FsC   C0J 3 I/EJ /J	J J		J 
J/J*$J/*J/c                    [        U5      nU R                  R                  [        5      R	                  [        R
                  [        U5      :H  [        R                  U:H  5      R                  5       nU(       d  SSS.$ [        UR                  =(       d    S5      S:X  a  SSS.$ SUl        [        R                  " 5       Ul        U R                  R                  5         SSS.$ ! [         a  nS[        U5      S.s S	nA$ S	nAff = f)
zBMarca una alerta como revisada (solo si pertenece al profesional).rW   zAlerta no encontrada.rV   r<   r   r7   rU   zYa estaba revisada.zActualizado.N)r   r   r#   r
   r$   r&   r   r'   r?   r   rE   rB   rP   r)   rX   )r   alert_idr   r3   r+   rY   s         r   mark_reviewedAppAlertClass.mark_reviewed   s    	:o&Cj)
X6
8R8RVY8YZ 
 ")6MNN3==%A&!+"+8MNNCM'||~CGGMMO'NCC 	:%#a&99	:s*   A>C( &C( (?C( (
D
2D?D
D
c                    [        U5      n[        R                  " 5       nU R                  R	                  [
        5      R                  [
        R                  U:H  [
        R                  S:H  5      R                  5       nU H  nSUl        X5l
        M     U R                  R                  5         S[        U5      S.$ ! [         a  nS[        U5      S.s SnA$ SnAff = f)zRMarca todas las alertas no revisadas del profesional (p. ej. al abrir la campana).r   r7   rU   )rV   updatedrW   rw   N)r   r   rE   r   r#   r
   r$   r   r?   ri   rB   rP   lenr)   rX   )r   r   r3   rE   rn   r+   rY   s          r   "mark_all_reviewed_for_professional0AppAlertClass.mark_all_reviewed_for_professional   s    	:o&C,,.Cj)
22c9:;O;OST;TU 
  !#&   GGMMO'CI>> 	:%#a&99	:s   B<B? ?
C!	CC!C!r   )r   r	   )r   r   returnOptional[int])r   r   r   r   r   r   r   None)r   r   r   r   r   r   r8   r   r(   r   r   r   )r   r   r   Dict[str, Any])r   r   r   bool)r   r   r?   r   ra   r   r   r   )rx   r   r   r   r   r   )__name__
__module____qualname____firstlineno__r    r,   r4   rM   rR   rZ   r^   rt   ry   r~   __static_attributes__ r   r   r   r      s   	, , 	,
 , 
,, $(K K 	K
 K K !K 
KZ
 
 	

 
 

6
F" $(/F /F !	/F
 /F 
/Fb:(:r   r   )r   r   r   r   r   r   r   r   )__doc__
__future__r   rG   r   typingr   r   r   r   sqlalchemy.ormr	   app.backend.db.modelsr
   r   r   rC   rD   ALERT_TYPE_DOCUMENT_PENDINGrF   r   r   r   r   r   <module>r      sH    Q "   , , " ^ ^1#; 9 U
t: t:r   