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mZmZmZmZmZmZmZ d dlmZmZ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' d d	l(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d d
l/m0Z0m1Z1 d dl2m3Z3 d dl4m4Z4 d dl5m6Z6 d dl7Z7d dl8Z8d dl9m:Z: d dl;m;Z; d dl<m=Z= G dd dej>Z?G dd dej@ZAG dd dejBZCG dd dejDZEG dd dej@ZFG dd dej@ZGG dd dejBZHG d d! d!ej@ZIG d"d# d#ej@ZJG d$d% d%ej@ZKG d&d' d'ejBZLG d(d) d)ej@ZMG d*d+ d+ej@ZNG d,d- d-ejOZPG d.d/ d/ej@ZQG d0d1 d1ejOZRG d2d3 d3ej@ZSG d4d5 d5ej@ZTG d6d7 d7ejBZUG d8d9 d9ej@ZVG d:d; d;ejOZWG d<d= d=ejXZXG d>d? d?ejBZYG d@dA dAejBZZG dBdC dCej@Z[G dDdE dEej@Z\G dFdG dGejBZ]G dHdI dIejBZ^G dJdK dKejBZ_G dLdM dMejBZ`G dNdO dOejBZaG dPdQ dQej@ZbG dRdS dSej@ZcdS )T    )forms)ColleurColleNoteSemaine	ProgrammeEleveCreneauMatiereGroupeMatiereECTSNoteECTSNoteGlobaleECTSDevoirDevoirCorrigeDevoirRenduTDCoursDocumentConfigPlancheClasse)QCountValue)Coalesce)date	timedelta)SelectDateWidget)ValidationError)ElementTree)RESOURCES_ROOT
MEDIA_ROOTIMAGEMAGICKHEURE_DEBUT	HEURE_FIN
INTERVALLE)isfilejoin)remove)copy)TextIOWrapperN)ZipFile)	unidecode)ContentFilec                   @      e Zd Zdd ZdS )CustomMultipleChoiceFieldc                  O   s   dS )N  )argskwargsr2   r2   '/home/reyt/e-colle-new/colleur/forms.pylabel_from_instance   s   z-CustomMultipleChoiceField.label_from_instanceN__name__
__module____qualname__r6   r2   r2   r2   r5   r0          r0   c                   @   s(   e Zd ZejddZejdejdZdS )ColleurConnexionFormIdentifiant)labelzMot de passe)r>   widgetN)r8   r9   r:   r   	CharFieldusernamePasswordInputpasswordr2   r2   r2   r5   r<      s    r<   c                       s>   e Zd ZG dd dZ fddZdd Z fddZ  ZS )	ProgrammeFormc                   @   "   e Zd ZeZg dZdejiZdS )zProgrammeForm.Meta)semainetitredetailfichierrF   N)	r8   r9   r:   r   modelfieldsr   CheckboxSelectMultiplewidgetsr2   r2   r2   r5   Meta       rN   c                    sx   t  j|i | || _|| _tjj||d}| jr"|j| jj	d}t
|jddd }tjj|d}|| jd _d S )NclassematierepkrF   Tflat)
numero__in)super__init__rR   rQ   r   objectsfilterinstanceexcluderT   listvalues_listdistinctr   rK   queryset)selfrR   rQ   r3   r4   queryquery2	__class__r2   r5   rY   #   s   zProgrammeForm.__init__c                 C   sZ   | j d }tjj|| jj| jjd}| jjr|j| jjd}|	 r+t
ddd|id|S )NrF   )semaine__inrQ   rR   rS   uK   Il existe déjà un programme de colle sur une des semaines sélectionnéesuniqueness violationvaluecodeparams)cleaned_datar   rZ   r[   r\   rQ   rR   rT   r]   existsr   )rb   semainesrc   r2   r2   r5   clean_semaine.   s   
zProgrammeForm.clean_semainec                    s|   t    | jd du r8tt| jjj}t|rt	| t
r:ttd| jjjdd  d }t|r<t	| d S d S d S d S )NrI   Fimage	   jpg)rX   cleanrm   r(   r"   r\   rI   namer'   r)   r#   )rb   rI   rq   re   r2   r5   ru   <   s   
 zProgrammeForm.clean)r8   r9   r:   rN   rY   rp   ru   __classcell__r2   r2   re   r5   rD      s
    rD   c                   @   r/   )MatiereChoiceFieldc                 C   s
   |j  S N)nomtitle)rb   rR   r2   r2   r5   r6   I   s   
z&MatiereChoiceField.label_from_instanceNr7   r2   r2   r2   r5   rx   H   r;   rx   c                       4   e Zd Z fddZdd Zdd Zdd Z  ZS )	Groupe2Formc           
         s  t  j|i | || _|| _|s(tjjd|dd}tjjd|dd}n*tjj|dtddt|dB d}tjj|dtddt|d	B d}t	t
jj|djd
dd}t	tdd| }|rq||jhO }t|}t||}tj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|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j|dd }| rtd|d dd| jd!< td|d dd| jd"< tjj|d#d }| rtd$|d dd| jd%< td$|d dd| jd&< |jd ur)|jjnd |jd ur4|jjnd hd h }	tjj|	d' }| rUtd(|d dd| jd)< d S d S )*NTgroupe__isnullrQ   user)groupe2__isnullrQ   rQ   r   groupe)r   groupe2rz   rU         r>   choicesu(   recopier les élèves au second semestreFr>   requiredidem   Premier élève   Élève fictifr>   ra   empty_labelr   eleve0   Deuxième élèveeleve1   Troisième élèveeleve2eleve20eleve21eleve22matieresclasselvLV1Toutlv11lv12   LV2lv21lv22pk__inOptionoption)rX   rY   r   rQ   r   rZ   r[   select_relatedr   setr   r_   rangerz   sortedzipr   ChoiceFieldrK   BooleanFieldModelChoiceFieldr
   r`   rn   rx   option1rT   option2)
rb   rQ   r   r3   r4   rc   rd   groupes_prisgroupesoptionsre   r2   r5   rY   M   sF   **

6
zGroupe2Form.__init__c                 C   P   | j d }tjj|| jd}| jr|j| jjd}| r&t	ddd|id|S u:   Validation du champ nom (unicité pour une classe donnée)rz   rz   rQ   rS   u    le nom %(value)s est déjà prisrh   ri   rj   
rm   r   rZ   r[   rQ   r   r]   rT   rn   r   rb   datarc   r2   r2   r5   	clean_nomr      
zGroupe2Form.clean_nomc                    sd    fddt dD } fddt dD }t|tt|ks*t|tt|kr0tddddS )	g   validation du formulaire. S'il y a deux fois le même élève (non fictif) on lève une ValidationErrorc                    <   g | ]}d  | jv r jd  | r jd  | qS eleve{}formatrm   .0irb   r2   r5   
<listcomp>      < z%Groupe2Form.clean.<locals>.<listcomp>   c                    r   )eleve2{}r   r   r   r2   r5   r      r   9   Un élève ne peut apparaître qu'une fois dans un grouperh   rk   Nr   lenr   r   )rb   eleveseleves2r2   r   r5   ru      s
   (zGroupe2Form.cleanc                    s    j r, j }tjj|djdd tjj|djdd tjj|jdj jd d nt jd  jd}|	  tjj fdd	t
d
D dj|d tjj fdd	t
d
D dj|d dS )9   sauvegarde en base de données les données du formulairer   Nr   rS   rz   rz   r   c                    2   g | ]} j d | dur j d | jqS r   Nrm   r   rT   r   r   r2   r5   r         2 z$Groupe2Form.save.<locals>.<listcomp>r   r   c                    r   )r   Nr   r   r   r2   r5   r      r   r   r   rZ   r[   updater   rT   rm   rQ   saver   rb   r   r2   r   r5   r      s    (,zGroupe2Form.saver8   r9   r:   rY   r   ru   r   rw   r2   r2   re   r5   r}   L   s
    %r}   c                       r|   )	
GroupeFormc                    s|  t  j|i | || _|| _|stjjd|dd}ntjj|dtddt|dB d}t	t
jj|djddd}t	td	d
| }|rQ||jhO }t|}t||}tj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j|d	d }| rtd|ddd| jd< tjj|dd }| rtd|ddd| jd< d S d S )NTr~   r   r   r   r   rz   rU   r   r   r   r   r   Fr   r   r   r   r   r   r   r   r   lv1r   r   lv2)rX   rY   r   rQ   r   rZ   r[   r   r   r   r   r_   r   rz   r   r   r   r   rK   r   r
   r`   rn   rx   )rb   rQ   r   r3   r4   rc   r   r   re   r2   r5   rY      s.   *
zGroupeForm.__init__c                 C   r   r   r   r   r2   r2   r5   r      r   zGroupeForm.clean_nomc                    s:    fddt dD }t|tt|krtddddS )r   c                    r   r   r   r   r   r2   r5   r      r   z$GroupeForm.clean.<locals>.<listcomp>r   r   rh   r   Nr   )rb   r   r2   r   r5   ru      s   zGroupeForm.cleanc                    s    j r! j }tjj|djdd tjj|jdj jd d nt jd  jd}|	  tjj fddt
d	D d
j|d dS )r   r   NrS   rz   r   r   c                    r   r   r   r   r   r2   r5   r      r   z#GroupeForm.save.<locals>.<listcomp>r   r   r   r   r2   r   r5   r      s    ,zGroupeForm.saver   r2   r2   re   r5   r      s
    r   c                   @   s   e Zd ZG dd dZdS )CreneauFormc                   @      e Zd ZeZg dZdS )zCreneauForm.Meta)jourheuresalleN)r8   r9   r:   r	   rJ   rK   r2   r2   r2   r5   rN          rN   N)r8   r9   r:   rN   r2   r2   r2   r5   r      s    r   c                   @   s   e Zd Zz!ejdZejeded dZ	ejedee
 d  dZW dS  eyC   ejej ddZ	ejej ddZY dS w )SemaineFormlundiNr   ra   r   initialr   ra   r   )r8   r9   r:   r   rZ   order_byrc   r   r   semincountsemax	Exceptionnoner2   r2   r2   r5   r      s    "r   c                          e Zd Z fddZ  ZS )	ColleFormc                    s  t  j|i | |j }tj }tjj|d	d}t
jj|d }ztj|d |d d| jd< W n tyH   tj|d d| jd< Y nw tj|d d| jd< tjdg d	tjd
| jd< ztj|d |d d| jd< W n ty   tj|d d| jd< Y nw ztj|d |d d| jd< W n ty   tj|d d| jd< Y nw dgtttdddd tddD  }dd tddD }	dd dD }
tjd|d| jd< tjd|
d| jd< tjd|	d| jd< d S )Nr   rz   r   r   rR   r   colleurzGroupe/Solo/Classe))r   r   )r   Solo)r   r   )r>   r   r?   GSCr   eleve)r   z	1 semainer   r   c                 S   s   g | ]}d  |qS )z{} semainesr   r   r2   r2   r5   r          z&ColleForm.__init__.<locals>.<listcomp>c                 S   s   g | ]
}|d  ||fqS )zde {} en {}r   r   r2   r2   r5   r      s    r      c                 S   s   g | ]	}|d  |fqS )zune semaine sur {}r   r   r2   r2   r5   r          )r   r   r         u   Duréer   dureeu
   Fréquence	frequencezPermutation des groupespermutation)rX   rY   matieresallr   rZ   r   r   r[   r   r   r   r   rK   r   r   RadioSelectr^   r   r   )rb   rQ   r3   r4   query1rd   query3query4DUREEPERMUTATION	FREQUENCEre   r2   r5   rY      s8   

*zColleForm.__init__r8   r9   r:   rY   rw   r2   r2   re   r5   r          r   c                       r   )	EleveFormc                    s6   t  j|i | tjdtjj|dd d| jd< d S )Nu   Élèver   )r>   ra   r   r   )rX   rY   r   r   r   rZ   r[   rK   rb   rQ   r3   r4   re   r2   r5   rY      s   $zEleveForm.__init__r
  r2   r2   re   r5   r     r  r  c                   @   s"   e Zd ZG dd dZdd ZdS )MatiereECTSFormc                   @   r   )zMatiereECTSForm.Meta)rz   	precisionprofs	semestre1	semestre2N)r8   r9   r:   r   rJ   rK   r2   r2   r2   r5   rN      r   rN   c                 C   sv   | j d du r| j d du rtdtjj| jj| j d | j d d}| jjr/|j| jjd}|	 r9td	d
ddS )u   validation du formulaire. On vérifie qu'au moins un des champs semestre1 ou semetre2 est non nul et que le triplet
        classe/nom/precision, sans compter la casse, est uniquer  Nr  u:   au moins un des champs de coefficient doit être précisérz   r  )rQ   nom__iexactprecision__iexactrS   u#   le couple nom/précision est uniquerh   r   )
rm   r   r   rZ   r[   r\   rQ   rT   r]   rn   rb   rc   r2   r2   r5   ru     s   "zMatiereECTSForm.cleanN)r8   r9   r:   rN   ru   r2   r2   r2   r5   r     s    r  c                       r   )SelectEleveFormc                    sV   t  j|i | tjj|dddd}tj|dtj	d| j
d< d | j
d _d S )Nr   r   user__last_nameuser__first_nameTra   r   r?   r   )rX   rY   r   rZ   r[   r   r   r   ModelMultipleChoiceFieldrL   rK   r   )rb   rQ   r3   r4   rc   re   r2   r5   rY     s   zSelectEleveForm.__init__r
  r2   r2   re   r5   r    r  r  c                   @   sD   e Zd Zejdgeed ddZejdgeed ddZdS )NoteEleveFormNz---ABCDEFFr   r   N)	r8   r9   r:   r   r   r^   	enumerater  r  r2   r2   r2   r5   r    s     r  c                       s*   e Zd Zg df fdd	Zdd Z  ZS )NoteEleveFormSetNc                    "   t  j|i | || _|| _d S ry   )rX   rY   chaine_elevesrR   )rb   r"  rR   r3   r4   re   r2   r5   rY        
zNoteEleveFormSet.__init__c                 C   s   t | | jD ]p\}}d|jv r@|jd dkr#tjjd| j|d  n|jd dv r@tjj|| jd|jd dd| j||j	d d|jv rv|jd dkrYtjjd	| j|d  q|jd dv rvtjj|| jd	|jd dd	| j||j	d qd
S )=   Sauvegarde (mise à jour) en BDD les notes ECTS du formulairer  r1   r   )semestrerR   r   012345)r   rR   r%  note)defaultsr%  rR   r   cuber  r   N)
r   r"  rm   r   rZ   r[   rR   deleteupdate_or_creater)  rb   formr   r2   r2   r5   r     s   
,
,zNoteEleveFormSet.saver8   r9   r:   rY   r   rw   r2   r2   re   r5   r     s    r   c                   @   s(   e Zd Zejdgeed ddZdS )NoteGlobaleEleveFormr  r  Fr  N)r8   r9   r:   r   r   r^   r  note_globaler2   r2   r2   r5   r/  -  s     r/  c                       s(   e Zd Zg f fdd	Zdd Z  ZS )NoteGlobaleEleveFormSetc                    s"   t  j|i | || _|| _d S ry   )rX   rY   r"  annee)rb   r2  r"  r3   r4   re   r2   r5   rY   1  r#  z NoteGlobaleEleveFormSet.__init__c                 C   s|   t | | jD ]5\}}d|jv r;|jd dkr"tjj| j|d  q|jd dv r;tjj|| j|jd d|| jd qdS )r$  r0  r1   )r2  r   r&  )r   r2  r'  )r(  r   r2  N)	r   r"  rm   r   rZ   r[   r2  r*  r+  r,  r2   r2   r5   r   6  s   
$zNoteGlobaleEleveFormSet.saver.  r2   r2   re   r5   r1  0  s    r1  c                       r   )ECTSFormc                    sx  t  j|i | tttd }dd |dD }t|}|	  g }d }|D ]'}|
d\}	}
||	d |
 d |
dkrCd	nd
 d tdd ||f q+|dD ]-}|j d t|d |d kr|jt|dkr|dd |d }qXttdttdf}ttdttdf}tjd||d| jd< tjdg dtjddidt dd| jd< tjddgd  d!gd  fd"| jd#< tjd$d%d& tt jd' t jd' D t jd| jd(< |jd krd)|jv rtjd*d+d,d-| jd.< n
tjd*d+d/| jd.< td0d1 || D r(tjd2d+d/| jd3< |jd kr:tjd4d+d/| jd5< d S d S )6Nzclasses.xmlc                 S   s$   h | ]}| d d | d qS )type_r2  )getr   xr2   r2   r5   	<setcomp>C     $ z$ECTSForm.__init__.<locals>.<setcomp>rQ   r5      è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 )r4  r2  r5  rz   )r6  splitr7  yr2   r5   r   J  s   L z7ECTSForm.__init__.<locals>.<lambda>.<locals>.<listcomp>rQ   )findall)rB  zr2   rA  r5   <lambda>J      z#ECTSForm.__init__.<locals>.<lambda>rz   r2  zproviseur.pngzproviseur.jpgzproviseuradjoint.pngzproviseuradjoint.jpgu   filière)r>   r   r   u   Date d'édition)%d/%m/%Yz%j/%m/%Yz%d/%n/%Yz%j/%n/%Yplaceholderz
jj/mm/aaaa)attrsrG  )r>   input_formatsr?   r   r   zsignature/tampon par:	Proviseurr   zProviseur adjointr   	signatureu   année scolairec                 S   s$   g | ]}|d  d ||d  fqS )r   z{}-{}r   r7  r2   r2   r5   r   S  r:  z%ECTSForm.__init__.<locals>.<listcomp>
   anneescolaire*u   classe étoileFT)r>   r   r   etoiler   c                 s       | ]}t |V  qd S ry   )r'   r7  r2   r2   r5   	<genexpr>X      z$ECTSForm.__init__.<locals>.<genexpr>z incruster le tampon/la signaturetamponu"   180 crédits pours les redoublantsr)  )rX   rY   etreeparser(   r!   getrootrC  r^   sortr@  appendr   rz   lowerr   r6  r2  intr   r   rK   	DateField	TextInputr   todaystrftimer   yearr   any)rb   rQ   r3   r4   treetypesLISTE_CLASSESdefaulttypstyler2  r8  imagesProviseurimagesProviseurAdjointre   r2   r5   rY   @  s8   >>2$@zECTSForm.__init__r
  r2   r2   re   r5   r3  ?  r  r3  c                       s$   e Zd Z fddZdd Z  ZS )SelectEleveNoteFormc                    s  t  j|i | |dkr8ttjj|djtdtdd	d
ddd	}tjj|djtd
d
d}nA|dkrgttjj|djtdtdd	d
ddd	}tjj|djtdd
d}nttjj|d	d
dd	}g }dd |D }dg}d}	|D ]-}
t|
jD ]}t|}||jt|f qtd|
j D ]}||	df |	d8 }	qqd}	 zt|}||jt|f |d7 }W n	 ty   Y nw qtd|d  D ]}||	df |	d8 }	qdd |D | _tj|tjdd| jd< tj|tjdd| jd< d S )Nr   r   groupe__nomd   )
groupe_nomr   rm  r  r  groupeelevenbrz   r   groupe2__nomgroupe2elevec                 S   s   g | ]}|j d |jfqS )z	Groupe {})rT   r   rz   r   r   r2   r2   r5   r   i      z0SelectEleveNoteForm.__init__.<locals>.<listcomp>)r   r   r   r   r   Tc                 S   s   g | ]}|j qS r2   ro  r7  r2   r2   r5   r   ~  s    F)r   r?   r   r   r   )rX   rY   iterr   rZ   r[   annotater   r   r   r   r   r   r   rp  nextrY  rT   strr   tailleGroupesr   MultipleChoiceFieldrL   rK   )rb   rQ   rn  r3   r4   rc   listeGroupeschoices_grouper   indexFictifr8  r   r   jmodulore   r2   r5   rY   ^  sH   4"4" 

zSelectEleveNoteForm.__init__c                 C   s"   | j d }t|dkrtd|S )Nr   r   uA   Vous ne pouvez pas noter plus de 3 élèves sur un même créneau)rm   r   r   )rb   r   r2   r2   r5   clean_eleve  s   
zSelectEleveNoteForm.clean_eleve)r8   r9   r:   rY   r  rw   r2   r2   re   r5   rj  ]  s    $rj  c                       *   e Zd ZG dd dZ fddZ  ZS )NoteElevesHeadFormc                   @   r   )zNoteElevesHeadForm.Meta)rF   r   r   	rattrapee
date_colleN)r8   r9   r:   r   rJ   rK   r2   r2   r2   r5   rN     r   rN   c                    sH   t  j|i | || _|| _|| _tdd tdD d| jd _d S )Nc                 S   s   g | ]}t  j| d  qS )r   )r   r^  r`  r   r2   r2   r5   r     rt  z/NoteElevesHeadForm.__init__.<locals>.<listcomp>rM  )yearsr  )	rX   rY   rR   r   rQ   r   r   rK   r?   )rb   rR   r   rQ   r3   r4   re   r2   r5   rY     s
   $zNoteElevesHeadForm.__init__)r8   r9   r:   rN   rY   rw   r2   r2   re   r5   r        r  c                       r   )NoteElevesTailFormc                    sd   t  j|i | || _ddg}|ttdtd tj|d| jd< tj	tj
dd| jd< d S )	N)r   zn.n)   Absr   )r   r'  F)r?   r   commentaire)rX   rY   r   extendr   r   r   r   rK   r@   Textarea)rb   r   r3   r4   
LISTE_NOTEre   r2   r5   rY     s   zNoteElevesTailForm.__init__r
  r2   r2   re   r5   r    r  r  c                       s8   e Zd Z fddZ fddZdd Zdd Z  ZS )	NoteElevesFormsetc                    r!  ry   )rX   rY   headFormr   )rb   r  r   r3   r4   re   r2   r5   rY     r#  zNoteElevesFormset.__init__c                    s0   t  |}| jr| j| |d< |S d|d< |S )uK   déterminer l'argument nommé 'eleve' à passer en paramètre du formulairer   N)rX   get_form_kwargsr   )rb   indexr4   re   r2   r5   r    s   z!NoteElevesFormset.get_form_kwargsc                 C   s  | j  s	td| j jd s%| j jd jtt| j jd d | j jd< tjj	| j jd | j j
| j jd d}| j jjrF|j| j jjd	}| }|t| j d
krWtd| j jjdkrtjj	| j jd | j j| j j
| jd}| j jjr|j| j jjd	}| }|rtddS dS )u   Vérifie que le colleur n'aura au final pas plus de 3 notes sur ce créneau et qu'il n'a pas déjà collé un des élève cette semaine dans cette matièrez+erreur dans dans la semaine/date/jeure/jourr  rF   r   )daysr  r   )r  r   r   rS   r   u/   Vous avez trop de notes sur ce créneau horaire   )rF   rR   r   	eleve__inuH   Vous avez déjà noté un des élèves cette semaine dans cette matièreN)r  is_validr   rm   r   r   r[  r   rZ   r[   r   r\   rT   r]   r   r   r   rR   tempsrn   )rb   nbNotesColleurnbNotesElever2   r2   r5   ru     s&   
,&
&
zNoteElevesFormset.cleanc                 C   s   | j j}|jr5| D ]%}|jd |_|jd |_|j|_| j j|_| j j|_| j j	|_	|
  q	|  dS g }| D ].}t|}|jd |_|jd |_|j|_| j j|_| j j|_| j j	|_	|
  || q9tj| dS )u(   sauvegarde en base de données les notesr'  r  N)r  r\   rT   rm   r'  r  r   rQ   rR   r   r   r   r*   rY  r   rZ   bulk_create)rb   r'  r-  notesnotebisr2   r2   r5   r     s.   






zNoteElevesFormset.save)r8   r9   r:   rY   r  ru   r   rw   r2   r2   re   r5   r    s
    	r  c                   @   s   e Zd ZdZdS )	DateInputr   N)r8   r9   r:   
input_typer2   r2   r2   r5   r    s    r  c                       2   e Zd ZG dd dZ fddZdd Z  ZS )
DevoirFormc                   @   s"   e Zd ZeZg dZde iZdS )zDevoirForm.Meta)numerorH   a_rendre_joura_rendre_heurerI   corriger  N)r8   r9   r:   r   rJ   rK   r  rM   r2   r2   r2   r5   rN     rO   rN   c                       t  j|i | || _|| _tjj||d}| jr"|j| jj	d}|j
ddd}dd tttdd	t| D | jd _d S )
NrP   rS   r  TrU   c                 S      g | ]}||fqS r2   r2   r   r2   r2   r5   r         z'DevoirForm.__init__.<locals>.<listcomp>r   e   )rX   rY   rR   rQ   r   rZ   r[   r\   r]   rT   r_   r   r   r   rK   r   rb   rR   rQ   r3   r4   rc   re   r2   r5   rY        0zDevoirForm.__init__c                 C   Z   t jj| jd | j| jd}| jr|j| jjd}|	 r+t
d| jd | j| jdS );   Vérifie la condition d'unicité de numéro/classe/matièrer  r  rR   rQ   rS   u8   il existe déjà un devoir n°{} dans la classe {} en {}N)r   rZ   r[   rm   rR   rQ   r\   r]   rT   rn   r   r   r  r2   r2   r5   ru        zDevoirForm.cleanr8   r9   r:   rN   rY   ru   rw   r2   r2   re   r5   r    s    
r  c                       r  )	CopieFormc                   @   s   e Zd ZeZddgZdS )zCopieForm.MetarI   r  N)r8   r9   r:   r   rJ   rK   r2   r2   r2   r5   rN     r   rN   c                    s6   | j d dv r| jjr| j  d S d S t   d S )NrI   )FN)rm   r\   idr*  rX   r   )rb   r3   r4   re   r2   r5   r     s
   zCopieForm.save)r8   r9   r:   rN   r   rw   r2   r2   re   r5   r    r  r  c                       ,   e Zd Z fddZdd Zdd Z  ZS )
CopiesFormc                    s0   t  j|i | || _tjddd| jd< d S )Nzfichier zipu(  déposer un fichier zip avec les copies corrigées ayant le même nom que les copies ramassées.         Si vous déposez une copie corrigée pour un élève qui en a déjà une, elle écrasera la précédente. Si un nom de fichier ne correspond pas à un nom de copie ramassée, il sera ignoré.)r>   	help_textrI   )rX   rY   devoirr   	FileFieldrK   )rb   r  r3   r4   re   r2   r5   rY     s   zCopiesForm.__init__c                 C   s   | j d }|jdkrtdt|-}| D ]}|jdd  dkr&td|jtjj	j
kr6td|jqW d    |S 1 sBw   Y  |S )NrI   zapplication/zipz*le fichier n'est pas un fichier zip validez.pdfz#le fichier n'est pas un fichier pdfz!le fichier {} est trop volumineux)rm   content_typer   r,   infolistfilename	file_sizer   rI   fieldmax_upload_sizer   )rb   rI   myzipinfor2   r2   r5   clean_fichier	  s   



zCopiesForm.clean_fichierc              
   C   s   t | jd e}| }|D ]U}tjj| jtd|d }|rct	jj| j|j
d }|r2|  ||$}t	|j
| jdd}|jj| t| dd |  W d    n1 s^w   Y  qW d    d S 1 sow   Y  d S )	NrI   r  )r  rI   )r  r   r1   )r   r  r  F)r   )r,   rm   namelistr   rZ   r[   r  r(   firstr   r   r*  openrI   r   update_namer.   read)rb   r  nomfichiers
nomfichiercopiecopiecorrigeemyfiler2   r2   r5   r     s    
"zCopiesForm.save)r8   r9   r:   rY   r  r   rw   r2   r2   re   r5   r    s    r  c                       r  )ColloscopeImportFormc                    sB   t  j|i | || _g | _g | _g | _tjddd| jd< d S )NzFichier csvTr   rI   )	rX   rY   rQ   entetecollesro   r   r  rK   r  re   r2   r5   rY   $  s   zColloscopeImportForm.__init__c           #   
      s  dd dd t jj| jd D }dd tjj| jdD }dd tjj| jd	D }d
ddddddd}td}tdtd}d
ddd}| jj	rWt
j j}nd}z]t| jd jdddE}	tj|	dd}
t|
| _zfdd| jdd  D | _W n ty   tdw t| j}|dkrtd g | _|
D ]}d
}t||krtd!t|d
  }||v r|| g}n
td"|| jjt|d   t|d   f}||v r|d
 j|| d v r||| d
  ntd#d$ || jj||d   !d$}|d
 |vr$td%|d
 |||d
   |d !d&}zd't"|d
  t"|d  }W n tyU   td(|d w || ||d  t#d)d* | j$ D }t%|dd  | jD ]\}}|dkr|d  qx|& sd+|v rg }'|D ]}|& rt"||v r||t"|  qtd,||d-|f qx| | jj kr|d.| jf qx||v r|d/|| f qx|d
 & rm|'|}g }|D ]a}t"(|) }d0d |'|D }|g krd1}n|d
 }tjj|| jd2}|* rW|+ }|j,|k r8t-|j./ }nt-|j0/ }|D ]}|| } | t|k rU|||   qAqt||krdt|}|d/|f qxtd3|| j|rt1|D ] |d d  fd4d|dd  D  }!| j|! q}q| j| qW d    W d S 1 sw   Y  W d S  ty }" ztt2|"d }"~"w ty }" ztd5d }"~"ww )6Nc                 S   sP   | d u rd S | d dkr|dkr| S d S t | d |kr&| d | d | fS d S )Nr   sor   )r   )subsr   r2   r2   r5   indice-  s   z*ColloscopeImportForm.clean.<locals>.indicec                 S   s2   i | ]}t |j |jrd |jnd |qS )z(lv{})r1   )r-   rz   rZ  r   r   )r   rR   r2   r2   r5   
<dictcomp>8  r   z.ColloscopeImportForm.clean.<locals>.<dictcomp>)r   c              	   S   sB   i | ]}t |jj t |jj f|t|jjd ddfqS )rT   TrU   )r-   r   	last_namerZ  
first_namer   r  r_   )r   r   r2   r2   r5   r  9  s   B )classesc                 S   s   i | ]}|j |qS r2   r   rs  r2   r2   r5   r  :  r  r   r   r   r   r   r         )lumamejevesadiz	\d+a?b?c?z\d+za?b?c?)abcrl  rI   z	utf-8-sigr1   )encodingnewline,)	delimiterc                    s$   g | ]}t jj | d qS ))r  )r   rZ   r6  searchgroupr7  )p2r2   r5   r   I  r:  z.ColloscopeImportForm.clean.<locals>.<listcomp>ua   erreur dans les numéros de semaine (il faut uniquement des nombres précédés de la lettre 'S')u'   première ligne du fichier trop courte!z"longueurs de lignes inconsistantesu,   {} n'est pas une matière de la classe de {}u.   {} n'est pas colleur de {} dans la matière {}r;  u,   {} ne correspond à aucun jour de la semaineh<   u   l'heure {} est mal formatéec                 s   rQ  ry   )reversedr7  r2   r2   r5   rR  k  rS  z-ColloscopeImportForm.clean.<locals>.<genexpr>;zle groupe {} n'existe pasgrclr  c                 S   s   g | ]}|d kr|qS )r1   r2   r7  r2   r2   r5   r     rF  abcr   u'   {} n'est le login d'aucun élève de {}c                    s   g | ]}| qS r2   r2   )r   element)r   r  r2   r5   r     r   u=   Le fichier doit être un fichier CSV valide, encodé en UTF-8)3r
   rZ   r[   rQ   r`   r   r   recompile	semestresr   
get_configr  r+   rm   filecsvreaderrx  r  ro   r   r   r   r  r-   rZ  r   rz   striprT   rY  r(   r@  r[  dictloginsElevesr   isdigitrC  r  r  rn   r6  r  r^   rn  r  rr  r   ry  )#rb   r  colleursr   joursp1p3dicor  csvfilecolloscopereadertaillerowmaxnummatcoller   creneaur   minutesr   colrF   groupsr8  sgroupes
eleves_totsgroupegroupe_numeroeleves_positionr   ppos	souscolleer2   )r   r  r  r5   ru   ,  s   



"

( 





((WzColloscopeImportForm.cleanc           	      C   s  t jj| j| jd  | jD ]}g }tjj|d |d |d | j|d |d d}| rDt jj|d | jd sD|d d d }n2tjj|d |d |d | jd	d
}| rc|d d d }nt|d |d |d | jd}|	  t
|dd  | jD ]T\}}|d ur|\}}|dkr|D ]}|t ||d |d |d | j|d qq|dkr|t ||d |d d || j|d q|t ||d |d d d | j|d qt j| qd S )N)rg   creneau__classer   r   r   r   r   )r   r   r   rQ   colle__matierecolle__colleur)r  rg   T)r   r   r   rQ   colle__isnull)r   r   r   rQ   r  r  )r  r   rR   r   r   rQ   rF   r  )r   rZ   r[   ro   rQ   r*  r  r	   rn   r   r   rY  r  )	rb   r  colles_a_sauverr  r	  rF   gscr   r   r2   r2   r5   r     s0   
."$((&zColloscopeImportForm.save)r8   r9   r:   rY   ru   r   rw   r2   r2   re   r5   r  #  s    ur  c                       r  )TDFormc                   @   r   )zTDForm.Meta)r  rH   rI   r  N)r8   r9   r:   r   rJ   rK   r2   r2   r2   r5   rN     r   rN   c                    r  )
NrP   rS   r  TrU   c                 S   r  r2   r2   r   r2   r2   r5   r     r  z#TDForm.__init__.<locals>.<listcomp>r   r  )rX   rY   rR   rQ   r   rZ   r[   r\   r]   rT   r_   r   r   r   rK   r   r  re   r2   r5   rY     r  zTDForm.__init__c                 C   r  )r  r  r  rS   u4   il existe déjà un td n°{} dans la classe {} en {}N)r   rZ   r[   rm   rR   rQ   r\   r]   rT   rn   r   r   r  r2   r2   r5   ru     r  zTDForm.cleanr  r2   r2   re   r5   r    s    r  c                       r  )	CoursFormc                   @   r   )zCoursForm.Meta)r  rH   rI   N)r8   r9   r:   r   rJ   rK   r2   r2   r2   r5   rN     r   rN   c                    r  )
NrP   rS   r  TrU   c                 S   r  r2   r2   r   r2   r2   r5   r     r  z&CoursForm.__init__.<locals>.<listcomp>r   r  )rX   rY   rR   rQ   r   rZ   r[   r\   r]   rT   r_   r   r   r   rK   r   r  re   r2   r5   rY     r  zCoursForm.__init__c                 C   r  )r  r  r  rS   u7   il existe déjà un cours n°{} dans la classe {} en {}N)r   rZ   r[   rm   rR   rQ   r\   r]   rT   rn   r   r   r  r2   r2   r5   ru     r  zCoursForm.cleanr  r2   r2   re   r5   r    s    
r  c                       r  )DocumentFormc                   @   r   )zDocumentForm.Meta)rG   rH   rI   N)r8   r9   r:   r   rJ   rK   r2   r2   r2   r5   rN     r   rN   c                    r!  ry   )rX   rY   rR   rQ   )rb   rR   rQ   r3   r4   re   r2   r5   rY     r#  zDocumentForm.__init__c                 C   r  )r  rG   )rG   rR   rQ   rS   u@   il existe déjà un document nommé '{}' dans la classe {} en {}N)r   rZ   r[   rm   rR   rQ   r\   r]   rT   rn   r   r   r  r2   r2   r5   ru     r  zDocumentForm.cleanr  r2   r2   re   r5   r    s    r  c                       r  )PlancheFormc                   @   rE   )zPlancheForm.Meta)r  rF   r   r   r   r   commentaire_colleurr  N)	r8   r9   r:   r   rJ   rK   r   rL   rM   r2   r2   r2   r5   rN      rO   rN   c                    s   t  j|i | || _|| _tjj| j| jd}dd |D | jd _| j	j
rLdgdd tjj| j	j ddd	d
ddd
d	D  | jd _d S dg| jd _d S )Nr  r   c                 S      g | ]	}|j t|fqS r2   rT   ry  r7  r2   r2   r5   r   
  r   z(PlancheForm.__init__.<locals>.<listcomp>r  )Npersonnec              	   S   s6   g | ]}|d  d |d  |d  |d fqS )rT   z
{} {} ({})r  r  classe__nom)r   upperr{   )r   r   r2   r2   r5   r     s   6 )
classe__inr#  r  r  rT   r   )rX   rY   rR   r   r   rZ   r[   rK   r   r\   rT   r   r  r  r   valuesrb   rR   r   r3   r4   rc   re   r2   r5   rY     s   HzPlancheForm.__init__c                 C   sR   t jj| jd | jd | jd | jd}| jr|j| jjd}| r't	ddS )B   vérifie que le colleur n'a pas déjà une planche sur ce créneaurF   r   r   )rF   r   r   r   rS   u,   Vous avez déjà une planche sur ce créneauN)
r   rZ   r[   rm   r   r\   r]   rT   rn   r   r  r2   r2   r5   ru     s   (zPlancheForm.cleanr  r2   r2   re   r5   r    s    r  c                       s:   e Zd ZG dd dZ fddZdd Zdd Z  ZS )	MultiPlancheFormc                   @   r   )zMultiPlancheForm.Meta)r  rF   r   r   r  N)r8   r9   r:   r   rJ   rK   r2   r2   r2   r5   rN     r   rN   c                    s   t  j|i | || _|| _tjj| j| jd}dd |D | jd _dd t	t
ttD }tj|dd| jd< tj|d	d| jd
< d S )Nr  c                 S   r   r2   r!  r7  r2   r2   r5   r   "  r   z-MultiPlancheForm.__init__.<locals>.<listcomp>r  c                 S   s$   g | ]}|d  |d |d fqS )z	{}h{:02d}r  r   r   r2   r2   r5   r   #  r:  u   heure de début)r   r>   
heuredebutzheure de finheurefin)rX   rY   rR   r   r   rZ   r[   rK   r   r   r$   r%   r&   r   r   )rb   rR   r   r3   r4   rc   LISTE_HEUREre   r2   r5   rY     s   zMultiPlancheForm.__init__c                 C   sL   t jj| jd | jd | jd | jd | j| jd d}| r$tddS )	r(  rF   r   r*  r+  r  )rF   r   
heure__gte	heure__ltr   r  u4   Vous avez déjà une planche sur cette plage horaireN)r   rZ   r[   rm   r   rn   r   r  r2   r2   r5   ru   '  s   8zMultiPlancheForm.cleanc              	   C   s   t | jd }t | jd }||k rDt| j| j| jd | jd || jd | jd d}|  |j| jd  || jj7 }||k sd	S d	S )
u%   Sauvegarde des créneaux consécutifsr*  r+  rF   r   r   r  )r   rR   rF   r   r   r   r  r  N)	r[  rm   r   r   rR   r   r  r   r  )rb   r   r+  plancher2   r2   r5   r   -  s   2zMultiPlancheForm.save)r8   r9   r:   rN   rY   ru   r   rw   r2   r2   re   r5   r)    s
    
r)  c                       s   e Zd Zd fdd	Z  ZS )SelectPlancheFormNc                    st   t  j|i | tj}|r|j|d}|r|j|d}t|dtjd| jd< d | jd _	tj
dddd	| jd
< d S )N)rR   )r   Tr  r/  Saller  F)r>   
max_lengthr   r   )rX   rY   r   rZ   r[   r0   r   rL   rK   r   r@   r'  re   r2   r5   rY   9  s   zSelectPlancheForm.__init__)NNr
  r2   r2   re   r5   r0  8  s    r0  c                       r   )PlancheProfFormc                    sF   t  j|i | tjj||ddd}tjd|ddd| jd< d S )	N)r  classes__inr  r  r   zTous les colleursFr   r   )	rX   rY   r   rZ   r[   r   r   r   rK   )rb   rR   r  r3   r4   rc   re   r2   r5   rY   E  s   zPlancheProfForm.__init__r
  r2   r2   re   r5   r3  D  r  r3  )ddjangor   accueil.modelsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   django.db.modelsr   r   r   django.db.models.functionsr   datetimer   r   django.forms.widgetsr   django.core.exceptionsr   	xml.etreer    rU  ecolle.settingsr!   r"   r#   r$   r%   r&   os.pathr'   r(   osr)   r*   _ior+   r  r  zipfiler,   r-   django.core.files.baser.   r  r0   Formr<   	ModelFormrD   r   rx   r}   r   r   r   r   r  r  r  r  BaseFormSetr   r/  r1  r3  rj  r  r  r  r  r  r  r  r  r  r  r  r  r)  r0  r3  r2   r2   r2   r5   <module>   sh   \ +I9	+	>!  