Assiduité: amélioration fonction import excel: feuille_abs_formsemestre

This commit is contained in:
Emmanuel Viennet 2024-12-13 16:54:02 +01:00
parent 3c5117c2d0
commit 0406bba322
3 changed files with 31 additions and 20 deletions

View File

@ -188,7 +188,8 @@ class RowAssi(tb.Row):
self.add_cell(
"lien_ajout",
"",
f"""<a href='{ajout_url}' class="stdlink">signaler</a>""",
"signaler",
target=ajout_url,
no_excel=True,
column_classes={"col_lien_ajout"},
)
@ -201,9 +202,12 @@ class RowAssi(tb.Row):
Returns :
{
"<etat>" : [<Etat version lisible>, <nb total etat>, <nb just etat>]
"<etat>" : [<Etat version lisible>, <nb_total_etat>, <nb_just_etat>]
}
nb_total_etat = nb d'assiduité de la catégorie (dans la métrique)
nb_just_etat = nb d'assiduité justifiées de la catégorie (dans la métrique)
"""
# Préparation du retour

View File

@ -5,10 +5,6 @@
<style>
#excel-content {
margin: 4px 0;
display: flex;
flex-direction: column;
gap: 4px;
justify-content: space-evenly;
}
.hint {
@ -48,12 +44,11 @@
<p class="hint">Le fichier importé doit respecter le format suivant</p>
<ul>
<li>
colonne A : Identifiant de l'étudiant
</li>
<li class="star">colonne B : Date de début</li>
<li class="star">colonne C : Date de fin</li>
<li class="opt">colonne D : État (ABS, RET, PRE), considéré ABSent si vide</li>
<li>colonne A : identifiant de l'étudiant (voir type ci-dessous)</li>
<li class="star">colonne B : date de début</li>
<li class="star">colonne C : date de fin</li>
<li class="opt">colonne D : état: ABS (absent), ABSJUST (absent justifié),
RET (retard), PRE (présent), considéré ABSent si vide</li>
<li class="opt">colonne E : code du module</li>
</ul>
@ -88,9 +83,15 @@
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
</div>
<div class="space-before-18">
<button type="submit">Importer</button>
<button type="submit"><b>Importer</b></button>
</div>
</form>
<div class="vspaced">
<a class="stdlink" href="{{
url_for('notes.formsemestre_status',
scodoc_dept=g.scodoc_dept, formsemestre_id=sco.formsemestre.id)
}}">retour au tableau de bord</a>
</div>
</div>
</div>

View File

@ -2562,13 +2562,15 @@ def _import_excel_assiduites_list(
erreurs: list[tuple[str, list]] = []
for num, ligne in enumerate(data):
if not ligne or len(ligne) < 5:
raise ScoValueError("Format de fichier tableau non reconnu")
raise ScoValueError(
"Format de fichier tableau non reconnu (nb de colonnes)"
)
identifiant_etud = ligne[0] # etudid/nip/ine
date_debut_str = ligne[1] # iso / fra / excel
date_fin_str = ligne[2] # iso / fra / excel
etat = ligne[3].strip().upper() # etat abs par défaut, sinon RET ou PRE
etat = etat or "ABS"
module = ligne[4] or None # code du module
module = ligne[4].strip() or None # code du module
moduleimpl: ModuleImpl | None = None
try:
# On récupère l'étudiant
@ -2578,7 +2580,9 @@ def _import_excel_assiduites_list(
f"Étudiant ({safehtml.html_to_safe_html(identifiant_etud)}) non trouvé"
)
# On vérifie que l'étudiant appartient au semestre
if formsemestre not in etud.get_formsemestres():
if formsemestre.id not in {
ins.formsemestre_id for ins in etud.formsemestre_inscriptions
}:
raise ScoValueError("Étudiant non inscrit dans le semestre")
# On transforme les dates
@ -2590,14 +2594,14 @@ def _import_excel_assiduites_list(
date_fin = scu.TIME_ZONE.localize(date_fin)
# Vérification de l'état
if etat not in ["ABS", "RET", "PRE"]:
if etat not in ["ABS", "RET", "PRE", "ABSJUST"]:
raise ScoValueError(f"État invalide => {etat}")
etat: scu.EtatAssiduite = {
etat_assiduite: scu.EtatAssiduite = {
"ABS": scu.EtatAssiduite.ABSENT,
"RET": scu.EtatAssiduite.RETARD,
"PRE": scu.EtatAssiduite.PRESENT,
}.get(etat, scu.EtatAssiduite.ABSENT)
}.get(etat[:3], scu.EtatAssiduite.ABSENT)
# On récupère le moduleimpl à partir du code du module et du formsemestre
if module:
@ -2607,8 +2611,10 @@ def _import_excel_assiduites_list(
etud=etud,
date_debut=date_debut,
date_fin=date_fin,
etat=etat,
etat=etat_assiduite,
moduleimpl=moduleimpl,
est_just="JUST" in etat,
user_id=current_user.id,
)
db.session.add(assiduite)
scass.simple_invalidate_cache(assiduite.to_dict())