o
    DjA                     @   s   d dl 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 dd	lmZ d d
lmZmZmZmZ d dlmZ dd ZG dd dejZG dd dejZG dd dejZdS )    )models
connectiontransaction)Q   )Groupe)Eleve)Config)Matiere)dictfetchall)Planche)LowerUpperConcatSubstr)BDDc                 C   sB   t dkst dkrd| S t dkrd| S t dkrd| S dS )	u   Renvoie une chaîne de caractères correspondant à la syntaxe SQL 
    qui permet d'utiliser une fonction d'agrégation qui concatène des chaînes
postgresqlpostgresql_psycopg2z,STRING_AGG(DISTINCT {0:}, ',' ORDER BY {0:})mysqlz)GROUP_CONCAT(DISTINCT {0:} ORDER BY {0:})sqlite3zGROUP_CONCAT(DISTINCT {}) )r   format)arg r   //home/reyt/e-colle-new/accueil/models/classe.pygroup_concat   s   


r   c                   @   s&   e Zd Zdd Zdd Zd	ddZdS )
ColleurManagerc                 C   P   d}t  }|||j|j|jg | W  d    S 1 s!w   Y  d S )Na  SELECT DISTINCT colcla.id, colcla.colleur_id, colcla.classe_id FROM accueil_colleur_matieres colmat
                    INNER JOIN accueil_colleur col ON col.id = colmat.colleur_id
                    INNER JOIN accueil_colleur_classes colcla ON col.id = colcla.colleur_id
                    INNER JOIN accueil_prof pr ON pr.classe_id = colcla.classe_id AND pr.matiere_id = colmat.matiere_id
                    WHERE pr.colleur_id = %s OR colcla.colleur_id = %s AND colmat.colleur_id = %sr   cursorexecuteidfetchallselfcolleurrequeter   r   r   r   listeColleurClasse   
   
$z!ColleurManager.listeColleurClassec                 C   r   )Na  SELECT DISTINCT colmat.id, colmat.colleur_id, colmat.matiere_id FROM accueil_colleur_matieres colmat
                    INNER JOIN accueil_colleur col ON col.id = colmat.colleur_id
                    INNER JOIN accueil_colleur_classes colcla ON col.id = colcla.colleur_id
                    INNER JOIN accueil_prof pr ON pr.classe_id = colcla.classe_id AND pr.matiere_id = colmat.matiere_id
                    WHERE pr.colleur_id = %s OR colcla.colleur_id = %s AND colmat.colleur_id = %sr   r#   r   r   r   listeColleurMatiere%   r(   z"ColleurManager.listeColleurMatierer   c           	   	   C   s,  g }|d ur| d |d ur| d |r| d |r%dd| }nd}dtdd	 td
d |d u r9dnd|d u r@dnd|}t D dd ||fD d|rZd|gng   }t }||| t	|}W d    n1 sww   Y  W d    |S W d    |S 1 sw   Y  |S )Nz	m.id = %sz
cl.id = %sz9LOWER(u.first_name) LIKE %s OR LOWER(u.last_name) LIKE %szWHERE z AND r   a  SELECT u.first_name prenom, u.last_name nom, u.username identifiant, u.email email, u.is_active actif,
                  c.grade grade, c.id id, e.nom etablissement, u.id user_id, {}, {} FROM accueil_colleur c
                  INNER JOIN accueil_user u
                  ON u.colleur_id = c.id
                  LEFT OUTER JOIN accueil_etablissement e
                  ON c.etablissement_id = e.id
                  {}
                  {}
                  LEFT OUTER JOIN accueil_colleur_matieres cm2
                  ON cm2.colleur_id = c.id
                  LEFT OUTER JOIN accueil_matiere m2
                  ON cm2.matiere_id = m2.id
                  LEFT OUTER JOIN accueil_colleur_classes cc2
                  ON cc2.colleur_id = c.id
                  LEFT OUTER JOIN accueil_classe cl2
                  ON cc2.classe_id = cl2.id
                  {}
                  GROUP BY u.id, c.id, e.id
                  ORDER BY u.last_name, u.first_name, c.id
                  zm2.nomcompletz	 matiereszcl2.nomz classeszLEFT OUTER JOIN accueil_colleur_matieres cm
                  ON cm.colleur_id = c.id
                  LEFT OUTER JOIN accueil_matiere m
                  ON cm.matiere_id = m.idzLEFT OUTER JOIN accueil_colleur_classes cc
                  ON cc.colleur_id = c.id
                  LEFT OUTER JOIN accueil_classe cl
                  ON cc.classe_id = cl.idc                 S   s   g | ]	}|d ur|j qS N)r!   ).0xr   r   r   
<listcomp>X   s    z0ColleurManager.listeColleurs.<locals>.<listcomp>   z%{}%)
appendjoinr   r   r   atomicr   r   r    r   )	r$   matiereclassepatternwherer&   	argumentsr   colleursr   r   r   listeColleurs/   s:   


$
*



zColleurManager.listeColleursN)r   )__name__
__module____qualname__r'   r)   r8   r   r   r   r   r      s    

r   c                   @   s   e Zd Zg dZejdddZejdddZejeddZ	ej
d	d
ddejdZe ZG dd dZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) Colleur))r   autre)r   u	   certifié)r.   zbi-admissible)   u   agrégé)   u   chaire supérieurer
   u   Matière(s))verbose_nameClassez	Classe(s)r>   choicesdefaultEtablissementu   ÉtablissementT)r@   nullblank	on_deletec                   @      e Zd ZddgZdS )zColleur.Metauser__last_nameuser__first_nameNr9   r:   r;   orderingr   r   r   r   Metag       rN   c                 C   s   | j dddS )Nr3   classe__anneeclasse__nom)colleurprofprefetch_relatedorder_byr$   r   r   r   allprofsj      zColleur.allprofsc                 C   s   t jjd| dS )NT)plancher%   )r
   objectsfilterrU   r   r   r   allMatieresPlanchesm   s   zColleur.allMatieresPlanchesc                 C      dd | j  D S )Nc                 S   s(   g | ]}|j jd kr|j j|jjfqS )T)r2   rX   pkr3   r+   profr   r   r   r-   q      ( z+Colleur.allProfPlanches.<locals>.<listcomp>rR   allrU   r   r   r   allProfPlanchesp   rW   zColleur.allProfPlanchesc                 C   r\   )Nc                 S   s   g | ]}|j jqS r   )r2   r]   r^   r   r   r   r-   t   s    z,Colleur.allprofsmatieres.<locals>.<listcomp>ra   rU   r   r   r   allprofsmatieress   rW   zColleur.allprofsmatieresc                 C   sJ   t  }| jd D ]}|js|jj| kr||j qt|dd dS )Nr3   c                 S      | j S r*   nomr,   r   r   r   <lambda>{   s    z'Colleur.classeGroupes.<locals>.<lambda>key)	setrR   rS   rb   modifgrouper3   profprincipaladdsorted)r$   classesr_   r   r   r   classeGroupesv   s   zColleur.classeGroupesc                 C   s8   t j jr| j D ]}|js|jj| kr dS qdS )NTF)	r	   rY   
get_configmodif_prof_grouperR   rb   rm   r3   rn   )r$   r_   r   r   r   rm   }   s   zColleur.modifgroupec                 C   s&   t jt| dt| dB  dS )N)rn   )classematiereECTS__profsrg   )rA   rY   rZ   r   distinctrT   rU   r   r   r   ectsclasses   s   &zColleur.ectsclassesc                 C   s*   t | drd| jj | jj S dS )Nuser{} {}r   )hasattrr   rx   
first_nametitle	last_nameupperrU   r   r   r   __str__   s   
zColleur.__str__N)r9   r:   r;   LISTE_GRADESr   ManyToManyFieldmatieresrq   PositiveSmallIntegerFieldgrade
ForeignKeyPROTECTetablissementr   rY   rN   rV   r[   rc   rd   rr   rm   rw   r   r   r   r   r   r<   _   s     r<   c                   @   s   e Zd ZdZejdddZejeddZej	ddd	dd
Z
ejdddejdZejdddZejddddejdZejddddejdZG dd dZdd Zdd Zdd Zdd Zdd Zd-d!d"Zd.d#d$Zd/d%d&Zd'd( Zd)d* Zd+d, Zd S )0rA   ))r   u   1ère année)r.   u   2ème année   T)
max_lengthuniquer   rB   r
   u	   matièresmatieresclasse)r@   related_namerG   r<   classeprofprincipal)rF   r   rH   u#   Groupes différents les 2 semestresF)r@   rD   classeoption1)rF   rG   r   rH   classeoption2c                   @   rI   )zClasse.Metaanneerg   NrL   r   r   r   r   rN      rO   rN   c                 C   s(   t | dr| jS | jjddd| _| jS )NlisteMatieresr]   T)flat)rz   r   r   values_listrU   r   r   r   
matierespk   s   
zClasse.matierespkc                 C   re   r*   rf   rU   r   r   r   r      s   zClasse.__str__c                 C   s   | j ddjtttdddtdddddddd}g }d}d}|D ],}|j}||krK|dkr=|d  d	7  < |d7 }|d
	|| nd}|| |}q(t
t||}|jdd d |S )u`   Renvoie la liste des logins des élèves de la classe ordonnés 
        par ordre alphabétiquerJ   rK   r   loginr   rx   F1{}{:x}c                 S   s   | d j j| d j jfS )Nr   )rx   r}   r{   rh   r   r   r   ri      s    z%Classe.loginsEleves.<locals>.<lambda>rj   )classeeleverT   annotater   r   r   select_relatedr   r/   r   listzipsort)r$   eleveslisteLogins	lastloginindiceelever   elevesLoginr   r   r   loginsEleves   s<   

zClasse.loginsElevesc                 C   s   g }|   }| jj| d D ]i}|jdv r|d  q|js%|| q|jdkrO| }tt	|d ddD ]}|| d j
|krH|| q8|| q|jdkrx| }tt	|d ddD ]}|| d j|krr|| qb|| q|S )N)colleur__classes)   <   r   r   r   r.   )r   r   rZ   rv   tempsr/   lvcopyrangelenlv1poplv2)r$   matiereeleveslisteElevesr2   	listeTempir   r   r   loginMatiereEleves   s.   





zClasse.loginMatiereElevesc                 C   s$   i }|   D ]	\}}|||j< q|S )u|   Renvoie un dictionnaire dont les clés sont les id des élèves 
        de la classe, et les valeurs le login correspondant)r   r]   )r$   
dictElevesr   r   r   r   r   r      s   zClasse.dictElevesNc           	      C   sZ  |dur(t jjd|j d jttt	dddt	dddd
ddd}nI|du s0|du rN| jjdd	jttt	dddt	dddd
ddd}n#| jj|j|jfd
 jttt	dddt	dddd
ddd}g }d}d}|D ],}|j}||kr|dkr|d  d7  < |d7 }|d|| nd}|| |}qytt||S )u   Renvoie la liste des logins des colleurs de la classe, qui 
        ont des colles entre les semaines semin et semax, ordonnés par 
        ordre alphabétiqueNT)user__is_activeclasses__inrK   r   rJ   r   r   )r   )colle__semaine__lundi__rangeFr   r   r   )r<   rY   rZ   rq   rb   rv   r   r   r   r   rT   colleur_setlundir   r/   r   r   r   )	r$   seminsemaxr%   r7   r   r   r   r   r   r   r   loginsColleurs   s\   



zClasse.loginsColleursc                 C   s(   i }|  ||D ]	\}}|||j< q|S )u|   Renvoie un dictionnaire dont les clés sont les id des 
        colleurs de la classe, et les valeurs le login correspondant)r   r]   )r$   r   r   dictColleursr%   r   r   r   r   r   %  s   zClasse.dictColleursc                    s  t  }|dkr	dnd |du rtjj| ddd}|dkr$|dd} fd	d
|D }| j D ]M| jks>| jkrO|dkrOfdd
|D |j	< q2j
dkrZ||j	< q2j
dkrm fdd
|D |j	< q2j
dkr fdd
|D |j	< q2|S tjj| d}dg|  }| j D ]M| jks| jkr|dkrfdd|D |j	< qj
dkr||j	< qj
dkrЇ fdd|D |j	< qj
dkr fdd|D |j	< q|S )Nr   groupeelevegroupe2eleveTr3   groupeeleve__userr.   groupe2eleve__userc              
      s4   i | ]}|j |jd dd t|  D fqS ); c                 S   s(   g | ]}d  |jj |jj qS ry   )r   rx   r{   r|   r}   r~   r+   r   r   r   r   r-   5  r`   1Classe.dictGroupes.<locals>.<dictcomp>.<listcomp>r]   rg   r0   getattrrb   r+   groupe)attributr   r   
<dictcomp>5     4 z&Classe.dictGroupes.<locals>.<dictcomp>c              	      s4   i | ]}|j |jd  fdd|j D fqS )r   c                    2   g | ]}|j  krd |jj |jj qS r   )optionr   rx   r{   r|   r}   r~   r   r2   r   r   r-   8     2 r   )r]   rg   r0   r   rb   r   r   r   r   r   8  r   r   c              
      8   i | ]}|j |jd fddt|  D fqS )r   c                    r   r   )r   r   rx   r{   r|   r}   r~   r   r   r   r   r-   <  r   r   r   r   r   r2   r   r   r   <     8 c              
      r   )r   c                    r   r   )r   r   rx   r{   r|   r}   r~   r   r   r   r   r-   >  r   r   r   r   r   r   r   r   >  r   c                    s(   g | ]}t  fd d|j D qS )c                 3       | ]}|j  kV  qd S r*   )r   r   r   r   r   	<genexpr>D      0Classe.dictGroupes.<locals>.<listcomp>.<genexpr>)anyr   rb   r   r   r   r   r-   D  r`   z&Classe.dictGroupes.<locals>.<listcomp>c                    ,   g | ]}t fd dt|  D qS )c                 3   r   r*   r   r   r   r   r   r   H  r   r   r   r   rb   r   r   r   r   r-   H     , c                    r   )c                 3   r   r*   r   r   r   r   r   r   J  r   r   r   r   r   r   r   r-   J  r   )dictr   rY   rZ   rS   r   rb   option1option2r]   r   count)r$   nomssemestredictgroupesgroupeslistegroupesr   r   r   dictGroupes-  sB   





zClasse.dictGroupesc                    s   t  }dgtjj| d  }| j D ]:  jdkr!|| j< q jdkr8 fddtjj| dD | j< q jdkrN fddtjj| dD | j< q|S )	NTr   r   r   c                       g | ]}|j  kqS r   r   r   r   r   r   r-   T      z'Classe.dictElevespk.<locals>.<listcomp>r.   c                    r   r   r   r   r   r   r   r-   V  r   )	r   r   rY   rZ   r   r   rb   r   r]   )r$   r   r   r   r   r   dictElevespkM  s   

$
"zClasse.dictElevespkc                 C   sH   d}t  }||| jg t|W  d    S 1 sw   Y  d S )Na  SELECT DISTINCT colmat.id, colmat.colleur_id, colmat.matiere_id FROM accueil_colleur_matieres colmat
                    INNER JOIN accueil_classe_matieres clmat
                    ON colmat.matiere_id = clmat.matiere_id
                    INNER JOIN accueil_colleur_classes colcla
                    ON colcla.colleur_id = colmat.colleur_id AND colcla.classe_id = clmat.classe_id
                    WHERE colcla.classe_id = %s)r   r   r    r!   r   )r$   r&   r   r   r   r   r)   Y  s
   
$zClasse.listeColleurMatierec                 C   s   t jj| d S )N)rq   )r   rY   rZ   existsrU   r   r   r   hasPlanchesd  s   zClasse.hasPlanches)NNN)NN)Tr   )r9   r:   r;   ANNEE_PREPAr   	CharFieldrg   r   r   r   r   r   SET_NULLrn   BooleanField	semestresr   r   rN   r   r   r   r   r   r   r   r   r   r)   r   r   r   r   r   rA      sV    	

-
 rA   N)	django.dbr   r   r   django.db.modelsr   r   r   r   r   configr	   r2   r
   r=   r   rX   r   django.db.models.functionsr   r   r   r   ecolle.settingsr   r   Managerr   Modelr<   rA   r   r   r   r   <module>   s    E-