forked from ScoDoc/ScoDoc
Assiduité: amélioration fonction import excel: feuille_abs_formsemestre
This commit is contained in:
parent
3c5117c2d0
commit
0406bba322
@ -188,7 +188,8 @@ class RowAssi(tb.Row):
|
|||||||
self.add_cell(
|
self.add_cell(
|
||||||
"lien_ajout",
|
"lien_ajout",
|
||||||
"",
|
"",
|
||||||
f"""<a href='{ajout_url}' class="stdlink">signaler</a>""",
|
"signaler",
|
||||||
|
target=ajout_url,
|
||||||
no_excel=True,
|
no_excel=True,
|
||||||
column_classes={"col_lien_ajout"},
|
column_classes={"col_lien_ajout"},
|
||||||
)
|
)
|
||||||
@ -201,9 +202,12 @@ class RowAssi(tb.Row):
|
|||||||
|
|
||||||
Returns :
|
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
|
# Préparation du retour
|
||||||
|
@ -5,10 +5,6 @@
|
|||||||
<style>
|
<style>
|
||||||
#excel-content {
|
#excel-content {
|
||||||
margin: 4px 0;
|
margin: 4px 0;
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 4px;
|
|
||||||
justify-content: space-evenly;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.hint {
|
.hint {
|
||||||
@ -48,12 +44,11 @@
|
|||||||
<p class="hint">Le fichier importé doit respecter le format suivant</p>
|
<p class="hint">Le fichier importé doit respecter le format suivant</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>colonne A : identifiant de l'étudiant (voir type ci-dessous)</li>
|
||||||
colonne A : Identifiant de l'étudiant
|
<li class="star">colonne B : date de début</li>
|
||||||
</li>
|
<li class="star">colonne C : date de fin</li>
|
||||||
<li class="star">colonne B : Date de début</li>
|
<li class="opt">colonne D : état: ABS (absent), ABSJUST (absent justifié),
|
||||||
<li class="star">colonne C : Date de fin</li>
|
RET (retard), PRE (présent), considéré ABSent si vide</li>
|
||||||
<li class="opt">colonne D : État (ABS, RET, PRE), considéré ABSent si vide</li>
|
|
||||||
<li class="opt">colonne E : code du module</li>
|
<li class="opt">colonne E : code du module</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@ -88,9 +83,15 @@
|
|||||||
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
|
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
|
||||||
</div>
|
</div>
|
||||||
<div class="space-before-18">
|
<div class="space-before-18">
|
||||||
<button type="submit">Importer</button>
|
<button type="submit"><b>Importer</b></button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</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>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -2562,13 +2562,15 @@ def _import_excel_assiduites_list(
|
|||||||
erreurs: list[tuple[str, list]] = []
|
erreurs: list[tuple[str, list]] = []
|
||||||
for num, ligne in enumerate(data):
|
for num, ligne in enumerate(data):
|
||||||
if not ligne or len(ligne) < 5:
|
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
|
identifiant_etud = ligne[0] # etudid/nip/ine
|
||||||
date_debut_str = ligne[1] # iso / fra / excel
|
date_debut_str = ligne[1] # iso / fra / excel
|
||||||
date_fin_str = ligne[2] # 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 = ligne[3].strip().upper() # etat abs par défaut, sinon RET ou PRE
|
||||||
etat = etat or "ABS"
|
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
|
moduleimpl: ModuleImpl | None = None
|
||||||
try:
|
try:
|
||||||
# On récupère l'étudiant
|
# 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é"
|
f"Étudiant ({safehtml.html_to_safe_html(identifiant_etud)}) non trouvé"
|
||||||
)
|
)
|
||||||
# On vérifie que l'étudiant appartient au semestre
|
# 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")
|
raise ScoValueError("Étudiant non inscrit dans le semestre")
|
||||||
|
|
||||||
# On transforme les dates
|
# On transforme les dates
|
||||||
@ -2590,14 +2594,14 @@ def _import_excel_assiduites_list(
|
|||||||
date_fin = scu.TIME_ZONE.localize(date_fin)
|
date_fin = scu.TIME_ZONE.localize(date_fin)
|
||||||
|
|
||||||
# Vérification de l'état
|
# 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}")
|
raise ScoValueError(f"État invalide => {etat}")
|
||||||
|
|
||||||
etat: scu.EtatAssiduite = {
|
etat_assiduite: scu.EtatAssiduite = {
|
||||||
"ABS": scu.EtatAssiduite.ABSENT,
|
"ABS": scu.EtatAssiduite.ABSENT,
|
||||||
"RET": scu.EtatAssiduite.RETARD,
|
"RET": scu.EtatAssiduite.RETARD,
|
||||||
"PRE": scu.EtatAssiduite.PRESENT,
|
"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
|
# On récupère le moduleimpl à partir du code du module et du formsemestre
|
||||||
if module:
|
if module:
|
||||||
@ -2607,8 +2611,10 @@ def _import_excel_assiduites_list(
|
|||||||
etud=etud,
|
etud=etud,
|
||||||
date_debut=date_debut,
|
date_debut=date_debut,
|
||||||
date_fin=date_fin,
|
date_fin=date_fin,
|
||||||
etat=etat,
|
etat=etat_assiduite,
|
||||||
moduleimpl=moduleimpl,
|
moduleimpl=moduleimpl,
|
||||||
|
est_just="JUST" in etat,
|
||||||
|
user_id=current_user.id,
|
||||||
)
|
)
|
||||||
db.session.add(assiduite)
|
db.session.add(assiduite)
|
||||||
scass.simple_invalidate_cache(assiduite.to_dict())
|
scass.simple_invalidate_cache(assiduite.to_dict())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user