
    U+io3                        d Z ddlmZ ddlmZmZ ddlmZmZmZm	Z	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mZmZ dd	Zdd
Z G d d      Zy)u   
Asignaciones documento–estudiante–profesional–curso por período.
Al subir archivo a carpeta (folders), status_id pasa a 1 si coincide tipo/catálogo.
    )annotations)datetimedate)AnyDictListOptionalTuple)and_or_)Session)AppAlertClass)#ProfessionalDocumentAssignmentModelProfessionalTeachingCourseModelStudentAcademicInfoModelStudentModelc                   | rt        |       j                         sy t        |       j                         d d }	 |j                  d      \  }}}t        t	        |      t	        |      t	        |            S # t
        $ r Y y w xY w)N
   -)strstripsplitr   int	Exception)stymds        c/var/www/pie360backend.cl/public_html/app/backend/classes/professional_document_assignment_class.py_parse_deadliner!      so    CFLLNAsA''#,1aCFCFCF++ s   <A7 7	BBc                J    | y 	 t        |       S # t        t        f$ r Y y w xY wN)r   	TypeError
ValueErrorperiod_years    r    _period_intr(   !   s2    ;z" s   
 ""c                      e Zd Zd	dZ	 	 	 	 	 	 	 	 d
dZ	 	 	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 ddZy)#ProfessionalDocumentAssignmentClassc                    || _         y r#   )db)selfr,   s     r    __init__z,ProfessionalDocumentAssignmentClass.__init__+   s	        c                   	 t        |      }| j                  j                  t              j	                  t        j
                  |k(  t        j                  t        |      k(  t        j                  t        |      k(        j                         }i }|D ]  }t        |j                  xs d      }t        |j                        |f}	|	|vrKt        |j                        |dkD  r|ndg i |j                  r|j                  j                         ndd||	<   t        |j                        }
|
||	   d   vr||	   d   j                  |
       t        |j                  xs d      ||	   d   t!        |
      <   |j                  s||	   d   r|j                  j                         ||	   d<    t#        |j%                               }|D ]  }t'        |d         |d<    dd|id	S # t(        $ r}d
t!        |      dg idcY d}~S d}~ww xY w)zmDevuelve items agrupados como espera el front (document_type_id, document_id, student_ids, student_statuses).r   N)document_type_iddocument_idstudent_idsstudent_statusesdeadline_atr3   r4   r5   successitemsstatusdataerrorr9   messager:   )r   r,   queryr   filterr'   	course_idprofessional_idalldocument_catalog_idr1   r5   	isoformat
student_idappend	status_idr   listvaluessortedr   )r-   r'   r@   rA   pyrowsbucketsrcatkeysidr7   ites                 r    get_groupedz/ProfessionalDocumentAssignmentClass.get_grouped.   s   &	Q[!BAB7CCrI7AAS^S7GG3K__
   >@G L!//4151--.4g%,/0B0B,C.1Ags4'),.DEMMq}}'>'>'@W[$GCL !,,'gcl=99CL/66s;=@AQPQ=R/0S:==m)D23--2I2I2KGCL/#L& )*E >$*2m+<$==!> ('51ABB 	Q%#a&7B-PP	Qs+   FG) G) AG) )	H2HHHc                  	 t        |      }t        |      }t        |      }t        | j                        j                  |||       | j                  j	                  t
              j                  t
        j                  |k(  t
        j                  |k(  t
        j                  |k(        j                         }i }	|D ]l  }
t        |
j                        t        |
j                        t        |
j                  xs d      f}t        |
j                  xs d      |
j                  f|	|<   n | j                  j	                  t
              j                  t
        j                  |k(  t
        j                  |k(  t
        j                  |k(        j!                  d       t#        j$                         }|D ]  }t        |j'                  d      xs d      }|dk  r(|j'                  d      }|t        |      dkD  rt        |      nd}|j'                  d      xs g }t)        |t*              s|t-        |j'                  d	            }|D ]q  }	 t        |      }|dk  r|||f}|	j'                  |d
      \  }}|dk(  r|nd}|dk(  r|nd}t        |||||||||||      }| j                  j3                  |       s  | j                  j5                          | j                  j	                  t
              j                  t
        j                  |k(  t
        j                  |k(  t
        j                  |k(  t
        j                  dk(        j7                         }t        | j                        j9                  ||||       | j                  j;                          dddS # t.        t0        f$ r Y mw xY w# t<        $ r2}| j                  j?                          dtA        |      dcY d}~S d}~ww xY w)z
        Reemplaza asignaciones para (period, course, professional).
        Conserva status_id=1 y completed_at si la misma clave (student, type, catalog) sigue en el payload.
        r'   r@   rA   r   F)synchronize_sessionr1   r2   Nr3   r5   )r   N   )r'   r@   rA   rE   r1   rC   rG   r5   completed_at
added_dateupdated_date)r'   r@   rA   pending_countr6   Sincronizado)r9   r=   r;   )!r   r   r,   "delete_alerts_for_assignment_scoper>   r   r?   r'   r@   rA   rB   rE   r1   rC   rG   rY   deleter   nowget
isinstancerH   r!   r$   r%   addflushcountupsert_scope_summarycommitr   rollbackr   )r-   r'   r@   rA   r7   rK   cidpidexistingold_maprN   rP   r`   rawdtiddidcatalogsidsdlrQ   rE   prev_statusprev_completedstcomprow	pending_nrS   s                               r    sync_replacez0ProfessionalDocumentAssignmentClass.sync_replace^   s   Z	:[!Bi.Co&C$''"EE#s F 
 AB7CCrI7AASH7GG3N
   SUG G1<<(#a.@.@*A3qG\G\Ga`aCbc #AKK$41 5q~~FG GGMM=>EE3??2E3==D3CCsJ ff/,,.C "%377#56;!<19ggm,&)o#c(Q,#c(Aww}-3!$-$SWW]%;< %C!%(X
 "Q %tW5C29++c92M/K(3q(8aB-/1W>$D=$&"%(+#-)-,3"$$&%)#&%(C GGKK$1%"%J GGMMO AB7CCrI7AASH7GG3N7AAQF	   $''"77 #'	 8  GGNN'NCCY &z2 ! !Z  	:GG%#a&99	:sC   IO  N*EO  *N=9O  <N==O   	O;	'O60O;6O;Nr&   c                  	 t        |      }| j                  j                  t              j	                  t        j
                  |k(  t        j                  dk(        }|+|j	                  t        j                  t        |      k(        }|j                         }d|dS # t        $ r}dt        |      ddcY d}~S d}~ww xY w)zOCuenta asignaciones con status_id=0 (documento pendiente de cargar en carpeta).r   Nr6   )r9   re   r;   )r9   r=   re   )r   r,   r>   r   r?   rA   rG   r'   re   r   r   )r-   rA   r'   rj   qre   rS   s          r    count_pendingz1ProfessionalDocumentAssignmentClass.count_pending   s    	Fo&CABII3CCsJ3==BA &HH7CCs;GWW GGIE'%88 	F%#a&1EE	Fs   BB   	C)B=7C=Cc          
     H   t        |      }|yt        |      }t        |      }	t        |      }
| j                  j                  t              j                  t        j                  |k(  t        j                  |
k(  t        j                  dk(        }|9t        |      dkD  r+|j                  t        j                  t        |      k(        }|9t        |      dkD  r+|j                  t        j                  t        |      k(        }|j                  t        t        j                  |k(  t        t        j                  dk(  t        j                  |	k(                    }|j                         }|syt!        j"                         }|D ]  }d|_        ||_        ||_         |d   }t)        | j                        j+                  t        |j                        t        |j                        t        |j                               | j                  j-                          y)ub   Marca filas pendientes cuando hay archivo en carpeta (mismo catálogo o catálogo 0 + mismo tipo).Nr   rX   rV   )r(   r   r,   r>   r   r?   r'   rE   rG   r@   rA   r   rC   r   r1   rB   r   r`   rY   r[   r   #sync_scope_summary_from_assignmentsrg   )r-   r'   rE   rC   r1   rA   r@   rK   dcdtrQ   r{   rL   r`   rN   r0s                   r    "mark_completed_after_folder_uploadzFProfessionalDocumentAssignmentClass.mark_completed_after_folder_upload   s    %:$%!"*oGGMM=>EE/;;rA/::cA/99Q>
  S^a%7<FF#i.XYA&3+?!+C<LLPSTcPddeAHH3GG2M7KKqP7HHBN
 uuwlln 	!AAK AN AN	! !WdggBBBNN+",,' 2 23 	C 	

 	r/   c                  	 t        |      }t        |      }| j                  j                  t              j                  t        j                  |k(        }|"|j                  t        j                  |k(        }t        |j                               }t        |j                  t        j                  dk(        j                               }| j                  j                  t        j                        j                  t        j                  |k(  t        j                  dk(        j                         j                         }|D 	cg c]$  }	|	j                  t        |	j                        & }
}	t        |
      }d}|
D ]  }| j                  j                  t               j#                  t$        t$        j&                  t         j(                  k(        j                  t$        j                  |k(  t         j                  dk(        }|+|j                  t         j                  t+        |      k(        }|t        |j                               z  } d||||ddS c c}	w # t,        $ r}dt+        |      ddcY d}~S d}~ww xY w)	z
        Resumen para home del profesional: documentos asignados/cargados (filas PDA),
        cursos en professionals_teachings_courses y suma de estudiantes por curso (puede repetir alumno entre cursos).
        NrX   r   r6   )assigned_documentsloaded_documentscourses_assignedstudents_in_coursesr8   r;   r<   )r   r(   r,   r>   r   r?   rA   r'   re   rG   r   r@   deleted_status_iddistinctrB   lenr   joinr   rE   idr   r   )r-   rA   r'   rj   rK   q_pdar   r   course_rowsrN   
course_idsr   r   ri   sqrS   s                   r    
home_statsz.ProfessionalDocumentAssignmentClass.home_stats  s"   6	Ho&C[)BGGMM"EFMM3CCsJE ~%H%T%TXZ%Z[!$U[[]!3"@JJaOPVVX 
 =GGH3CCsJ3EEJ   5@[q1;;CZ#akk*[J[":"#! 7GGMM,/T00;;|N V0::cA$66!;  ><#;#;s2w#FGB#s288:6#7" $*<(8(8+>	 ) \:  	H%#a&$GG	Hs7   EI# II1C,I# I# #	J,J :J J)r,   r   )r'   r   r@   r   rA   r   returnDict[str, Any])
r'   r   r@   r   rA   r   r7   zList[Dict[str, Any]]r   r   )rA   r   r'   Optional[int]r   r   )r'   r   rE   r   rC   r   r1   r   rA   r   r@   r   r   None)	__name__
__module____qualname__r.   rT   ry   r|   r   r    r/   r    r*   r*   *   s    .Q .Q 	.Q
 .Q 
.Q`f: f: 	f:
 f: $f: 
f:X &*	F F #	F
 
F,6 #6 	6
 !6 6 '6 !6 
6x &*	@H @H #	@H
 
@Hr/   r*   N)r   zOptional[str]r   zOptional[date])r'   r   r   r   )__doc__
__future__r   r   r   typingr   r   r   r	   r
   
sqlalchemyr   r   sqlalchemy.ormr   #app.backend.classes.app_alert_classr   app.backend.db.modelsr   r   r   r   r!   r(   r*   r   r/   r    <module>r      sC    # # 3 3   " = jH jHr/   