
    i(                        d Z ddlmZ ddlZddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZmZmZ dZd	Zd
ZdZddZ G d d      Zy)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    t        |       dz  t        |      dz  z   t        |      z   S )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      L/var/www/pie360backend.cl/public_html/app/backend/classes/app_alert_class.pyscope_reference_idr      s*    {f$s9~'==O@TTT    c                      e Zd ZddZddZ	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZddZdd	Z	dd
d	 	 	 	 	 	 	 ddZ
ddZddZy)AppAlertClassc                    || _         y )N)db)selfr   s     r   __init__zAppAlertClass.__init__   s	    r   c                >   	 t        |      }| j                  j                  t              j	                  t        j
                  dk(  t        j                  |k(        j                         }||j                  yt        |j                        S # t        $ r Y yw xY w)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_coursez#AppAlertClass._school_id_for_course   s    	i.C''--,33K4Q4QUV4VXcXfXfjmXmnttvC{cmm3s}}%% 		s   A8B ;B 	BBc               ,   t        |      t        |      t        |      }}}| j                  j                  t              j	                  t        j
                  |k(  t        j                  |k(  t        j                  |k(        j                  d       y)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_scopez0AppAlertClass.delete_alerts_for_assignment_scope'   sr     ;'Y_9MCj!((""b(  C'&&#-	
 &U&
+r   N)r%   c               ^   t        |      t        |      t        |      }}}t        |      }	| j                  j                  t              j	                  t        j
                  |k(  t        j                  |k(  t        j                  |k(  t        j                  t        k(        j                  d       t        |||      }
| j                  j                  t              j	                  t        j                  t        k(  t        j                  |
k(        j                         }|	dk  r|r| j                  j                  |       y||n| j                  |      }|	dk(  rd}nd|	 d}d	}|	|||d
}|||d<   t!        j"                         }|rNt$        |_        ||_        ||_        t-        j.                  |d      |_        d|_        ||_        |||_        yy| j                  j9                  t        ||||t$        ||t        |
dt-        j.                  |d      ||             y)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   r8   REF_KIND_PDAr-   r   REF_KIND_SCOPEr9   r$   r)   r   nowALERT_TYPE_SCOPE_SUMMARYr5   r6   r7   jsondumpsr;   r:   r=   r%   add)r   r   r   r   r3   r%   r.   r'   r/   nref_idr(   resolved_school_idr7   r6   r;   r@   s                    r   upsert_scope_summaryz"AppAlertClass.upsert_scope_summary6   s    ;'Y_9MCj!((""b(  C'&&#-%%5		

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

5u=CICM"C!- 2 . GGKK0$'! "7##1!'**U?"!$r   c                  | j                   j                          t        |      t        |      t        |      }}}| j                   j                  t              j                  t        j                  |k(  t        j                  |k(  t        j                  |k(  t        j                  dk(        j                         }| j                  ||||       y)uo   Recalcula el resumen según filas pendientes en professional_document_assignments (p.ej. tras subir a carpeta).r   )r   r   r   r3   N)r   flushr   r    r   r!   r   r   r   r:   countrH   )r   r   r   r   r.   r'   r/   rE   s           r   #sync_scope_summary_from_assignmentsz1AppAlertClass.sync_scope_summary_from_assignments   s     	;'Y_9MCGGMM=>V3??2E3==D3CCsJ3==B	 UW 	
 	!!	 	" 	
r   c                ,   	 t        |      }| j                  j                  t              j	                  t        j
                  |k(  t        j                  dk(        j                         }d|dS # t        $ r}dt        |      ddcY d }~S d }~ww xY w)Nr   success)statusrK   error)rO   r7   rK   )
r   r   r    r
   r!   r   r:   rK   r&   str)r   r   r/   rE   es        r   count_unreadz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                    	 t        |      }| j                  j                  t              j	                  t        j
                  |k(        j                         }|dkD  S # t        $ r Y yw xY w)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   rK   r&   )r   r   r/   cs       r   has_any_alert_for_professionalz,AppAlertClass.has_any_alert_for_professional   s_    		o&Cj)
22c9: 
 q5L 		s   AA 	A+*A+d   )r:   limitc               .   	 t        |      }| j                  j                  t              j	                  t        j
                  |k(        }|+|j	                  t        j                  t        |      k(        }|j                  t        j                  j                               j                  t        t        |      d            j                         }g }|D ]s  }d }	|j                  r 	 t        j                  |j                        }	|j"                  r|j"                  j%                         nd }
|j&                  r|j&                  j%                         nd }t        |j                  xs d      }|j)                  i dt        |j                        d|j*                  dt        |j
                        dt        |j,                        dt        |j.                        d|j0                  d	|j2                  d
|j4                  d|j6                  dt        |j8                        d|d|	d|
d|d|
d|dk(  r|nd        v d|dS # t         $ r |j                  }	Y bw xY w# t         $ r}dt;        |      g dcY d }~S d }~ww xY w)Ni  r   r#   r%   r   r   r   r5   r6   r7   r8   r9   r:   r;   r<   r=   
created_atreviewed_atr2   rN   )rO   datarP   )rO   r7   r\   )r   r   r    r
   r!   r   r:   order_byr#   descrX   minallr;   rB   loadsr&   r<   	isoformatr=   appendr%   r   r   r5   r6   r7   r8   r9   rQ   )r   r   r:   rX   r/   qrowsr\   r	extra_objaddedupdstrR   s                 r   list_alertszAppAlertClass.list_alerts   s{   (	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   C*I2 -IE	I2 I/+I2 .I//I2 2	J;J	JJc                    	 t        |      }| j                  j                  t              j	                  t        j
                  t        |      k(  t        j                  |k(        j                         }|sdddS t        |j                  xs d      dk(  rdddS d|_        t        j                         |_        | j                  j                          dddS # t        $ r}dt        |      dcY d	}~S d	}~ww xY w)
zBMarca una alerta como revisada (solo si pertenece al profesional).rP   zAlerta no encontrada.rO   r7   r   r2   rN   zYa estaba revisada.zActualizado.N)r   r   r    r
   r!   r#   r   r$   r:   r   r@   r=   rJ   r&   rQ   )r   alert_idr   r/   r(   rR   s         r   mark_reviewedz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*   A9C < C >C 	C=%C82C=8C=c                   	 t        |      }t        j                         }| j                  j	                  t
              j                  t
        j                  |k(  t
        j                  dk(        j                         }|D ]  }d|_        ||_
         | j                  j                          dt        |      dS # t        $ r}dt        |      dcY d}~S d}~ww xY w)zRMarca todas las alertas no revisadas del profesional (p. ej. al abrir la campana).r   r2   rN   )rO   updatedrP   rm   N)r   r   r@   r   r    r
   r!   r   r:   r`   r=   rJ   lenr&   rQ   )r   r   r/   r@   re   r(   rR   s          r   "mark_all_reviewed_for_professionalz0AppAlertClass.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   returnOptional[int])r   r   r   r   r   r   rt   None)r   r   r   r   r   r   r3   r   r%   ru   rt   rv   )r   r   rt   Dict[str, Any])r   r   rt   bool)r   r   r:   ru   rX   r   rt   rw   )rn   r   r   r   rt   rw   )__name__
__module____qualname__r   r)   r0   rH   rL   rS   rV   rk   ro   rs    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   rt   r   )__doc__
__future__r   rB   r   typingr   r   r   r   sqlalchemy.ormr	   app.backend.db.modelsr
   r   r   r>   r?   ALERT_TYPE_DOCUMENT_PENDINGrA   r   r   r|   r   r   <module>r      sH    Q "   , , " ^ ^1#; 9 U
t: t:r   