o
    DjW.                     @   s   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
mZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ d d
lmZmZmZ dddZG dd dejZG dd dejZ dS )    )models
connection)date	timedeltadatetimetimetimezone)AvgMinMaxStdDevCount   )dictfetchall)Semaine)Eleve)Prof)Matiere)HEURE_DEBUT	HEURE_FIN
INTERVALLENFc           
         sD  |du rt }|du rdn|d |du rdd n|d  |dkr$g S  t d kr= fddt|D S g }g}d}t|d D ])}	|	   |	 d   krc|d7 }qJ|| ||	 d  d}qJ|| |du rdn|dd |du rdn|dd  fd	dt||D S )
uM   fonction récursive pour transformer un tableau de tableaux en arbre à poidsFNr   r   c                 S      | S N tr   r   -/home/reyt/e-colle-new/accueil/models/note.py<lambda>       zarray2tree.<locals>.<lambda>c                    s(   g | ]} |    qS r   r   .0i)funcproftableauxyr   r   
<listcomp>   s   ( zarray2tree.<locals>.<listcomp>c              
      sH   g | ] \}}g  |   t | ||R qS r   )
array2tree)r    longueurposition)r"   new_funcnew_profr#   r$   r&   r   r   r'   "   s   H )lenrangeappendzip)
r$   profondeursfuncsr%   r&   taille	longueurs	positionsr)   r!   r   )r"   r+   r,   r#   r$   r%   r&   r   r(      s*   $


"r(   c                   @   s@   e Zd Zdd Zdd Zdd Zdd Zdd
dZdddZd	S )NoteManagerc                 C   sV   d}t  }|||jf t|}dd |D W  d    S 1 s$w   Y  d S )Nan  SELECT s.numero semaine, n.id, n.date_colle, n.heure, n.note, n.commentaire, n.matiere_id, n.classe_id, n.eleve_id, n.rattrapee                   FROM accueil_note n                   INNER JOIN accueil_semaine s                   ON n.semaine_id=s.id                   WHERE n.colleur_id= %s                   ORDER BY s.numero DESC, n.date_colle DESC, n.heure DESCc                 S   sv   g | ]7}|d  |d |d |d |d |d t |d t|d d |d d jtjd	 |d
 t|d g	qS )id
matiere_id	classe_idnotecommentairesemaine
date_colleheure<   )tzinfoeleve_id	rattrapee)r   combiner   replacer   utc	timestampbool)r    r:   r   r   r   r'   2   s    .z-NoteManager.listeNotesApp.<locals>.<listcomp>r   cursorexecutepkr   )selfcolleurrequeterI   notesr   r   r   listeNotesApp(   s   
$zNoteManager.listeNotesAppc              	   C   s|   d}t  }|||j|j|j|j|jf | }W d    n1 s%w   Y  t|g ddd dd dd dd gS )Nu  SELECT s.numero semaine, p.titre, p.detail, n.date_colle, n.heure, COALESCE(u.first_name,'Élève Fictif') prenom, COALESCE(u.last_name,'') nom, n.note, n.commentaire, n.id pk                   FROM accueil_note n                   LEFT OUTER JOIN accueil_eleve e                   ON n.eleve_id = e.id                   LEFT OUTER JOIN accueil_user u                   ON u.eleve_id = e.id                   INNER JOIN accueil_semaine s                   ON n.semaine_id=s.id                   LEFT OUTER JOIN (SELECT ps.semaine_id, sub.matiere_id, sub.classe_id, sub.titre, sub.detail, sub.fichier FROM accueil_programme_semaine ps                   INNER JOIN accueil_programme sub                   ON ps.programme_id = sub.id) p                   ON p.semaine_id = s.id AND p.classe_id = %s AND p.matiere_id = %s                   WHERE n.classe_id = %s AND n.colleur_id= %s AND n.matiere_id = %s                   ORDER BY s.numero DESC, n.date_colle DESC, n.heure DESC, u.last_name, u.first_name)   r   r      c                 S   s$   d | d | d pd| d pdfS )Nu   Semaine n°{}r   r       format)lr   r   r   r   G      $ z(NoteManager.listeNotes.<locals>.<lambda>c                 S   r   r   r   r   r   r   r   r   G   r   c                 S   s0   d | d  | d  | d | d | d fS )Nz{} {}r   r   rT   rQ      )rV   titleupperr   r   r   r   r   G      0 )r   rI   rJ   rK   fetchallr(   )rL   rM   classematiererN   rI   rO   r   r   r   
listeNotes5   s   
 
(zNoteManager.listeNotesc              
   #   s   t jj|||j|jfd d}|V  ttjj|dd}dd |D  tt	jj
d dj
dd	j||d
j|j|jgddddtddd}|jdd dd t|D ]
\}}	|d |	d< q^tt|d D ]}|| d ||d  d  dk r|| d ||d  d< qq|D ]}
|
d |
d g |
d  dd < q fdd|D }t||D ]8\}}t }||d< |d |d< |d |d< t |d< |D ]}|d t	jj|||ddd d!d" q|V  qd S )#Nsemainenote__classesemainenote__matierelundi__rangelundi)r^   userc                 S   s,   i | ]}|j |jj |jj d d gqS )rS   )rK   rf   
first_namerZ   	last_namer[   r    elever   r   r   
<dictcomp>M   s   , z/NoteManager.classe2resultat.<locals>.<dictcomp>rj      note__gt)r_   eleve__classe)semaine__lundi__range	eleve__ideleve__user__first_nameeleve__user__last_namer:   c                 S   s   | d S )N	note__avgr   )r%   r   r   r   r   O   s    z-NoteManager.classe2resultat.<locals>.<lambda>T)keyreverser   rangru   gư>rT   c                    s   g | ]} |j  qS r   )rK   ri   
elevesdictr   r   r'   W   s    z/NoteManager.classe2resultat.<locals>.<listcomp>rj   moyennerQ   r<   )rj   r_   r<   colleur__user__first_namecolleur__user__last_namer;   )r   objectsfilterre   distinctorder_bylistr   select_relatedNoteexcludevaluesannotater	   sort	enumerater.   r-   r0   dictr/   )rL   r_   r^   seminsemaxsemaineslisteElevesmoyennesr!   r%   r{   eleveselevemoyrj   r:   r<   r   ry   r   classe2resultatI   s4   $P "
*zNoteManager.classe2resultatc                 C   s"   t jj|||j|jfd  S )Nra   )r   r~   r   re   r   count)rL   r_   r^   r   r   r   r   r   
nbSemainesb   s   "zNoteManager.nbSemainesNc                 C   sn   d}|r|d7 }|d7 }t  }|||jg|r|jgng   t|}W d    |S 1 s0w   Y  |S )Na  SELECT m.nom nom_matiere, m.couleur couleur, n.date_colle date_colle, u.first_name prenom, u.last_name nom, p.titre titre, p.detail programme, n.note note, n.commentaire commentaire                   FROM accueil_note n                   INNER JOIN accueil_matiere m                   ON n.matiere_id=m.id                   LEFT JOIN accueil_colleur c                   ON n.colleur_id=c.id                   LEFT JOIN accueil_user u                   ON u.colleur_id=c.id                   INNER JOIN accueil_semaine s                   ON n.semaine_id=s.id                   LEFT OUTER JOIN (SELECT ps.semaine_id, sub.matiere_id, sub.classe_id, sub.titre, sub.detail, sub.fichier FROM accueil_programme_semaine ps                   INNER JOIN accueil_programme sub                   ON ps.programme_id = sub.id) p                   ON p.semaine_id = s.id AND p.matiere_id = m.id AND p.classe_id = n.classe_id                   WHERE n.eleve_id = %s zAND m.id = %s zORDER BY date_colle DESCrH   )rL   rj   r_   rN   rI   rO   r   r   r   	noteElevee   s   
 

zNoteManager.noteEleveFc              	      sx  | j |djdd}|r|j |jd}|r|s|j |jd}n	|r(|j |jd}|ddd	d
 }dd tjj |d D  | j ||djdd}| j ||j	ddjdd}|rj|j |jd}|j |jd}|r}|s}|j |jd}|j |jd}n|r|j |jd}|j |jd}t
|ddtdtdtdtdtddd	d
}|dtddd	d
}g }t|D ]n\}	}
tjj |
|j	d}| r| jrd}nP| jddj |j	d|
d d}|r|j |jd}|r|s|j |jd}n
|r|j |jd}||	 d r'|dtdj ||	 d d d d }nd}|| q fddt|||D S )Nrl   rm   rn   )semaine__lundi__gte)semaine__lundi__lte)semaine__lundi__ltmatiere__pkmatiere__nommatiere__lvmatiere__tempsc                 S   s0   i | ]}|j |j |jrd |jnd qS )z(lv{})rS   )rK   nomrZ   lvrV   )r    r%   r   r   r   rk      r\   z*NoteManager.bilanEleve.<locals>.<dictcomp>)pk__in)rj   matiere__pk__inF)r   r^   eleve__isnullmatiere__couleurr:   )r_   r^   r   )r^   r   r   ru   rj   g-C6?)note__avg__gtr   c                    sN   g | ]#\}}}|d  |d |d |d  |d  |d |d |d |d	qS )	note__maxr   note__stddev	note__minr   note__countru   )	r   r   r   r   r   r   ru   noteclasse__avgrx   r   )r    r%   r&   zmatieresObjr   r   r'      s
    
z*NoteManager.bilanEleve.<locals>.<listcomp>)r   r   re   values_listr   r   r   r~   allr^   r   r   r   r	   r
   r   r   r   r   r   existsfirst	cacherangr   r/   r0   )rL   rj   r   r   strictmatieresr{   moyenne_classerangsr!   r_   r#   rx   r   r   r   
bilanEleve}   sR   <2

zNoteManager.bilanElever   )F)	__name__
__module____qualname__rP   r`   r   r   r   r   r   r   r   r   r6   '   s    
r6   c                   @   s   e Zd Zeg dZdd eeeeD Z	ddgZ
e
eeded ejdejdd	Zejd
ejdZejddZejddejddZejdejdZejddZejeddZeje
ddZejddejdZejdejdZeje	ddZej dddddZ!e" Z#dd  Z$d!d" Z%d#S )$r   )re   mardimercredijeudivendredisamedic                 C   s$   g | ]}|d  |d |d fqS )z	{}h{:02d}r?   rU   r   r   r   r   r'      rX   zNote.<listcomp>)   zn.n)   Absr   ColleurT)	on_deletenullr   )r   )auto_now_addr   semainenoteF)related_namer   blankzdate de rattrapage)verbose_namedefaultu
   rattrapée)r   r   )choicesr   r   r   )r   r   Classe   i  zCommentaire(facultatif))
max_lengthr   r   r   c                 C   s(   | j s| jjtt| jd | _d S d S )N)days)rB   r<   re   r   intjourr=   rL   r   r   r   update   s   zNote.updatec                 C   s$   d | jjj | jj| jj| j	S )Nz{} {} {} {})
rV   rj   rf   rh   r[   r_   r   r<   numeror:   r   r   r   r   __str__   s   $zNote.__str__N)&r   r   r   r   
LISTE_JOURr.   r   r   r   LISTE_HEURE
LISTE_NOTEextendr0   r   
ForeignKeyPROTECTrM   r_   	DateField
date_enregr<   r   todayr=   BooleanFieldrB   PositiveSmallIntegerFieldr   r:   rj   r^   r>   	TextFieldr;   r6   r~   r   r   r   r   r   r   r      s(    r   )NNr   r   F)!	django.dbr   r   r   r   r   r   r   django.db.modelsr	   r
   r   r   r   autrer   r<   r   rj   r   r#   r   r_   r   ecolle.settingsr   r   r   r(   Managerr6   Modelr   r   r   r   r   <module>   s    
 