o
    Dj                     @   s  d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZ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 d d	lmZ  d d
l!m"Z" d dl#m$Z$m%Z% d dl&m'Z'm(Z(m&Z& d dl)Z)d dl*m+Z+ d dl,m-Z- G dd dej.Z/G dd dej.Z0G dd dej1Z2G dd dej1Z3G dd dej1Z4G dd dej1Z5G dd dej6Z7G dd dej.Z8G d d! d!ej.Z9G d"d# d#ej.Z:G d$d% d%ej.Z;G d&d' d'ej.Z<d(d) Z=G d*d+ d+ej6Z>G d,d- d-ej6Z?G d.d/ d/ej.Z@G d0d1 d1ej6ZAG d2d3 d3ej.ZBG d4d5 d5ej6ZCG d6d7 d7ej.ZDG d8d9 d9ej6ZEG d:d; d;ejFZGG d<d= d=ej6ZHG d>d? d?ej6ZIG d@dA dAej6ZJG dBdC dCej6ZKG dDdE dEej6ZLG dFdG dGej6ZMG dHdI dIej6ZNdS )J    )forms)ClasseMatiereEtablissementSemaineColleurEleve	JourFerieUserProfConfigNoteColleRestrictedImageFieldInformation)SelectDateWidget)ValidationError)validate_password)transactionQ)RESOURCES_ROOT
MEDIA_ROOT)ElementTree)choice)pathremove)date	timedeltadatetimeN)TextIOWrapper)reducec                   @      e Zd ZG dd dZdS )
ConfigFormc                   @      e Zd ZeZg dZdS )zConfigForm.Meta)nom_etablissement
app_mobilemodif_secret_colmodif_secret_groupemodif_prof_coldefault_modif_colmodif_prof_groupedefault_modif_groupemessage_elevesmathjaxects
ects_modifnom_adresse_etablissementvilleacademieN)__name__
__module____qualname__r   modelfields r9   r9   ./home/reyt/e-colle-new/administrateur/forms.pyMeta       r;   Nr4   r5   r6   r;   r9   r9   r9   r:   r#          r#   c                   @   s"   e Zd ZG dd dZdd ZdS )InformationFormc                   @   s   e Zd ZeZddgZdS )zInformationForm.MetadestinatairemessageN)r4   r5   r6   r   r7   r8   r9   r9   r9   r:   r;      r<   r;   c                 C   sF   t jj| jj| jd d}| jjr|j| jjd}| r!t	dd S )Nr@   )
expediteurr@   pkuV   Il y a déjà un message d'information avec ce destinataire. Effacez-le ou modifiez-le)
r   objectsfilterinstancerB   cleaned_datarD   excludeexistsr   )selfqueryr9   r9   r:   clean   s   zInformationForm.cleanN)r4   r5   r6   r;   rM   r9   r9   r9   r:   r?      s    r?   c                   @      e Zd Zdd Zdd ZdS )ColleurFormSetMdpc                 C   >   t | jrdS dd | jD }t|tt|krtddS )Q   vérifie si on n'a pas deux identifiants identiques dans le groupe de formulairesNc                 S      g | ]}|j d  qS usernamerH   .0formr9   r9   r:   
<listcomp>,       z+ColleurFormSetMdp.clean.<locals>.<listcomp>/Deux identifiants identiques dans le formulaireanyerrorsr   lensetr   rK   	usernamesr9   r9   r:   rM   (      
zColleurFormSetMdp.cleanc              	   C   s   t  V | jD ]I}t|jd |jd d}|  |j|jd  |j|jd  t	|jd |jd 
 |jd 
 |jd	 |d
}||jd  |  qW d   dS 1 s]w   Y  dS )z2Sauvegarde en BDD les colleurs/users du formulairegradeetablissement)rd   re   matiereclasserT   
first_name	last_nameemail)rT   rh   ri   rj   colleurpasswordN)r   atomicr   r   rH   savematieresr`   classesr
   lowerset_password)rK   rX   rk   userr9   r9   r:   rn   0   s   

2
"zColleurFormSetMdp.saveNr4   r5   r6   rM   rn   r9   r9   r9   r:   rO   '       rO   c                       s<   e Zd Zg f fdd	Z fddZdd Zdd Z  ZS )	ColleurFormSetc                       t  j|i | || _d S N)super__init__chaine_colleurs)rK   r{   argskwargs	__class__r9   r:   rz   @      
zColleurFormSet.__init__c                    2   t  |}| jr| j| j|d< |S d|d< |S uF   déterminer l'argument nommé 'pk' à passer en paramtre du formulairerD   r   )ry   get_form_kwargsr{   rD   rK   indexr}   r~   r9   r:   r   D      zColleurFormSet.get_form_kwargsc                 C   s<   t | jrdS dd | jD }t|t| jkrtddS )rQ   Nc                 S      h | ]}|j d  qS rS   rU   rV   r9   r9   r:   	<setcomp>Q   rZ   z'ColleurFormSet.clean.<locals>.<setcomp>r[   )r]   r^   r   r_   r{   r   ra   r9   r9   r:   rM   M   s   
zColleurFormSet.cleanc                 C   s   t  m t| j| jD ]\\}}|jd |_|jd |_|j	|jd  |j
	|jd  |  |j}|jd  |_|jd  |_|jd |_|jd |_|jd	 |_|jd
 rd||jd
  |  qW d   dS 1 stw   Y  dS )uA   Sauvegarde (mise à jour) en BDD les colleurs/users du formulairerd   re   rg   rf   rh   ri   rj   rT   	is_activerl   N)r   rm   zipr{   r   rH   rd   re   rp   r`   ro   rn   rs   rq   rh   ri   rj   rT   r   rr   )rK   rk   rX   rs   r9   r9   r:   rn   U   s$   


"zColleurFormSet.saver4   r5   r6   rz   r   rM   rn   __classcell__r9   r9   r~   r:   rv   ?   s
    	rv   c                       s@   e Zd Zg f fdd	Z fddZ fddZdd Z  ZS )	EleveFormSetc                    rw   rx   )ry   rz   chaine_eleves)rK   r   r|   r}   r~   r9   r:   rz   i   r   zEleveFormSet.__init__c                    r   r   )ry   r   r   rD   r   r~   r9   r:   r   m   r   zEleveFormSet.get_form_kwargsc                    s   t | jrdS dd | jD }t|t| jkrtdt   t| j| jD ]\}}|j	d durDt
t|jj}t
|rDt| q(dS )rQ   Nc                 S   r   rS   rU   rV   r9   r9   r:   r   z   rZ   z%EleveFormSet.clean.<locals>.<setcomp>r[   photo)r]   r^   r   r_   r   r   ry   rM   r   rH   r   joinr   r   nameisfiler   )rK   rb   eleverX   fichierr~   r9   r:   rM   v   s   


zEleveFormSet.cleanc              
   C   s  t   t| j| jD ]\}}|j}|jd  |_|jd  |_	|jd |_
|jd |_|jd r<||jd  |j|jd krk|j}d|_|  |durktjj|d skz|  W n	 tyj   Y nw |jd |_|jd	 r}|jd	 |_n
|jd	 d
u rd|_|jd |_|jd |_|jd |_|jd |_|jd |_|jd |_|jjdkrd
|_n|jd |_|  |  qW d   dS 1 sw   Y  dS )u?   Sauvegarde (mise à jour) en BDD les eleves/users du formulaireri   rh   rj   rT   rl   rg   N)grouper   Fddnldninelv1lv2option   cube)r   rm   r   r   r   rs   rH   rq   ri   rh   rj   rT   rr   rg   r   rn   r   rE   rF   rJ   delete	Exceptionr   r   r   r   r   r   r   anneer   )rK   r   rX   rs   r   r9   r9   r:   rn      sJ   



"zEleveFormSet.saver   r9   r9   r~   r:   r   h   s
    	r   c                   @   rN   )EleveFormSetMdpc                 C   rP   )rQ   Nc                 S   rR   rS   rU   rV   r9   r9   r:   rY      rZ   z)EleveFormSetMdp.clean.<locals>.<listcomp>r[   r\   ra   r9   r9   r:   rM      rc   zEleveFormSetMdp.cleanc                 C   s   t  l | jD ]_}t|jd  |jd  |jd |jd d}||jd  t|jd |jd |jd	 |jd
 |jd |jd |jd |jd |jd jdkrUdn|jd d	}|	  ||_
|	  qW d    d S 1 ssw   Y  d S )Nrh   ri   rj   rT   )rh   ri   rj   rT   rl   rg   r   r   r   r   r   r   r   r   Fr   )	rg   r   r   r   r   r   r   r   r   )r   rm   r   r
   rH   rq   rr   r   r   rn   r   )rK   rX   rs   r   r9   r9   r:   rn      s   

0d
"zEleveFormSetMdp.saveNrt   r9   r9   r9   r:   r      ru   r   c                   @   s(   e Zd ZejddZejdejdZdS )AdminConnexionFormidentifiant)labelMot de passe)r   widgetN)r4   r5   r6   r   	CharFieldrT   PasswordInputrl   r9   r9   r9   r:   r      s    r   c                       s>   e Zd Z fddZG dd dZdd Z fddZ  ZS )	
ClasseFormc                    B   t  j|i | tjjdd| jd _tjjdd| jd _d S Nr   lvoption1option2ry   rz   r   rE   rF   r8   querysetrK   r|   r}   r~   r9   r:   rz         zClasseForm.__init__c                   @   "   e Zd ZeZg dZdejiZdS )zClasseForm.Metanomr   ro   r   r   ro   N	r4   r5   r6   r   r7   r8   r   CheckboxSelectMultiplewidgetsr9   r9   r9   r:   r;          r;   c                    s   dd | j d D }tjj| jddd }t|t	 }|| }|r9t
ddfd	d
|D ttjj| jddd }t| t 	 }|| }|rjt
dd fdd
|D | j d S )Nc                 S      h | ]}|j qS r9   rC   rW   xr9   r9   r:   r          z,ClasseForm.clean_matieres.<locals>.<setcomp>ro   rg   matiere__pkmatiere__nomcompletu_   Vous ne pouvez pas retirer la/les matière(s): {} elles contiennent des notes dans cette classez, c                 3       | ]} | V  qd S rx   r9   r   )matieresNotesDictr9   r:   	<genexpr>       z,ClasseForm.clean_matieres.<locals>.<genexpr>)creneau__classeu`   Vous ne pouvez pas retirer la/les matière(s): {} elles contiennent des colles dans cette classec                 3   r   rx   r9   r   )matieresCollesDictr9   r:   r      r   )rH   r   rE   rF   rG   values_listdistinctdictr`   keysr   formatr   r   )rK   
matieresPkmatieresNotesmatieresNotesSetdiffmatieresCollesmatieresCollesSetr9   )r   r   r:   clean_matieres   s   " "
zClasseForm.clean_matieresc                    Z   | j d r| j d | j d vrtd| j d r&| j d | j d vr&tdt   d S Nr   ro   u/   L'option 1 doit être une matière de la classer   u/   L'option 2 doit être une matière de la classerH   r   ry   rM   rK   r~   r9   r:   rM      
   zClasseForm.clean)r4   r5   r6   rz   r;   r   rM   r   r9   r9   r~   r:   r      s
    r   c                       s   e Zd Z fddZejdddZee	
ed Zedd ed	D Zg ZeD ]'Zed
\ZZeed e d edkrDdnd d edd eef q,ejd	edZG dd dZ fddZ fddZ  ZS )ClasseGabaritFormc                    r   r   r   r   r~   r9   r:   rz      r   zClasseGabaritForm.__init__gabaritFr   requiredzclasses.xmlc                 C   s$   h | ]}| d d | d qS )type_r   )getr   r9   r9   r:   r      s   $ zClasseGabaritForm.<setcomp>rg   r       è1rmu   e annéec                    s    fdd| dD S )Nc                    sL   g | ]"}| d | dg dkr| dd | d | dfqS )r   r   r   r   )r   splitr   yr9   r:   rY      s   L z.ClasseGabaritForm.<lambda>.<locals>.<listcomp>rg   )findall)r   zr9   r   r:   <lambda>       zClasseGabaritForm.<lambda>r   choicesc                   @   r   )zClasseGabaritForm.Metar   ro   Nr   r9   r9   r9   r:   r;      r   r;   c                    r   r   r   r   r~   r9   r:   rM      r   zClasseGabaritForm.cleanc              	      s(  | j d r| j d d\}}t|}| jd|| }t| j d |dd}|	  g }t
|D ]O}tjj|dt|dt|d	pKd
d}| rX|d
 }n't|dt|d|d	pid
tt
ttj d
 d}t||_|	  || q5|jj|  d S t 	  d S )Nr   rg   r   zclasse[@nom='{}'][@annee='{}']r   r   )r   r   tempsr   r   )nom__iexactr   r   )r   r   r   couleur)rH   r   inttreer   r   popr   r   rn   listr   rE   rF   rJ   r   r   LISTE_COULEURSstr
nomcompletappendro   addry   )rK   r   r   rg   nouvelleClasselisteMatieresrf   rL   r~   r9   r:   rn     s"   
0
<
zClasseGabaritForm.save)r4   r5   r6   rz   r   BooleanFieldr   etreeparser   r   r   getrootr   sortedr   typesLISTE_CLASSEStypr   styler   r   ChoiceFieldrg   r;   rM   rn   r   r9   r9   r~   r:   r      s    >r   c                       s*   e Zd ZG dd dZ fddZ  ZS )MatiereFormc                   @   r$   )zMatiereForm.Meta)r   r   r   r   plancheN)r4   r5   r6   r   r7   r8   r9   r9   r9   r:   r;     r<   r;   c                    s$   t  jdd}t||_|  d S )NF)commit)ry   rn   r   r   )rK   rg   r~   r9   r:   rn     s   
zMatiereForm.save)r4   r5   r6   r;   rn   r   r9   r9   r~   r:   r    s    r  c                   @   r"   )EtabFormc                   @      e Zd ZeZdgZdS )zEtabForm.Metar   N)r4   r5   r6   r   r7   r8   r9   r9   r9   r:   r;   "      
r;   Nr=   r9   r9   r9   r:   r	  !  r>   r	  c                   @   sn   e Zd Ze Zeee d Zdd eZdd eD Z	e
ee	ZejdedZG dd	 d	Zd
d ZdS )SemaineFormdaysc                        fddt ddD S )Nc                       g | ]} t d | d qS    r  r   r   r   r9   r:   rY   *      z(SemaineForm.<lambda>.<locals>.<listcomp><   ranger   r9   r   r:   r   *  r   zSemaineForm.<lambda>c                 C      g | ]}| d qS z%d %B %YstrftimerW   dr9   r9   r:   rY   +  rZ   zSemaineForm.<listcomp>lundir   c                   @   r
  )zSemaineForm.MetanumeroN)r4   r5   r6   r   r7   r8   r9   r9   r9   r:   r;   /  r  r;   c                 C   s*   | j d | j_| j d | j_| j  d S )Nr  r   )rH   rG   r  r   rn   r   r9   r9   r:   rn   3  s   zSemaineForm.saveN)r4   r5   r6   r   todaybaser   weekdayliste1liste2r   LISTE_LUNDISr   r  r  r;   rn   r9   r9   r9   r:   r  &  s    
r  c                   C   s0   zdd t jdD W S  ty   g  Y S w )Nc                 S   s   g | ]}|j d |j fqS )zS{})r   r   )rW   semainer9   r9   r:   rY   :  r  z get_semaines.<locals>.<listcomp>r   )r   rE   order_byr   r9   r9   r9   r:   get_semaines8  s
   r)  c                   @   s$   e Zd ZejdeddZdd ZdS )SemestreFormu   début du second semestreFr   r   r   c                 C   s   t j j| jd d d S )Nsemestre)	semestre2)r   rE   allupdaterH   r   r9   r9   r:   rn   A  s   zSemestreForm.saveN)r4   r5   r6   r   r  r)  r,  rn   r9   r9   r9   r:   r*  >      r*  c                   @   s   e Zd Ze Zeee d Zdd eZdd eD Z	e
eee	ZejdeddZejd	eed
ded
dddZejddedejddiddZdd ZdS )GenereSemainesFormr  c                    r  )Nc                    r  r  r  r   r   r9   r:   rY   H  r  z/GenereSemainesForm.<lambda>.<locals>.<listcomp>r  r  r  r   r9   r   r:   r   H  r   zGenereSemainesForm.<lambda>c                 C   r  r  r  r  r9   r9   r:   rY   I  rZ   zGenereSemainesForm.<listcomp>u   première semaineTr+  znombre de semainesr   )   u   semaines à retirer (vacances)u0   Maintenir CTRL enfoncé pour sélection multipleFsize20attrs)r   	help_textr   r   r   c                 C   s   g }d}t | jd }| jd }| jd }|r*|d |k r*|d |r*|d |k st|}d}|r;t|d}||k rl|rR||krR|sIdnt|d}n|t|d |d |d7 }|tdd	 }||k s?tj	| d S )
Nr   nb_semainespremiere_semaineno_semainesFr   )r   r  r  r  )
r   rH   r   r   fromisoformatr   r   r   rE   bulk_create)rK   semainesnombre_semainesnombre_totalsemaine_courantediff_semainesdiff_semainer9   r9   r:   rn   O  s(   



zGenereSemainesForm.saveN)r4   r5   r6   r   r!  r"  r   r#  r$  r%  r   r   r&  r   r  r9  r  r8  MultipleChoiceFieldSelectMultipler:  rn   r9   r9   r9   r:   r1  D  s    " r1  c                   @   r"   )JourFerieFormc                   @   s"   e Zd ZeZddgZde iZdS )zJourFerieForm.Metar   r   N)r4   r5   r6   r	   r7   r8   r   r   r9   r9   r9   r:   r;   f  r   r;   Nr=   r9   r9   r9   r:   rE  e  r>   rE  c                       s$   e Zd Z fddZdd Z  ZS )ColleurFormc                    s  | d| _t j|i | d}tjddd| jd< tjddd| jd< tjd	dd
d| jd< tjdd
d| jd< tjddd
d| jd< tjdddd| jd< tj	|d| jd< tj
tjddd
d| jd< tjdtjdd
d| jd< tjd tjd!dd
d| jd"< d S )#NrD   ))r   autre)r   	   certifié)   bi-admissible)      agrégé)      chaire supérieureNom   )r   
max_lengthri      Prénomrh   r   Fr   rQ  r   rl   actifr   r   zemail(facultatif)2   rj   Identifiant   TrT   r   rd   r   inconnur   empty_labelr   re      Matière(s)r   r   r   rf   	Classe(s)r   rg   )r   rD   ry   rz   r   r   r8   r   
EmailFieldr  ModelChoiceFieldr   rE   r(  ModelMultipleChoiceFieldr   r   )rK   r|   r}   LISTE_GRADEr~   r9   r:   rz   l  s   $zColleurForm.__init__c                 C   N   t  }d| jv r| jd |_d| jv r| jd |_| jd }|r%t|| |S Nrh   ri   rl   r
   rH   rh   ri   r   rK   rs   datar9   r9   r:   clean_motdepasse|     



zColleurForm.clean_motdepasse)r4   r5   r6   rz   rh  r   r9   r9   r~   r:   rF  k  s    rF  c                   @   s   e Zd Zeg dZejedZeje	j
ddddZejdej
dddZejd	ej
d
dddZG dd dZdd ZdS )ColleurFormMdp)rG  rH  rJ  rL  rN  rX  r   rY  FrZ  r\  r]  r^  r   c                   @   r$   )zColleurFormMdp.Meta)rh   ri   rT   rl   rj   r   Nr4   r5   r6   r
   r7   r8   r9   r9   r9   r:   r;     r<   r;   c                 C   J   t  }d| jv r| jd |_d| jv r| jd |_| jd }t|| |S rd  re  rf  r9   r9   r:   clean_password     



zColleurFormMdp.clean_passwordN)r4   r5   r6   	enumeraterb  r   r  rd   r`  r   rE   r(  re   ra  r   rf   r   rg   r;   rm  r9   r9   r9   r:   rj    s    rj  c                       sL   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )	EleveFormc                    s  | d| _t j|i | tjdddd| jd< tjdddd| jd< tjd	d
dd| jd< tjdddd| jd< tjdddd| jd< tjddg dtj	ddidd| jd< tjdddd| jd< tjdddd| jd< t
ddd d!| jd"< tjtjd#d$d d%| jd&< tjtjjd'd(d$d)dd*| jd+< tjtjjd,d(d$d)dd*| jd-< tjtjd$d)dd*| jd.< tjd/dd0| jd1< d S )2NrD   rO  rP  TrS  ri   rR  rh   rV  rW  rT   r   Frl   zEmail(Facultatif)rU  rj   )Date de naissance (pour ECTS, facultatif)%d/%m/%Yz%j/%m/%Yz%d/%n/%Yz%j/%n/%Yplaceholder
jj/mm/aaaar5  r   r   input_formatsr   r   )lieu de naissance (pour ECTS, facultatif)r   r   rQ  r   )   N° étudiant INE (pour ECTS, facultatif)   r   photo(jpg/png, 300x400)@KL r   r   max_upload_sizer   r   r   r   r[  rg   r   r   ----rZ  r   rI  r   r   
redoublantr   r   )r   rD   ry   rz   r   r   r8   r_  	DateField	TextInputr   r`  r   rE   r(  r   rF   r   r   r~   r9   r:   rz     s    (&&zEleveForm.__init__c                 C   s2   | j d }tjj|dj| jd rtd|S )NrT   rS   )	eleve__pku   identifiant déjà existant)rH   r
   rE   rF   rI   rD   rJ   r   rK   rg  r9   r9   r:   clean_username  s   
zEleveForm.clean_usernamec                 C   rc  rd  re  rf  r9   r9   r:   rh    ri  zEleveForm.clean_motdepassec                 C   2   | j d }|d ur|| j d j vrtd|S Nr   rg   =   Cette langue ne fait pas partie des matières de cette classerH   ro   r.  r   r  r9   r9   r:   	clean_lv1  
   
zEleveForm.clean_lv1c                 C   r  Nr   rg   r  r  r  r9   r9   r:   	clean_lv2  r  zEleveForm.clean_lv2c                 C   :   | j d }|d ur|| j d j| j d jfvrtd|S Nr   rg   u=   Cette matière ne fait pas partie des options de cette classerH   r   r   r   r  r9   r9   r:   clean_option  
   
zEleveForm.clean_optionc                 C      | j d }|rJt|dkrtdzt|d d }|dks#t|ts'tdW n ty3   tdw dt|d   krEd	ksJtd
 td
|S )Nr   r{  .   le numéro d'étudiant comporte 11 caractèresr   5   les 9 premiers caractères doivent être des chiffresA   Z   u.   le dernier caractère est une lettre majusculerH   r_   r   r   
isinstancer   ordrK   rg  lr9   r9   r:   	clean_ine  "   
zEleveForm.clean_ine)r4   r5   r6   rz   r  rh  r  r  r  r  r   r9   r9   r~   r:   rp    s    rp  c                   @   s  e Zd Zejddg dejddiddZejddd	d
Zejdddd
Z	e
ddddZejejddddZejejjddddddZejejjddddddZejejddddZejdddZG dd dZdd Zdd  Zd!d" Zd#d$ Zd%d& ZdS )'EleveFormMdprq  Frr  rt  ru  r5  rv  rx  rU  ry  rz  r{  r|  r}  r~  r   r   Nr  r   r   r  rZ  rI  r  r   c                   @   r$   )zEleveFormMdp.Meta)rh   ri   rT   rl   rj   Nrk  r9   r9   r9   r:   r;     r<   r;   c                 C   r  r  r  r  r9   r9   r:   r    r  zEleveFormMdp.clean_lv1c                 C   r  r  r  r  r9   r9   r:   r    r  zEleveFormMdp.clean_lv2c                 C   r  r  r  r  r9   r9   r:   r    r  zEleveFormMdp.clean_optionc                 C   rl  )Nprenomr   
motdepassere  rf  r9   r9   r:   rh    rn  zEleveFormMdp.clean_motdepassec                 C   r  )Nr   r{  r  r  r   r  r  r  r  u4   le dernier caractère est une lettre ASCII majusculer  r  r9   r9   r:   r    r  zEleveFormMdp.clean_ine)r4   r5   r6   r   r  r  r   r   r   r   r   r   r`  r   rE   r(  rg   r   rF   r   r   r   r   r   r;   r  r  r  rh  r  r9   r9   r9   r:   r    s     "  
r  c                       s,   e Zd Z fddZdd Zdd Z  ZS )ProfFormc                    s   t  j|i | || _|j D ]}tjj||dddd}t	j
t||dd| jt|j< qtjj|dd}t	jd|dd| jd< d S )	NT)ro   rp   user__is_activeuser__last_nameFr]  )rp   r  zprof principalprofprincipal)ry   rz   rg   ro   r.  r   rE   rF   r(  r   ra  r   r8   rD   r`  )rK   rg   r|   r}   rf   rL   query2r~   r9   r:   rz   #  s   "zProfForm.__init__c                    s@    j d }|dur| fdd jj D vrtddS dS )uK   Vérifie que le prof principal est bien choisi parmi les profs de la classer  Nc                    s&   g | ]} j t|j D ]}|qqS r9   rH   r   rD   rW   rf   rk   r   r9   r:   rY   /  s   & z"ProfForm.clean.<locals>.<listcomp>zFle professeur principal doit faire partie des professeurs de la classe)rH   rg   ro   r.  r   )rK   	profprincr9   r   r:   rM   ,  s   
&zProfForm.cleanc                    s    j j D ]}tjj j |dj jt|j	 d
  q fdd j j D }tj }|D ]\}}tjj j ||d sPtjj j ||j|j|d q2 jd r^ jd  j _nd j _ j   dS )	u9   Sauvegarde en base de données les données du formulairerg   rf   )colleur__inc                    s*   g | ]} j t|j D ]}||fqqS r9   r  r  r   r9   r:   rY   6  s   * z!ProfForm.save.<locals>.<listcomp>)rg   rf   rk   )rg   rf   modifgroupemodifcolloscoperk   r  N)rg   ro   r.  r   rE   rF   rI   rH   r   rD   r   r   
get_configrJ   creater,   r*   r  rn   )rK   rf   matieres_avec_profconfigrk   r9   r   r:   rn   2  s   ,

zProfForm.save)r4   r5   r6   rz   rM   rn   r   r9   r9   r~   r:   r  "  s    	r  c                   @   s   e Zd Zdd ZdS )CustomMultipleChoiceFieldc                  O   s   dS )N r9   )r|   r}   r9   r9   r:   label_from_instanceD  s   z-CustomMultipleChoiceField.label_from_instanceN)r4   r5   r6   r  r9   r9   r9   r:   r  C  s    r  c                       s   e Zd Zd fdd	Z  ZS )SelectColleurFormNr  c                    s   t  j|i | tj}|r|j|d}|r|j|d}|r+|t|dt|dB }|ddd}t|dtj	d	| j
d
< d | j
d
 _d S )N)ro   )rp   user__first_name__icontainsuser__last_name__icontainsr  user__first_nameuser__pkTr   r   r   rk   )ry   rz   r   rE   rF   r   r(  r  r   r   r8   r[  )rK   rf   rg   patternr|   r}   rL   r~   r9   r:   rz   H  s   zSelectColleurForm.__init__)NNr  r4   r5   r6   rz   r   r9   r9   r~   r:   r  G      r  c                   @   s$   e Zd ZejddddZdd ZdS )ChercheUserFormrO  F(   ry  c                 C   s   | j d  S )Nr   )rH   rq   r   r9   r9   r:   	clean_nomX  s   zChercheUserForm.clean_nomN)r4   r5   r6   r   r   r   r  r9   r9   r9   r:   r  U  r0  r  c                       s   e Zd Zd fdd	Z  ZS )SelectEleveFormNTr  c           	         s  t  j|i | |r?tjj|ddddd}tjj|d}t|jr'|jj	nd |j
r/|j
j	nd fd h }|r>|j|d}n2tjdddd}tdd	 tj D td
d	 tj D B d h }dd |D }tjj|d}|r|t|dt|dB }|r|ddd}n|ddd}t|dtjd| jd< d | jd _tjtjdddd| jd< d | jd _tjdddgd| jd< tjtjjddddd| jd< tjtjjd dddd| jd< tj|ddd| jd!< d S )"Nr   rs   rg   r   r   matieresclasse)pk__inc                 S      g | ]}|j qS r9   )r   rW   rg   r9   r9   r:   rY   g  r   z,SelectEleveForm.__init__.<locals>.<listcomp>c                 S   r  r9   )r   r  r9   r9   r:   rY   g  r   c                 S   r   r9   rC   r   r9   r9   r:   r   h  r   z+SelectEleveForm.__init__.<locals>.<setcomp>r  r  classe__nomr  r  Tr  r   r   r   F)r   r   klasse)Tr  )Fznon redoublantr   r   r   r   rI  r   )ry   rz   r   rE   rF   select_relatedr   r`   r   rD   r   r   r.  r   r(  r  r   r   r8   r[  r`  r  )	rK   r  trir  r|   r}   rL   r  
options_pkr~   r9   r:   rz   ]  s2   .6$$zSelectEleveForm.__init__)NTr  r  r9   r9   r~   r:   r  \  r  r  c                   @   s*   e Zd ZejdZejdedddZ	dS )ClasseSelectFormr   r   ToutesFr   r   r[  r   N)
r4   r5   r6   r   rE   r(  rL   r   r`  rg   r9   r9   r9   r:   r  y  s    r  c                   @   sH   e Zd ZejdejddddZejde	jddddZ
dd Zd	S )
MatiereClasseSelectForm   Matièrer   r  Fr  r   c                 C   s`   | j d d ur*| j d d ur,| j d | j d j vr.td| j d | j d ddd S d S d S )Nrg   rf   u6   la classe %(classe)s n'a pas pour matière %(matiere)sr  )paramsr  r   r9   r9   r:   rM     s   6zMatiereClasseSelectForm.cleanN)r4   r5   r6   r   r`  r   rE   r(  rf   r   rg   rM   r9   r9   r9   r:   r  }  s    r  c                   @   s  e Zd ZejddddZejddddZejddddZejd	dd
Z	ejddddZ
ejddd
ZejddddZejddd
ZejddddZejddd
ZejddddZejddd
ZejddddZejddd
ZejddddZejddd
ZejddddZejddd
ZejddddZejddd
Zejddd
ZejddddZejd d!ej d"d#dd$Z!d%d& Z"d'd( Z#d)S )*CsvForm   intitulé du champ nomTrP  ry     intitulé du champ prénom   intitulé du champ emailFr  rj   r   u   intitulé du champ classerg      intitulé du champ identifiantr      intitulé du champ mot de passemot de passeu   intitulé du champ lv1r   u   intitulé du champ lv2r   u0   intitulé du champ date de naissance (pour ECTS)zdate de naissanceu0   intitulé du champ lieu de naissance (pour ECTS)rU  zlieu de naissanceu*   intitulé du champ numéro INE (pour ECTS)INEFichier csvimport directm   (cocher si le fichier csv contient déjà toutes les infos nécessaires et qu'il     n'y a rien à retoucher)r   r   r7  r   u:   (ignoré si la classe est importée depuis le fichier csv)r      Non définier   r7  r   r[  r   c                    sH  | j d r| j d r| j d stdt| j d jdd{}t |d}| j d	 | j d
 h| _| j d rB| j	| j d  | j d rP| j	| j d  | j d r^| j	| j d  | j d rl| j	| j d  | j d rz| j	| j d  | j d r| j	| j d  | j d r| j	| j d  | j d r| j	| j d  | j d r| j	| j d  tj
||d}|d t|  fdd| jD }|rtd|g | _g | _g | _|d t| t|D ]\} t }d  } } }	 }
 }}| j d r2 | j d  }|d!kr2ztjj| d"|d#< W n ty1 } ztt|d }~ww d#|vr\| j d# d ur\z	| j d# |d#< W n ty[ } ztt|d }~ww | j d r | j d  }|d!krz&tjjd$| d%}d#|v r|j|d# d&}| }|r|d |d< W n ty } ztt|d }~ww | j d r | j d  }|d!krz&tjjd'| d%}	d#|v r|	j|d# d&}	|	 }|r|d |d< W n ty } ztt|d }~ww | j d rz | j d  |d< W n ty } ztt|d }~ww | j d rJ | j d  }|d!krJz
t|d(|d< W n tyI } ztd)|d }~ww | j d roz | j d  |d< W n tyn } ztt|d }~ww z| jtd/i | W n ty } ztt|d }~ww |   z | j d	  |d*< W n ty } ztt|d }~ww z | j d
  |d+< W n ty } ztt|d }~ww | j d r | j d  }|d!kr| j d rtd,||d!krz||d-< W n ty } ztt|d }~ww | j d r< | j d  }|d!kr<z||d< W n ty; } ztt|d }~ww z	t!d/i |}W n tyX } ztt|d }~ww | j| d!}| j d r | j d  }|d!kr| j d rtd.|| j d rt"| | j| qW d    d S 1 sw   Y  d S )0NimportdirectgetidentifiantgetmotdepasseUPour un import direct il faut valider au moins les champs identifiant et mot de passer   z	utf-8-sigencoding   r   r  getemailrj   r   r  	getclasse	nomclassegetlv1r   getlv2r   getldnr   getddnr   getiner   dialectr   c                       g | ]}| vr|qS r9   r9   r   ligner9   r:   rY     r   z!CsvForm.clean.<locals>.<listcomp>4   Les intitulés des champs suivants sont inexacts: {}Fr  r   rg   r   )r   r   r  rI  rs  u=   la date de naissance de l'élève à la ligne {} est invalideri   rh   u1   il manque l'identifiant pour l'élève de rang {}rT   u3   il manque le mot de passe pour l'élève de rang {}r9   )#rH   r   r    filecsvSniffersniffreadchampsr   
DictReaderseeknextr   userselevesmdpro  r   r   rE   r   rq   r   r   r   rF   r.  r   strptimer   r   clearr
   r   )rK   
fichiercsvr  readererreursir|   eleveclasseelevelv1elevelv2eleveddneleveldneleveinedonneeero   rs   r  r9   r  r:   rM     sD  


















$zCsvForm.cleanc                 C   s   | j d r>t + t| j| j| jD ]\}}}|  ||_|	| qt
j| j W d    d S 1 s7w   Y  d S d S Nr  )rH   r   rm   r   r  r  r  rn   r   rr   r
   rE   r<  )rK   rs   r   r  r9   r9   r:   rn   '  s   

"zCsvForm.saveN)$r4   r5   r6   r   r   r   r  rj   r   r  r  r  r   r  r  r  r   r  r   r  r   r  r   r  r   r  	FileFieldr   r  r`  r   rE   r(  rg   rM   rn   r9   r9   r9   r:   r    s6     r  c                   @   s(  e Zd ZejddddZejddddZejddddZejddd	Z	ejd
dddZ
ejddd	ZejddddZejddd	ZejddddZejddd	ZejddddZejddd	Zejddd	ZejddddZejddejddddZejddejddddZdd Zdd  Zd!S )"CsvColleurFormr  TrP  ry  r  r  Frj   r   u   intitulé du champ classesrg   r  r   r  r  u   intitulé du champ matièresu	   matièresr  r  r  r  r   uK   (ignoré si la/les classe(s) est (sont) importée(s) depuis le fichier csv)r   r  r  r  uK   (ignoré si la/les matières est (sont) importée(s) depuis le fichier csv)c                    s  | j d r| j d r| j d stdt| j d jdd}t |d}| j d	 | j d
 h| _| j d rB| j	| j d  | j d rP| j	| j d  | j d r^| j	| j d  | j d rl| j	| j d  | j d rz| j	| j d  tj
||d}|d t|  fdd| jD }|rtd|g | _g | _g | _g | _|d t| t|D ]\} t }g }g }| j d rdd  | j d  dD }	|	dgkrztdd |	}	tdd |	}	tj|	}W n ty }
 ztt|
d }
~
ww |s,| j d r,z| j d g}W n ty+ }
 ztt|
d }
~
ww | j d rqdd  | j d  dD }	|	dgkrqztd d |	}	td!d |	}	tj|	}W n typ }
 ztt|
d }
~
ww |s| j d" rz| j d" g}W n ty }
 ztt|
d }
~
ww z| j| | j| W n ty }
 ztt|
d }
~
ww |  z | j d	  |d#< W n ty }
 ztt|
d }
~
ww z | j d
  |d$< W n ty }
 ztt|
d }
~
ww | j d r8 | j d  }	|	dkr| j d rtd%||	dkr8z|	|d&< W n ty7 }
 ztt|
d }
~
ww | j d rd | j d  }	|	dkrdz|	|d< W n tyc }
 ztt|
d }
~
ww z	td(i |}W n ty }
 ztt|
d }
~
ww | j| d}| j d r | j d  }|dkr| j d rtd'|| j d rt | | j| qW d    d S 1 sw   Y  d S ))Nr  r  r  r  r   utf8r  r  r   r  r  rj   r   r  
getclasses
nomclassesgetmatieresnommatieresr  r   c                    r  r9   r9   r   r  r9   r:   rY   Y  r   z(CsvColleurForm.clean.<locals>.<listcomp>r  c                 S   s   g | ]}|   qS r9   )striprq   r   r9   r9   r:   rY   g  r   ;r  c                 S   
   t | dS )Nr  r   nr9   r9   r:   r   j     
 z&CsvColleurForm.clean.<locals>.<lambda>c                 S      | |B S rx   r9   abr9   r9   r:   r   k      rg   c                 S   s   g | ]}|  qS r9   )r  r   r9   r9   r:   rY   u  s    c                 S   r   )N)nomcomplet__iexactr   r!  r9   r9   r:   r   x  r#  c                 S   r$  rx   r9   r%  r9   r9   r:   r   y  r(  rf   ri   rh   z2il manque l'identifiant pour le colleur de rang {}rT   z4il manque le mot de passe pour le colleur de rang {}r9   )!rH   r   r    r  r  r  r  r   r  r   r  r  r  r   r  rp   ro   r  ro  r   r   mapr!   r   rE   rF   r   r   r   r   r	  r
   r   )rK   r
  r  r  r  r  r|   rp   ro   r  r  rs   r  r9   r  r:   rM   E  s   








$zCsvColleurForm.cleanc                 C   s   | j d rTt A t| j| j| j| jD ]%\}}}}t }|	  |jj
t|  |jj
t|  ||_|| qtj| j W d    d S 1 sMw   Y  d S d S r  )rH   r   rm   r   r  rp   ro   r  r   rn   r   r   rk   rr   r
   rE   r<  )rK   rs   rp   ro   r  rk   r9   r9   r:   rn     s   

""zCsvColleurForm.saveN)r4   r5   r6   r   r   r   r  rj   r   r  r  r  r   r  r  r  r  r  r  r   r  r`  r   rE   r(  rg   r   rf   rM   rn   r9   r9   r9   r:   r  1  s&    ir  )Odjangor   accueil.modelsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   django.forms.widgetsr   django.core.exceptionsr   'django.contrib.auth.password_validationr   	django.dbr   django.db.modelsr   ecolle.settingsr   r   	xml.etreer   r   randomr   osr   r   r   r   r   r  _ior    	functoolsr!   	ModelFormr#   r?   BaseFormSetrO   rv   r   r   Formr   r   r   r  r	  r  r)  r*  r1  rE  rF  rj  rp  r  r  ra  r  r  r  r  r  r  r  r  r9   r9   r9   r:   <module>   sZ   @)C$0
!I=! -