
    X@	g7@                         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mZmZmZ d d	lmZ d
 Z G d dej                  Z G d dej                  Z G d dej                  ZdS )    )models
connectiontransaction)Q   )Groupe)Eleve)Config)dictfetchall)LowerUpperConcatSubstr)BDDc                     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)args    %/opt/e-colle/accueil/models/classe.pygroup_concatr      so     lc%:::=DDSIII	:AA#FFF				*11#666r    c                   "    e Zd Zd Zd ZddZdS )ColleurManagerc                     d}t          j                    5 }|                    ||j        |j        |j        g           |                                cd d d            S # 1 swxY 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    s       r   listeColleurClassez!ColleurManager.listeColleurClasse       e
    	%FNN7WZWZ$HIII??$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%   <AA#&A#c                     d}t          j                    5 }|                    ||j        |j        |j        g           |                                cd d d            S # 1 swxY w Y   d S )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$   s       r   listeColleurMatierez"ColleurManager.listeColleurMatiere#   r)   r*   r   c                    g }||                     d           ||                     d           |r|                     d           |rdd                    |          z   }nd}d                    t          d          d	z   t          d
          dz   |dnd|dnd|          }t	          j                    5  d ||fD             d|rd                    |          gng z  z   }t          j                    5 }|                    ||           t          |          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w 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                      g | ]}||j         S N)r"   ).0xs     r   
<listcomp>z0ColleurManager.listeColleurs.<locals>.<listcomp>V   s    JJJ!AMMMMr      z%{}%)
appendjoinr   r   r   atomicr   r    r!   r   )	r%   matiereclassepatternwherer'   	argumentsr    colleurss	            r   listeColleurszColleurManager.listeColleurs-   s    LL%%%LL&&& 	VLLTUUU 	w||E222EEE& f\/::[H,W`JaJadnJnv}  wFprpr L- 4:>RR H- /45 5' 	4 !! 	0 	0JJ'8JJJQlsP{QWQ^Q^_fQgQgPhPhy{M||I"$$ 0w	222'//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0
 s7   9A E9&D+E+D/	/E2D/	3EE	EN)r   )__name__
__module____qualname__r(   r,   r=    r   r   r   r      sF        % % %% % %- - - - - -r   r   c                      e Zd Zg dZ ej        dd          Z ej        dd          Z ej        ed          Z	 ej
        d	d
ddej                  Z e            Z G d d          Zd Zd Zd Zd Zd Zd ZdS )Colleur))r   autre)r   u	   certifié)r3   zbi-admissible)   u   agrégé)   u   chaire supérieureMatiereu   Matière(s))verbose_nameClassez	Classe(s)rE   choicesdefaultEtablissementu   ÉtablissementT)rH   nullblank	on_deletec                       e Zd ZddgZdS )Colleur.Metauser__last_nameuser__first_nameNr>   r?   r@   orderingrA   r   r   MetarR   e   s        %'9:r   rW   c                 6    | j                             d          S )Nr8   )colleurprofprefetch_relatedr%   s    r   allprofszColleur.allprofsh   s    00:::r   c                 H    d | j                                         D             S )Nc                 &    g | ]}|j         j        S rA   )r7   pk)r0   profs     r   r2   z,Colleur.allprofsmatieres.<locals>.<listcomp>l   s    CCCDCCCr   )rY   allr[   s    r   allprofsmatiereszColleur.allprofsmatieresk   s%    CCD,<,@,@,B,BCCCCr   c                    t                      }| j                            d                                          D ]3}|j        s|j        j        | k    r|                    |j                   4t          |d           S )Nr8   c                     | j         S r/   nomr1   s    r   <lambda>z'Colleur.classeGroupes.<locals>.<lambda>s   s    ae r   key)	setrY   rZ   ra   modifgrouper8   profprincipaladdsorted)r%   classesr`   s      r   classeGroupeszColleur.classeGroupesn   s{    %%$55h??CCEE 	) 	)D )4;#<#D#DDK(((g^^4444r   c                     t           j                                        j        r6| j                                        D ]}|j        s|j        j        | k    r dS dS )NTF)	r
   objects
get_configmodif_prof_grouperY   ra   rl   r8   rm   )r%   r`   s     r   rl   zColleur.modifgroupeu   se    >$$&&8 	 (,,..    #  t{'@D'H'H44 (Iur   c                     t           j                            t          |           t          |           z                                                                d          S )N)rm   )classematiereECTS__profsrf   )rI   rs   filterr   distinctorder_byr[   s    r   ectsclasseszColleur.ectsclasses|   sO    ~$$QT%:%:%:QX\=]=]=]%]^^ggiirrsxyyyr   c                     t          | d          rNd                    | j        j                                        | j        j                                                  S dS )Nuser{} {}r   )hasattrr   r}   
first_nametitle	last_nameupperr[   s    r   __str__zColleur.__str__   sP    4 	\>>$)"6"<"<">">ty?R?X?X?Z?Z[[[rr   N)r>   r?   r@   LISTE_GRADESr   ManyToManyFieldmatieresrp   PositiveSmallIntegerFieldgrade
ForeignKeyPROTECTetablissementr   rs   rW   r\   rb   rq   rl   r{   r   rA   r   r   rC   rC   ]   s*       pppL%v%imLLLH$f$XKHHHG,F,\1MMME%F%oDT[_fjv|  wE  F  F  FMnG; ; ; ; ; ; ; ;; ; ;D D D5 5 5  z z z    r   rC   c                      e Zd ZdZ ej        dd          Z ej        ed          Z ej	        ddd	d
          Z
 ej        dddej                  Z ej        dd          Z ej        ddddej                  Z ej        ddddej                  Z G d d          Zd Zd Zd Zd Zd Zd!dZd"dZd#dZd Zd  ZdS )$rI   ))r   u   1ère année)r3   u   2ème année   T)
max_lengthuniquer   rJ   rG   u	   matièresmatieresclasse)rH   related_namerO   rC   classeprofprincipal)rN   r   rP   u#   Groupes différents les 2 semestresF)rH   rL   classeoption1)rN   rO   r   rP   classeoption2c                       e Zd ZddgZdS )Classe.Metaanneerf   NrU   rA   r   r   rW   r      s        5!r   rW   c                     t          | d          r| j        S | j                            dd          | _        | j        S )NlisteMatieresr_   T)flat)r   r   r   values_listr[   s    r   
matierespkzClasse.matierespk   sE    4)) 	&%% "]66t$6GG!!r   c                     | j         S r/   re   r[   s    r   r   zClasse.__str__   s	    xr   c                 z   | j                             dd                              t          t	          t          ddd          t          ddd                                                            ddd                              d          }g }d}d}|D ]m}|j        }||k    rE|dk    r|dxx         d	z  cc<   |dz  }|                    d
	                    ||                     nd}|                    |           |}nt          t          ||                    }|                    d            |S )u`   Renvoie la liste des logins des élèves de la classe ordonnés 
        par ordre alphabétiquerS   rT   r   loginr   r}   F1{}{:x}c                 J    | d         j         j        | d         j         j        fS )Nr   )r}   r   r   rg   s    r   rh   z%Classe.loginsEleves.<locals>.<lambda>   s    1)<adi>R(S r   ri   )classeeleverz   annotater   r   r   select_relatedr   r4   r   listzipsort)r%   eleveslisteLogins	lastloginindiceelever   elevesLogins           r   loginsEleveszClasse.loginsEleves   sj    !**
 
 (v&81==fEVWXYZ>[>[\\]]  
 

(
 
 .
 
  	 	 
	 
	EKE	!!Q;;OOOs*OOO!""8??5&#A#ABBBB""5)))II3v{3344SSTTTr   c                     g }|                                  }| j                            |                                           D ]H}|j        dv r|                    d            "|j        s|                    |           ?|j        dk    rz|                                }t          t          |          dz
  dd          D ].}||         d         j
        |k    r|                    |           /|                    |           |j        dk    ry|                                }t          t          |          dz
  dd          D ].}||         d         j        |k    r|                    |           /|                    |           J|S )N)colleur__classes)   <   r   r   r   r3   )r   r   rx   ry   tempsr4   lvcopyrangelenlv1poplv2)r%   matiereeleveslisteElevesr7   	listeTempis         r   loginMatiereEleveszClasse.loginMatiereEleves   s   ''))}++T+BBKKMM 	0 	0G}''$$T****Z 0$$[1111q',,..	s9~~a/R88 ) )A |A*g55!a((($$Y////q',,..	s9~~a/R88 ) )A |A*g55!a((($$Y///r   c                 R    i }|                                  D ]\  }}|||j        <   |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   s       r   r   zClasse.dictEleves   s=     
,,.. 	) 	)KE%#(Jux  r   Nc                    |t           j                            d|j                                                                                                      t          t          t          ddd          t          ddd                                        
                    ddd          }n||~| j                            d	                              t          t          t          ddd          t          ddd                                        
                    ddd          }n| j                            |j        |j        f
                                                              t          t          t          ddd          t          ddd                                        
                    ddd          }g }d}d}|D ]m}|j        }||k    rE|dk    r|dxx         dz  cc<   |dz  }|                    d                    ||                     nd}|                    |           |}nt!          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__inrT   r   rS   r   r   )r   )colle__semaine__lundi__rangeFr   r   r   )rC   rs   rx   rp   ra   ry   r   r   r   r   rz   colleur_setlundir   r4   r   r   r   )	r%   seminsemaxr&   r<   r   r   r   r   s	            r   loginsColleurszClasse.loginsColleurs   sw    -- $#O//11 .   hjjF6*<Qq#A#A6J[\]^_C`C`aabb "  h!"  H ]em'.. $ /  hF6*<Qq#A#A6J[\]^_C`C`aabb   hw01CDD	 H '..K. /   hjjF6*<Qq#A#A6J[\]^_C`C`aabb "  hw 12DEE  	 
	 
	GME	!!Q;;OOOs*OOO!""8??5&#A#ABBBB""5)))IIC+..///r   c                 V    i }|                      ||          D ]\  }}|||j        <   |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   s         r   r   zClasse.dictColleurs  sA     "11%?? 	- 	-NGU',L$$r   c                    t                      }|dk    rdnd|du r	t          j                            |                               dd          }|dk    r|                    dd          }fd	|D             }| j                                        D ]| j        k    s| j        k    r|dk    rfd
|D             |j	        <   5j
        dk    r||j	        <   Kj
        dk    rfd|D             |j	        <   nj
        dk    rfd|D             |j	        <   nt          j                            |           }dg|                                z  }| j                                        D ]| j        k    s| j        k    r|dk    rfd|D             |j	        <   5j
        dk    r||j	        <   Kj
        dk    rfd|D             |j	        <   nj
        dk    rfd|D             |j	        <   |S )Nr   groupeelevegroupe2eleveTr8   groupeeleve__userr3   groupe2eleve__userc                     i | ]N}|j         |j        d                     d t          |                                          D                       fOS ); c                     g | ]P}d                      |j        j                                        |j        j                                                  QS r~   )r   r}   r   r   r   r   )r0   r   s     r   r2   z1Classe.dictGroupes.<locals>.<dictcomp>.<listcomp>-  s{      >x  >x  >x  OTgnnUZMbMhMhMjMjlqlv  mA  mG  mG  mI  mI  ?J  ?J  >x  >x  >xr   r_   rf   r5   getattrra   )r0   groupeattributs     r   
<dictcomp>z&Classe.dictGroupes.<locals>.<dictcomp>-  s      Q  Q  Q  EFI
499  >x  >x  X_  `f  hp  Xq  Xq  Xu  Xu  Xw  Xw  >x  >x  >x  4y  4y  (z  Q  Q  Qr   c           	          i | ]G}|j         |j        d                     fd|j                                        D                       fHS )r   c                     g | ][}|j         k    d                     |j        j                                        |j        j                                                  \S r   )optionr   r}   r   r   r   r   r0   r   r7   s     r   r2   z1Classe.dictGroupes.<locals>.<dictcomp>.<listcomp>0  s      Q]  Q]  Q]  af  GL  GS  U\  G\  G\QXQ_Q_`e`j`u`{`{`}`}  D  I  S  Y  Y  [  [  R\  R\  G\  G\  G\r   )r_   rf   r5   r   ra   r0   r   r7   s     r   r   z&Classe.dictGroupes.<locals>.<dictcomp>0  s      /v  /v  /v  djvy6:dii  Q]  Q]  Q]  Q]  jp  j}  jA  jA  jC  jC  Q]  Q]  Q]  G^  G^  ;_  /v  /v  /vr   r   c                     i | ]P}|j         |j        d                     fdt          |                                          D                       fQS )r   c                     g | ][}|j         k    d                     |j        j                                        |j        j                                                  \S r   )r   r   r}   r   r   r   r   r   s     r   r2   z1Classe.dictGroupes.<locals>.<dictcomp>.<listcomp>4        Q`  Q`  Q`  af  MR  MV  X_  M_  M_QXQ_Q_`e`j`u`{`{`}`}  D  I  S  Y  Y  [  [  R\  R\  M_  M_  M_r   r   r0   r   r   r7   s     r   r   z&Classe.dictGroupes.<locals>.<dictcomp>4        /y  /y  /y  gmvy6:dii  Q`  Q`  Q`  Q`  jq  rx  zB  jC  jC  jG  jG  jI  jI  Q`  Q`  Q`  Ga  Ga  ;b  /y  /y  /yr   c                     i | ]P}|j         |j        d                     fdt          |                                          D                       fQS )r   c                     g | ][}|j         k    d                     |j        j                                        |j        j                                                  \S r   )r   r   r}   r   r   r   r   r   s     r   r2   z1Classe.dictGroupes.<locals>.<dictcomp>.<listcomp>6  r   r   r   r   s     r   r   z&Classe.dictGroupes.<locals>.<dictcomp>6  r   r   c                 t    g | ]4}t          fd |j                                        D                       5S )c              3   .   K   | ]}|j         k    V  d S r/   )r   r   s     r   	<genexpr>z0Classe.dictGroupes.<locals>.<listcomp>.<genexpr><  s*      2p2pU5<3H2p2p2p2p2p2pr   )anyr   ra   r   s     r   r2   z&Classe.dictGroupes.<locals>.<listcomp><  sY      /H  /H  /Hu{s2p2p2p2pV\ViVmVmVoVo2p2p2p/p/p  /H  /H  /Hr   c           	          g | ]=}t          fd t          |                                          D                       >S )c              3   .   K   | ]}|j         k    V  d S r/   r   r   s     r   r   z0Classe.dictGroupes.<locals>.<listcomp>.<genexpr>@  *      2s2s%59g3E2s2s2s2s2s2sr   r   r   ra   r   s     r   r2   z&Classe.dictGroupes.<locals>.<listcomp>@  b      /K  /K  /Kx~s2s2s2s2sSZ[ackSlSlSpSpSrSr2s2s2s/s/s  /K  /K  /Kr   c           	          g | ]=}t          fd t          |                                          D                       >S )c              3   .   K   | ]}|j         k    V  d S r/   r   r   s     r   r   z0Classe.dictGroupes.<locals>.<listcomp>.<genexpr>B  r   r   r   r   s     r   r2   z&Classe.dictGroupes.<locals>.<listcomp>B  r   r   )dictr   rs   rx   rZ   r   ra   option1option2r_   r   count)r%   nomssemestredictgroupesgroupeslistegroupesr   r7   s         @@r   dictGroupeszClasse.dictGroupes%  sC   ff$,MM==~4<<n++4+88''6IJJ 1}}!22>BVWW Q  Q  Q  Q  IP  Q  Q  QL=,,.. y yLG++t|w/F/FHXYMM /v  /v  /v  /v  nu  /v  /v  /vK
++Z1__.:K
++Z1__ /y  /y  /y  /y  /y  qx  /y  /y  /yK
++Z1__ /y  /y  /y  /y  /y  qx  /y  /y  /yK
+y n++4+88G 6'--//1L=,,.. K KLG++t|w/F/FHXYMM /H  /H  /H  /H  @G  /H  /H  /HK
++Z1__.:K
++Z1__ /K  /K  /K  /K  /K  CJ  /K  /K  /KK
++Z1__ /K  /K  /K  /K  /K  CJ  /K  /K  /KK
+r   c                    t                      }dgt          j                            |                                           z  }| j                                        D ]j        dk    r||j        <   j        dk    r5fdt          j                            |           D             |j        <   Xj        dk    r4fdt          j                            |           D             |j        <   |S )NTr   r   r   c                 &    g | ]}|j         k    S rA   r   r   s     r   r2   z'Classe.dictElevespk.<locals>.<listcomp>L       )n)n)n5%)w*>)n)n)nr   r3   c                 &    g | ]}|j         k    S rA   r   r   s     r   r2   z'Classe.dictElevespk.<locals>.<listcomp>N  r  r   )	r   r	   rs   rx   r   r   ra   r   r_   )r%   r   r   r7   s      @r   dictElevespkzClasse.dictElevespkE  s    VV
fU]111>>DDFFF}((** 	o 	oGzQ)4
7:&&q)n)n)n)nEML`L`hlL`LmLm)n)n)n
7:&&q)n)n)n)nEML`L`hlL`LmLm)n)n)n
7:&r   c                     d}t          j                    5 }|                    || j        g           t	          |          cd d d            S # 1 swxY 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    s      r   r,   zClasse.listeColleurMatiereQ  s    3    	(FNN7TWI...''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   +AAA)NNN)NN)Tr   )r>   r?   r@   ANNEE_PREPAr   	CharFieldrf   r   r   r   r   r   SET_NULLrm   BooleanField	semestresr   r   rW   r   r   r   r   r   r   r   r  r  r,   rA   r   r   rI   rI      s       K &
b
6
6
6C,F,[KKKE%v% %	  H &F%*/	# # #M
 $#1VbghhhIf$/# # #G  f$/# # #G" " " " " " " "" " "    >  ,  +0 +0 +0 +0Z      @
 
 
	( 	( 	( 	( 	(r   rI   N)	django.dbr   r   r   django.db.modelsr   r   r   r   r	   configr
   rD   r   django.db.models.functionsr   r   r   r   ecolle.settingsr   r   Managerr   ModelrC   rI   rA   r   r   <module>r     sd   6 6 6 6 6 6 6 6 6 6                               C C C C C C C C C C C C      
 
 
B B B B BV^ B B BJ% % % % %fl % % %NV( V( V( V( V(V\ V( V( V( V( V(r   