Amélioration tableau bord semestre / saisie notes manquantes
This commit is contained in:
parent
1847250bab
commit
066e03dae8
@ -1014,24 +1014,24 @@ def formsemestre_status_head(formsemestre_id=None, page_title=None):
|
||||
% evals["last_modif"].strftime("%d/%m/%Y à %Hh%M")
|
||||
)
|
||||
H.append("</td></tr>")
|
||||
if evals["attente"]:
|
||||
H.append(
|
||||
"""<tr><td class="fichetitre2"></td><td class="redboldtext">
|
||||
Il y a des notes en attente ! Le classement des étudiants n'a qu'une valeur indicative.
|
||||
</td></tr>"""
|
||||
)
|
||||
H.append("</table>")
|
||||
sem_warning = ""
|
||||
if sem.bul_hide_xml:
|
||||
sem_warning += "Bulletins non publiés sur le portail. "
|
||||
if sem.block_moyennes:
|
||||
sem_warning += "Calcul des moyennes bloqué !"
|
||||
if sem_warning:
|
||||
H.append('<p class="fontorange"><em>' + sem_warning + "</em></p>")
|
||||
if sem.semestre_id >= 0 and not sem.est_sur_une_annee():
|
||||
H.append(
|
||||
'<p class="fontorange"><em>Attention: ce semestre couvre plusieurs années scolaires !</em></p>'
|
||||
warnings = []
|
||||
if evals["attente"]:
|
||||
warnings.append(
|
||||
"""<span class="fontred">Il y a des notes en attente !</span>
|
||||
Le classement des étudiants n'a qu'une valeur indicative."""
|
||||
)
|
||||
if sem.bul_hide_xml:
|
||||
warnings.append("""Bulletins non publiés sur le portail. """)
|
||||
if sem.block_moyennes:
|
||||
warnings.append("Calcul des moyennes bloqué !")
|
||||
if sem.semestre_id >= 0 and not sem.est_sur_une_annee():
|
||||
warnings.append("""<em>Ce semestre couvre plusieurs années scolaires !</em>""")
|
||||
if warnings:
|
||||
H += [
|
||||
f"""<div class="formsemestre_status_warning">{warning}</div>"""
|
||||
for warning in warnings
|
||||
]
|
||||
|
||||
return "".join(H)
|
||||
|
||||
@ -1058,6 +1058,9 @@ def formsemestre_status(formsemestre_id=None):
|
||||
)
|
||||
|
||||
can_edit = formsemestre.can_be_edited_by(current_user)
|
||||
can_change_all_notes = current_user.has_permission(Permission.ScoEditAllNotes) or (
|
||||
current_user.id in [resp.id for resp in formsemestre.responsables]
|
||||
)
|
||||
use_ue_coefs = sco_preferences.get_preference("use_ue_coefs", formsemestre_id)
|
||||
|
||||
H = [
|
||||
@ -1068,7 +1071,9 @@ def formsemestre_status(formsemestre_id=None):
|
||||
formsemestre_status_head(
|
||||
formsemestre_id=formsemestre_id, page_title="Tableau de bord"
|
||||
),
|
||||
formsemestre_warning_etuds_sans_note(formsemestre, nt),
|
||||
formsemestre_warning_etuds_sans_note(formsemestre, nt)
|
||||
if can_change_all_notes
|
||||
else "",
|
||||
"""<p><b style="font-size: 130%">Tableau de bord: </b>
|
||||
<span class="help">cliquez sur un module pour saisir des notes</span>
|
||||
</p>""",
|
||||
@ -1338,7 +1343,7 @@ def formsemestre_tableau_modules(
|
||||
def get_formsemestre_etudids_sans_notes(
|
||||
formsemestre: FormSemestre, res: ResultatsSemestre
|
||||
) -> set[int]:
|
||||
"""Les étudis d'étudiants de ce semestre n'ayant aucune note
|
||||
"""Les étudids d'étudiants de ce semestre n'ayant aucune note
|
||||
alors que d'autres en ont.
|
||||
"""
|
||||
# Il y a-t-il des notes déjà saisies ?
|
||||
@ -1398,7 +1403,7 @@ def formsemestre_warning_etuds_sans_note(
|
||||
else:
|
||||
msg_etuds = f"""{nb_sans_notes} étudiants n'ont aucune note :"""
|
||||
|
||||
return f"""<div class="warning_inscriptions_notes">Attention: {msg_etuds}
|
||||
return f"""<div class="formsemestre_status_warning">{msg_etuds}
|
||||
<a class="stdlink" href="{url_for(
|
||||
"notes.formsemestre_note_etuds_sans_notes",
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
@ -1410,15 +1415,21 @@ def formsemestre_warning_etuds_sans_note(
|
||||
"""
|
||||
|
||||
|
||||
def formsemestre_note_etuds_sans_notes(formsemestre_id: int, code: str = None):
|
||||
"""Vue affichant les étudiants sans notes"""
|
||||
def formsemestre_note_etuds_sans_notes(
|
||||
formsemestre_id: int, code: str = None, etudid: int = None
|
||||
):
|
||||
"""Affichage et saisie des étudiants sans notes
|
||||
|
||||
Si etudid est spécifié, traite un seul étudiant."""
|
||||
formsemestre: FormSemestre = FormSemestre.query.filter_by(
|
||||
id=formsemestre_id, dept_id=g.scodoc_dept_id
|
||||
).first_or_404()
|
||||
res: ResultatsSemestre = res_sem.load_formsemestre_results(formsemestre)
|
||||
etudids_sans_notes = get_formsemestre_etudids_sans_notes(formsemestre, res)
|
||||
if etudid:
|
||||
etudids_sans_notes = etudids_sans_notes.intersection({etudid})
|
||||
etuds: list[Identite] = sorted(
|
||||
[Identite.query.get(etudid) for etudid in etudids_sans_notes],
|
||||
[Identite.query.get_or_404(eid) for eid in etudids_sans_notes],
|
||||
key=lambda e: e.sort_key,
|
||||
)
|
||||
if request.method == "POST":
|
||||
@ -1434,6 +1445,18 @@ def formsemestre_note_etuds_sans_notes(formsemestre_id: int, code: str = None):
|
||||
formsemestre_id=formsemestre.id,
|
||||
)
|
||||
)
|
||||
if not etuds:
|
||||
if etudid is None:
|
||||
message = """<h3>aucun étudiant sans notes</h3>"""
|
||||
else:
|
||||
flash(
|
||||
f"""{Identite.query.get_or_404(etudid).nomprenom}
|
||||
a déjà des notes"""
|
||||
)
|
||||
return redirect(
|
||||
url_for("scolar.ficheEtud", scodoc_dept=g.scodoc_dept, etudid=etudid)
|
||||
)
|
||||
else:
|
||||
noms = "</li><li>".join(
|
||||
[
|
||||
f"""<a href="{
|
||||
@ -1442,6 +1465,13 @@ def formsemestre_note_etuds_sans_notes(formsemestre_id: int, code: str = None):
|
||||
for etud in etuds
|
||||
]
|
||||
)
|
||||
message = f"""
|
||||
<h3>Étudiants sans notes:</h3>
|
||||
<ul>
|
||||
<li>{noms}</li>
|
||||
</ul>
|
||||
"""
|
||||
|
||||
return f"""
|
||||
{html_sco_header.sco_header(
|
||||
page_title=f"{formsemestre.sem_modalite()} {formsemestre.titre_annee()}"
|
||||
@ -1451,14 +1481,14 @@ def formsemestre_note_etuds_sans_notes(formsemestre_id: int, code: str = None):
|
||||
formsemestre_id=formsemestre_id, page_title="Étudiants sans notes"
|
||||
)}
|
||||
</div>
|
||||
<h3>Étudiants sans notes:</h3>
|
||||
<ul>
|
||||
<li>{noms}</li>
|
||||
</ul>
|
||||
{message}
|
||||
|
||||
<form method="post">
|
||||
<input type="hidden" name="formsemestre_id" value="{formsemestre.id}">
|
||||
Mettre toutes les notes de ces étudiants à :
|
||||
<input type="hidden" name="etudid" value="{etudid or ""}">
|
||||
|
||||
Mettre toutes les notes de {"ces étudiants" if len(etuds)> 1 else "cet étudiant"}
|
||||
à :
|
||||
<select name="code">
|
||||
<option value="ABS">ABS (absent, compte zéro)</option>
|
||||
<option value="ATT" selected>ATT (en attente)</option>
|
||||
|
@ -789,7 +789,7 @@ def groups_table(
|
||||
filename = title
|
||||
return scu.send_file(xls, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE)
|
||||
else:
|
||||
raise ValueError("unsupported format")
|
||||
raise ScoValueError("unsupported format")
|
||||
|
||||
|
||||
def tab_absences_html(groups_infos, etat=None):
|
||||
|
@ -58,7 +58,7 @@ from app.scodoc.sco_formsemestre_validation import formsemestre_recap_parcours_t
|
||||
from app.scodoc.sco_permissions import Permission
|
||||
|
||||
|
||||
def _menuScolarite(authuser, sem, etudid):
|
||||
def _menu_scolarite(authuser, sem: dict, etudid: int):
|
||||
"""HTML pour menu "scolarite" pour un etudiant dans un semestre.
|
||||
Le contenu du menu depend des droits de l'utilisateur et de l'état de l'étudiant.
|
||||
"""
|
||||
@ -139,6 +139,12 @@ def _menuScolarite(authuser, sem, etudid):
|
||||
"args": args,
|
||||
"enabled": authuser.has_permission(Permission.ScoImplement),
|
||||
},
|
||||
{
|
||||
"title": "Affecter les notes manquantes",
|
||||
"endpoint": "notes.formsemestre_note_etuds_sans_notes",
|
||||
"args": args,
|
||||
"enabled": authuser.has_permission(Permission.ScoEditAllNotes),
|
||||
},
|
||||
]
|
||||
|
||||
return htmlutils.make_menu(
|
||||
@ -262,7 +268,7 @@ def ficheEtud(etudid=None):
|
||||
)
|
||||
grlink = ", ".join(grlinks)
|
||||
# infos ajoutées au semestre dans le parcours (groupe, menu)
|
||||
menu = _menuScolarite(authuser, sem, etudid)
|
||||
menu = _menu_scolarite(authuser, sem, etudid)
|
||||
if menu:
|
||||
sem_info[sem["formsemestre_id"]] = (
|
||||
"<table><tr><td>" + grlink + "</td><td>" + menu + "</td></tr></table>"
|
||||
@ -423,23 +429,12 @@ def ficheEtud(etudid=None):
|
||||
else:
|
||||
info["tit_anno"] = ""
|
||||
# Inscriptions
|
||||
# if info["sems"]: # XXX rcl unused ? à voir
|
||||
# rcl = (
|
||||
# """(<a href="%(ScoURL)s/Notes/formsemestre_validation_etud_form?check=1&etudid=%(etudid)s&formsemestre_id=%(last_formsemestre_id)s&desturl=ficheEtud?etudid=%(etudid)s">récapitulatif parcours</a>)"""
|
||||
# % info
|
||||
# )
|
||||
# else:
|
||||
# rcl = ""
|
||||
info[
|
||||
"inscriptions_mkup"
|
||||
] = """<div class="ficheinscriptions" id="ficheinscriptions">
|
||||
<div class="fichetitre">Parcours</div>%s
|
||||
%s %s
|
||||
</div>""" % (
|
||||
info["liste_inscriptions"],
|
||||
info["link_bul_pdf"],
|
||||
info["link_inscrire_ailleurs"],
|
||||
)
|
||||
] = f"""<div class="ficheinscriptions" id="ficheinscriptions">
|
||||
<div class="fichetitre">Parcours</div>{info["liste_inscriptions"]}
|
||||
{info["link_bul_pdf"]} {info["link_inscrire_ailleurs"]}
|
||||
</div>"""
|
||||
|
||||
#
|
||||
if info["groupes"].strip():
|
||||
|
@ -1572,6 +1572,16 @@ div.formsemestre_status {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.formsemestre_status_warning,
|
||||
.formsemestre_status_warning a {
|
||||
color: rgb(215, 90, 0);
|
||||
}
|
||||
|
||||
div.formsemestre_status_warning::before {
|
||||
content: "\26a0 \fe0f \00a0";
|
||||
/* EMO_WARNING, "⚠️" */
|
||||
}
|
||||
|
||||
table.formsemestre_status {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
@ -204,7 +204,7 @@ sco_publish(
|
||||
methods=["GET", "POST"],
|
||||
)
|
||||
sco_publish(
|
||||
"/formsemestre_view_etuds_sans_note",
|
||||
"/formsemestre_note_etuds_sans_note",
|
||||
sco_formsemestre_status.formsemestre_note_etuds_sans_notes,
|
||||
Permission.ScoView,
|
||||
methods=["GET", "POST"],
|
||||
|
@ -1,7 +1,7 @@
|
||||
# -*- mode: python -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
SCOVERSION = "9.3.55"
|
||||
SCOVERSION = "9.3.56"
|
||||
|
||||
SCONAME = "ScoDoc"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user