formsemestre_inscr_passage: mentionne DEM inscrits. Close #1038

This commit is contained in:
Emmanuel Viennet 2025-02-06 10:22:43 +01:00
parent 58784af94d
commit 431b0aa651
5 changed files with 41 additions and 22 deletions

View File

@ -1221,7 +1221,7 @@ class FormSemestre(models.ScoDocModel):
} }
@property @property
def etuds_inscriptions(self) -> dict: def etuds_inscriptions(self) -> dict[int, "FormSemestreInscription"]:
"""Map { etudid : inscription } (incluant DEM et DEF)""" """Map { etudid : inscription } (incluant DEM et DEF)"""
return {ins.etud.id: ins for ins in self.inscriptions} return {ins.etud.id: ins for ins in self.inscriptions}

View File

@ -50,22 +50,24 @@ from app.scodoc.sco_exceptions import ScoValueError
def _list_authorized_etuds_by_sem( def _list_authorized_etuds_by_sem(
formsemestre: FormSemestre, ignore_jury=False formsemestre: FormSemestre, ignore_jury=False
) -> tuple[dict[int, dict], list[dict], dict[int, Identite]]: ) -> tuple[dict[int, dict], dict[int, dict], dict[int, Identite]]:
"""Liste des etudiants autorisés à s'inscrire dans sem. """Liste des etudiants autorisés à s'inscrire dans sem.
delai = nb de jours max entre la date de l'autorisation et celle de debut du semestre cible. delai = nb de jours max entre la date de l'autorisation et celle de debut du semestre cible.
ignore_jury: si vrai, considère tous les étudiants comme autorisés, même ignore_jury: si vrai, considère tous les étudiants comme autorisés, même
s'ils n'ont pas de décision de jury. s'ils n'ont pas de décision de jury.
""" """
src_sems = _list_source_sems(formsemestre) src_sems = _list_source_sems(formsemestre)
inscrits = list_inscrits(formsemestre.id) inscriptions = formsemestre.etuds_inscriptions
r = {} auth_etuds_by_sem = {}
candidats = {} # etudid : etud (tous les etudiants candidats) candidats = {} # etudid : etud (tous les etudiants candidats)
nb = 0 # debug nb = 0 # debug
src_formsemestre: FormSemestre src_formsemestre: FormSemestre
for src_formsemestre in src_sems: for src_formsemestre in src_sems:
if ignore_jury: if ignore_jury:
# liste de tous les inscrits au semestre (sans dems) # liste de tous les inscrits au semestre (sans dems)
etud_list = list_inscrits(src_formsemestre.id).values() etud_list = list_inscrits_edict(
src_formsemestre.id, with_dems=False
).values()
else: else:
# liste des étudiants autorisés par le jury à s'inscrire ici # liste des étudiants autorisés par le jury à s'inscrire ici
etud_list = _list_etuds_from_sem(src_formsemestre, formsemestre) etud_list = _list_etuds_from_sem(src_formsemestre, formsemestre)
@ -81,7 +83,7 @@ def _list_authorized_etuds_by_sem(
candidats[e["etudid"]] = etud candidats[e["etudid"]] = etud
liste_filtree.append(e) liste_filtree.append(e)
nb += 1 nb += 1
r[src_formsemestre.id] = { auth_etuds_by_sem[src_formsemestre.id] = {
"etuds": liste_filtree, "etuds": liste_filtree,
"infos": { "infos": {
"id": src_formsemestre.id, "id": src_formsemestre.id,
@ -94,15 +96,20 @@ def _list_authorized_etuds_by_sem(
"filename": "etud_autorises", "filename": "etud_autorises",
}, },
} }
# ajoute attribut inscrit qui indique si l'étudiant est déjà inscrit dans le semestre dest. # ajoute attribut inscrit qui indique si l'étudiant est déjà inscrit dans le semestre cible
for e in r[src_formsemestre.id]["etuds"]: for e in auth_etuds_by_sem[src_formsemestre.id]["etuds"]:
e["inscrit"] = e["etudid"] in inscrits e["inscrit"] = e["etudid"] in inscriptions
# Ajoute liste des etudiants actuellement inscrits # Ajoute étudiants actuellement inscrits dans le semestre cible
for e in inscrits.values(): inscrits_by_id_edict = {
ins.etudid: ins.etud.to_dict_scodoc7() for ins in inscriptions.values()
}
# ajoute état inscription pour afficher démissionnaires avec style
for e in inscrits_by_id_edict.values():
e["inscrit"] = True e["inscrit"] = True
r[formsemestre.id] = { e["etat"] = inscriptions[e["etudid"]].etat
"etuds": list(inscrits.values()), auth_etuds_by_sem[formsemestre.id] = {
"etuds": list(inscrits_by_id_edict.values()),
"infos": { "infos": {
"id": formsemestre.id, "id": formsemestre.id,
"title": "Semestre cible: " + formsemestre.titre_annee(), "title": "Semestre cible: " + formsemestre.titre_annee(),
@ -112,16 +119,17 @@ def _list_authorized_etuds_by_sem(
formsemestre_id=formsemestre.id, formsemestre_id=formsemestre.id,
), ),
"comment": " actuellement inscrits dans ce semestre", "comment": " actuellement inscrits dans ce semestre",
"help": "Ces étudiants sont actuellement inscrits dans ce semestre. Si vous les décochez, il seront désinscrits.", "help": """Ces étudiants sont actuellement inscrits dans ce semestre.
Si vous les décochez, il seront désinscrits.""",
"filename": "etud_inscrits", "filename": "etud_inscrits",
}, },
} }
return r, inscrits, candidats return auth_etuds_by_sem, inscrits_by_id_edict, candidats
def list_inscrits(formsemestre_id: int, with_dems=False) -> list[dict]: def list_inscrits_edict(formsemestre_id: int, with_dems=False) -> list[dict]:
"""Étudiants déjà inscrits à ce semestre """Étudiants (as dict) déjà inscrits à ce semestre
{ etudid : etud } { etudid : etud }
""" """
if not with_dems: if not with_dems:
@ -663,9 +671,8 @@ def etuds_select_box(
if help_txt: # bubble if help_txt: # bubble
H.append(f'title="{help_txt}"') H.append(f'title="{help_txt}"')
H.append( H.append(
""">%(title)s</a></div> f""">{infos['title']}</a></div>
<div class="pas_sembox_subtitle">(%(nbetuds)d étudiants%(comment)s)""" <div class="pas_sembox_subtitle">({infos['nbetuds']} étudiants{infos['comment']})"""
% infos
) )
if with_checkbox: if with_checkbox:
H.append( H.append(
@ -707,6 +714,9 @@ def etuds_select_box(
if is_inscrit if is_inscrit
else ("inscrit-ailleurs" if etud["etudid"] in inscrits_ailleurs else "") else ("inscrit-ailleurs" if etud["etudid"] in inscrits_ailleurs else "")
) )
if etud.get("etat") == scu.DEMISSION:
extra_class += " etuddem"
H.append( H.append(
_etud_row( _etud_row(
etud, etud,
@ -748,6 +758,8 @@ def _etud_row(
) )
}">{nomprenom}</a> }">{nomprenom}</a>
""" """
if etud.get("etat") == scu.DEMISSION:
elink += """<span class="etuddem">(DEM.)</span>"""
else: else:
# ce n'est pas un etudiant ScoDoc # ce n'est pas un etudiant ScoDoc
elink = nomprenom elink = nomprenom

View File

@ -388,7 +388,9 @@ def _build_page(
def list_synch(sem, annee_apogee=None): def list_synch(sem, annee_apogee=None):
"""""" """"""
inscrits = sco_inscr_passage.list_inscrits(sem["formsemestre_id"], with_dems=True) inscrits = sco_inscr_passage.list_inscrits_edict(
sem["formsemestre_id"], with_dems=True
)
# Tous les ensembles d'etudiants sont ici des ensembles de codes NIP (voir EKEY_SCO) # Tous les ensembles d'etudiants sont ici des ensembles de codes NIP (voir EKEY_SCO)
# (sauf inscrits_without_key) # (sauf inscrits_without_key)
inscrits_set = set() inscrits_set = set()

View File

@ -3809,6 +3809,11 @@ span.sp_etape {
color: red !important; color: red !important;
} }
.etuds-box .etuddem {
color: red !important;
font-style: italic;
}
div.etuds_select_boxes { div.etuds_select_boxes {
margin-bottom: 16px; margin-bottom: 16px;
} }

View File

@ -3,7 +3,7 @@
"Infos sur version ScoDoc" "Infos sur version ScoDoc"
SCOVERSION = "9.7.61" SCOVERSION = "9.7.62"
SCONAME = "ScoDoc" SCONAME = "ScoDoc"