Tableau suivi cohortes: prend en compte la décision annuelle et non semestrielle en BUT.

This commit is contained in:
Emmanuel Viennet 2023-09-28 17:26:10 +02:00
parent df00954bcc
commit f333975ec5
2 changed files with 54 additions and 46 deletions

View File

@ -524,11 +524,11 @@ def table_suivi_cohorte(
# 3-- Regroupe les semestres par date de debut # 3-- Regroupe les semestres par date de debut
P = [] # liste de periodsem P = [] # liste de periodsem
class periodsem(object): class PeriodSem:
pass pass
# semestre de depart: # semestre de depart:
porigin = periodsem() porigin = PeriodSem()
d, m, y = [int(x) for x in sem["date_debut"].split("/")] d, m, y = [int(x) for x in sem["date_debut"].split("/")]
porigin.datedebut = datetime.datetime(y, m, d) porigin.datedebut = datetime.datetime(y, m, d)
porigin.sems = [sem] porigin.sems = [sem]
@ -543,7 +543,7 @@ def table_suivi_cohorte(
merged = True merged = True
break break
if not merged: if not merged:
p = periodsem() p = PeriodSem()
p.datedebut = s["date_debut_dt"] p.datedebut = s["date_debut_dt"]
p.sems = [s] p.sems = [s]
P.append(p) P.append(p)
@ -743,7 +743,7 @@ def formsemestre_suivi_cohorte(
civilite=None, civilite=None,
statut="", statut="",
only_primo=False, only_primo=False,
): ) -> str:
"""Affiche suivi cohortes par numero de semestre""" """Affiche suivi cohortes par numero de semestre"""
annee_bac = str(annee_bac or "") annee_bac = str(annee_bac or "")
annee_admission = str(annee_admission or "") annee_admission = str(annee_admission or "")
@ -794,14 +794,6 @@ def formsemestre_suivi_cohorte(
'<p><a href="%s&percent=1">Afficher les résultats en pourcentages</a></p>' '<p><a href="%s&percent=1">Afficher les résultats en pourcentages</a></p>'
% burl % burl
) )
help = (
pplink
+ """
<p class="help">Nombre d'étudiants dans chaque semestre. Les dates indiquées sont les dates approximatives de <b>début</b> des semestres (les semestres commençant à des dates proches sont groupés). Le nombre de diplômés est celui à la <b>fin</b> du semestre correspondant. Lorsqu'il y a moins de %s étudiants dans une case, vous pouvez afficher leurs noms en passant le curseur sur le chiffre.</p>
<p class="help">Les menus permettent de n'étudier que certaines catégories d'étudiants (titulaires d'un type de bac, garçons ou filles). La case "restreindre aux primo-entrants" permet de ne considérer que les étudiants qui n'ont jamais été inscrits dans ScoDoc avant le semestre considéré.</p>
"""
% (MAX_ETUD_IN_DESCR,)
)
H = [ H = [
html_sco_header.sco_header(page_title=tab.page_title), html_sco_header.sco_header(page_title=tab.page_title),
@ -824,7 +816,20 @@ def formsemestre_suivi_cohorte(
percent=percent, percent=percent,
), ),
t, t,
help, f"""{pplink}
<p class="help">Nombre d'étudiants dans chaque semestre.
Les dates indiquées sont les dates approximatives de <b>début</b> des semestres
(les semestres commençant à des dates proches sont groupés). Le nombre de diplômés
est celui à la <b>fin</b> du semestre correspondant.
Lorsqu'il y a moins de {MAX_ETUD_IN_DESCR} étudiants dans une case, vous pouvez
afficher leurs noms en passant le curseur sur le chiffre.
</p>
<p class="help">Les menus permettent de n'étudier que certaines catégories
d'étudiants (titulaires d'un type de bac, garçons ou filles).
La case "restreindre aux primo-entrants" permet de ne considérer que les étudiants
qui n'ont jamais été inscrits dans ScoDoc avant le semestre considéré.
</p>
""",
expl, expl,
html_sco_header.sco_footer(), html_sco_header.sco_footer(),
] ]
@ -870,35 +875,33 @@ def _gen_form_selectetuds(
else: else:
selected = 'selected="selected"' selected = 'selected="selected"'
F = [ F = [
"""<form id="f" method="get" action="%s"> f"""<form id="f" method="get" action="{request.base_url}">
<p>Bac: <select name="bac" onchange="javascript: submit(this);"> <p>Bac: <select name="bac" onchange="javascript: submit(this);">
<option value="" %s>tous</option> <option value="" {selected}>tous</option>
""" """
% (request.base_url, selected)
] ]
for b in bacs: for b in bacs:
if bac == b: if bac == b:
selected = 'selected="selected"' selected = 'selected="selected"'
else: else:
selected = "" selected = ""
F.append('<option value="%s" %s>%s</option>' % (b, selected, b)) F.append(f'<option value="{b}" {selected}>{b}</option>')
F.append("</select>") F.append("</select>")
if bacspecialite: if bacspecialite:
selected = "" selected = ""
else: else:
selected = 'selected="selected"' selected = 'selected="selected"'
F.append( F.append(
"""&nbsp; Bac/Specialité: <select name="bacspecialite" onchange="javascript: submit(this);"> f"""&nbsp; Bac/Specialité: <select name="bacspecialite" onchange="javascript: submit(this);">
<option value="" %s>tous</option> <option value="" {selected}>tous</option>
""" """
% selected
) )
for b in bacspecialites: for b in bacspecialites:
if bacspecialite == b: if bacspecialite == b:
selected = 'selected="selected"' selected = 'selected="selected"'
else: else:
selected = "" selected = ""
F.append('<option value="%s" %s>%s</option>' % (b, selected, b)) F.append(f'<option value="{b}" {selected}>{b}</option>')
F.append("</select>") F.append("</select>")
# #
F.append( F.append(
@ -910,46 +913,44 @@ def _gen_form_selectetuds(
) )
# #
F.append( F.append(
"""&nbsp; Genre: <select name="civilite" onchange="javascript: submit(this);"> f"""&nbsp; Genre: <select name="civilite" onchange="javascript: submit(this);">
<option value="" %s>tous</option> <option value="" {selected}>tous</option>
""" """
% selected
) )
for b in civilites: for b in civilites:
if civilite == b: if civilite == b:
selected = 'selected="selected"' selected = 'selected="selected"'
else: else:
selected = "" selected = ""
F.append('<option value="%s" %s>%s</option>' % (b, selected, b)) F.append(f'<option value="{b}" {selected}>{b}</option>')
F.append("</select>") F.append("</select>")
F.append( F.append(
"""&nbsp; Statut: <select name="statut" onchange="javascript: submit(this);"> f"""&nbsp; Statut: <select name="statut" onchange="javascript: submit(this);">
<option value="" %s>tous</option> <option value="" {selected}>tous</option>
""" """
% selected
) )
for b in statuts: for b in statuts:
if statut == b: if statut == b:
selected = 'selected="selected"' selected = 'selected="selected"'
else: else:
selected = "" selected = ""
F.append('<option value="%s" %s>%s</option>' % (b, selected, b)) F.append(f'<option value="{b}" {selected}>{b}</option>')
F.append("</select>") F.append("</select>")
if only_primo:
checked = 'checked="1"'
else:
checked = ""
F.append( F.append(
'<br><input type="checkbox" name="only_primo" onchange="javascript: submit(this);" %s/>Restreindre aux primo-entrants' f"""<br>
% checked <input type="checkbox" name="only_primo"
onchange="javascript: submit(this);"
{'checked="1"' if only_primo else ""}/>Restreindre aux primo-entrants
<input type="hidden" name="formsemestre_id" value="{formsemestre_id}"/>
<input type="hidden" name="percent" value="{percent}"/>
</p>
</form>
"""
) )
F.append(
'<input type="hidden" name="formsemestre_id" value="%s"/>' % formsemestre_id
)
F.append('<input type="hidden" name="percent" value="%s"/>' % percent)
F.append("</p></form>")
return "\n".join(F) return "\n".join(F)
@ -964,7 +965,7 @@ def _gen_select_annee(field, values, value) -> str:
return menu_html + "</select>" return menu_html + "</select>"
def _descr_etud_set(etudids): def _descr_etud_set(etudids) -> str:
"textual html description of a set of etudids" "textual html description of a set of etudids"
etuds = [] etuds = []
for etudid in etudids: for etudid in etudids:
@ -980,12 +981,19 @@ def _count_dem_reo(formsemestre_id, etudids):
"count nb of demissions and reorientation in this etud set" "count nb of demissions and reorientation in this etud set"
formsemestre = FormSemestre.get_formsemestre(formsemestre_id) formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre) nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre)
validations_annuelles = nt.get_validations_annee() if nt.is_apc else {}
dems = set() dems = set()
reos = set() reos = set()
for etudid in etudids: for etudid in etudids:
if nt.get_etud_etat(etudid) == "D": if nt.get_etud_etat(etudid) == "D":
dems.add(etudid) dems.add(etudid)
if nt.is_apc:
# BUT: utilise les validations annuelles
validation = validations_annuelles.get(etudid)
if validation and validation.code in codes_cursus.CODES_SEM_REO:
reos.add(etudid)
else:
# Autres formations: validations de semestres
dec = nt.get_etud_decision_sem(etudid) dec = nt.get_etud_decision_sem(etudid)
if dec and dec["code"] in codes_cursus.CODES_SEM_REO: if dec and dec["code"] in codes_cursus.CODES_SEM_REO:
reos.add(etudid) reos.add(etudid)

View File

@ -1,7 +1,7 @@
# -*- mode: python -*- # -*- mode: python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
SCOVERSION = "9.6.37" SCOVERSION = "9.6.38"
SCONAME = "ScoDoc" SCONAME = "ScoDoc"