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
P = [] # liste de periodsem
class periodsem(object):
class PeriodSem:
pass
# semestre de depart:
porigin = periodsem()
porigin = PeriodSem()
d, m, y = [int(x) for x in sem["date_debut"].split("/")]
porigin.datedebut = datetime.datetime(y, m, d)
porigin.sems = [sem]
@ -543,7 +543,7 @@ def table_suivi_cohorte(
merged = True
break
if not merged:
p = periodsem()
p = PeriodSem()
p.datedebut = s["date_debut_dt"]
p.sems = [s]
P.append(p)
@ -743,7 +743,7 @@ def formsemestre_suivi_cohorte(
civilite=None,
statut="",
only_primo=False,
):
) -> str:
"""Affiche suivi cohortes par numero de semestre"""
annee_bac = str(annee_bac 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>'
% 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 = [
html_sco_header.sco_header(page_title=tab.page_title),
@ -824,7 +816,20 @@ def formsemestre_suivi_cohorte(
percent=percent,
),
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,
html_sco_header.sco_footer(),
]
@ -870,35 +875,33 @@ def _gen_form_selectetuds(
else:
selected = 'selected="selected"'
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);">
<option value="" %s>tous</option>
<option value="" {selected}>tous</option>
"""
% (request.base_url, selected)
]
for b in bacs:
if bac == b:
selected = 'selected="selected"'
else:
selected = ""
F.append('<option value="%s" %s>%s</option>' % (b, selected, b))
F.append(f'<option value="{b}" {selected}>{b}</option>')
F.append("</select>")
if bacspecialite:
selected = ""
else:
selected = 'selected="selected"'
F.append(
"""&nbsp; Bac/Specialité: <select name="bacspecialite" onchange="javascript: submit(this);">
<option value="" %s>tous</option>
f"""&nbsp; Bac/Specialité: <select name="bacspecialite" onchange="javascript: submit(this);">
<option value="" {selected}>tous</option>
"""
% selected
)
for b in bacspecialites:
if bacspecialite == b:
selected = 'selected="selected"'
else:
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(
@ -910,46 +913,44 @@ def _gen_form_selectetuds(
)
#
F.append(
"""&nbsp; Genre: <select name="civilite" onchange="javascript: submit(this);">
<option value="" %s>tous</option>
f"""&nbsp; Genre: <select name="civilite" onchange="javascript: submit(this);">
<option value="" {selected}>tous</option>
"""
% selected
)
for b in civilites:
if civilite == b:
selected = 'selected="selected"'
else:
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(
"""&nbsp; Statut: <select name="statut" onchange="javascript: submit(this);">
<option value="" %s>tous</option>
f"""&nbsp; Statut: <select name="statut" onchange="javascript: submit(this);">
<option value="" {selected}>tous</option>
"""
% selected
)
for b in statuts:
if statut == b:
selected = 'selected="selected"'
else:
selected = ""
F.append('<option value="%s" %s>%s</option>' % (b, selected, b))
F.append(f'<option value="{b}" {selected}>{b}</option>')
F.append("</select>")
if only_primo:
checked = 'checked="1"'
else:
checked = ""
F.append(
'<br><input type="checkbox" name="only_primo" onchange="javascript: submit(this);" %s/>Restreindre aux primo-entrants'
% checked
f"""<br>
<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)
@ -964,7 +965,7 @@ def _gen_select_annee(field, values, value) -> str:
return menu_html + "</select>"
def _descr_etud_set(etudids):
def _descr_etud_set(etudids) -> str:
"textual html description of a set of etudids"
etuds = []
for etudid in etudids:
@ -980,15 +981,22 @@ def _count_dem_reo(formsemestre_id, etudids):
"count nb of demissions and reorientation in this etud set"
formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre)
validations_annuelles = nt.get_validations_annee() if nt.is_apc else {}
dems = set()
reos = set()
for etudid in etudids:
if nt.get_etud_etat(etudid) == "D":
dems.add(etudid)
dec = nt.get_etud_decision_sem(etudid)
if dec and dec["code"] in codes_cursus.CODES_SEM_REO:
reos.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)
if dec and dec["code"] in codes_cursus.CODES_SEM_REO:
reos.add(etudid)
return dems, reos

View File

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