Evaluations de deuxième session (pour Masters)

This commit is contained in:
Emmanuel Viennet 2021-03-11 14:49:37 +01:00
parent 61ff72082f
commit c5fe6ca674
7 changed files with 57 additions and 14 deletions

View File

@ -8,13 +8,14 @@ SCONAME = "ScoDoc"
SCONEWS = """ SCONEWS = """
<h4>Année 2021</h4> <h4>Année 2021</h4>
<ul> <ul>
<li>Évaluations de type "deuxième session"</li>
<li>Gestion du genre neutre (pas d'affichage de la civilité)</li> <li>Gestion du genre neutre (pas d'affichage de la civilité)</li>
<li>Diverses corrections (PV de jurys, ...)</li> <li>Diverses corrections (PV de jurys, ...)</li>
<li>Modernisation du code Python</li> <li>Modernisation du code Python</li>
</ul> </ul>
<h4>Année 2020</h4> <h4>Année 2020</h4>
<ul> <ul>
<li>Corrections d'erreurs, améliorations saise absences< et affichage bulletins</li> <li>Corrections d'erreurs, améliorations saisie absences et affichage bulletins</li>
<li>Nouveau site <a href="https://scodoc.org">scodoc.org</a> pour la documentation</li> <li>Nouveau site <a href="https://scodoc.org">scodoc.org</a> pour la documentation</li>
<li>Enregistrement de semestres extérieurs</li> <li>Enregistrement de semestres extérieurs</li>
<li>Améliorations PV de Jury</li> <li>Améliorations PV de Jury</li>

View File

@ -548,6 +548,8 @@ def _ue_mod_bulletin(context, etudid, formsemestre_id, ue_id, modimpls, nt, vers
e["coef_txt"] = scu.fmt_coef(e["coefficient"]) e["coef_txt"] = scu.fmt_coef(e["coefficient"])
if e["evaluation_type"] == scu.EVALUATION_RATTRAPAGE: if e["evaluation_type"] == scu.EVALUATION_RATTRAPAGE:
e["coef_txt"] = "rat." e["coef_txt"] = "rat."
elif e["evaluation_type"] == scu.EVALUATION_SESSION2:
e["coef_txt"] = "sess. 2"
if e["etat"]["evalattente"]: if e["etat"]["evalattente"]:
mod_attente = True # une eval en attente dans ce module mod_attente = True # une eval en attente dans ce module
if (not is_malus) or (val != "NP"): if (not is_malus) or (val != "NP"):

View File

@ -38,6 +38,7 @@ from sco_utils import (
NOTES_NEUTRALISE, NOTES_NEUTRALISE,
EVALUATION_NORMALE, EVALUATION_NORMALE,
EVALUATION_RATTRAPAGE, EVALUATION_RATTRAPAGE,
EVALUATION_SESSION2,
) )
from sco_exceptions import ScoException from sco_exceptions import ScoException
from notesdb import EditableTable, quote_html from notesdb import EditableTable, quote_html
@ -242,7 +243,10 @@ def do_moduleimpl_moyennes(context, nt, mod):
if e["etat"]["evalattente"]: if e["etat"]["evalattente"]:
attente = True attente = True
if e["evaluation_type"] == EVALUATION_RATTRAPAGE: if (
e["evaluation_type"] == EVALUATION_RATTRAPAGE
or e["evaluation_type"] == EVALUATION_SESSION2
):
if eval_rattr: if eval_rattr:
# !!! plusieurs rattrapages ! # !!! plusieurs rattrapages !
diag_info.update( diag_info.update(
@ -344,7 +348,7 @@ def do_moduleimpl_moyennes(context, nt, mod):
if diag_info: if diag_info:
diag_info["moduleimpl_id"] = moduleimpl_id diag_info["moduleimpl_id"] = moduleimpl_id
R[etudid] = user_moy R[etudid] = user_moy
# Note de rattrapage ? # Note de rattrapage ou dexuième session ?
if eval_rattr: if eval_rattr:
if eval_rattr["notes"].has_key(etudid): if eval_rattr["notes"].has_key(etudid):
note = eval_rattr["notes"][etudid]["value"] note = eval_rattr["notes"][etudid]["value"]
@ -353,8 +357,14 @@ def do_moduleimpl_moyennes(context, nt, mod):
R[etudid] = note R[etudid] = note
else: else:
note_sur_20 = note * 20.0 / eval_rattr["note_max"] note_sur_20 = note * 20.0 / eval_rattr["note_max"]
if note_sur_20 > R[etudid]: if eval_rattr["evaluation_type"] == EVALUATION_RATTRAPAGE:
# log('note_sur_20=%s' % note_sur_20) # rattrapage classique: prend la meilleure note entre moyenne
# module et note eval rattrapage
if note_sur_20 > R[etudid]:
# log('note_sur_20=%s' % note_sur_20)
R[etudid] = note_sur_20
elif eval_rattr["evaluation_type"] == EVALUATION_SESSION2:
# rattrapage type "deuxième session": remplace la note moyenne
R[etudid] = note_sur_20 R[etudid] = note_sur_20
return R, valid_evals, attente, diag_info return R, valid_evals, attente, diag_info

View File

@ -229,6 +229,7 @@ def do_evaluation_etat(
if ( if (
(TotalNbMissing > 0) (TotalNbMissing > 0)
and (E["evaluation_type"] != scu.EVALUATION_RATTRAPAGE) and (E["evaluation_type"] != scu.EVALUATION_RATTRAPAGE)
and (E["evaluation_type"] != scu.EVALUATION_SESSION2)
and not is_malus and not is_malus
): ):
complete = False complete = False
@ -891,12 +892,20 @@ def evaluation_create_form(
notes, en sus des moyennes de modules. Attention, cette option n'empêche pas la publication sur notes, en sus des moyennes de modules. Attention, cette option n'empêche pas la publication sur
les bulletins en version "longue" (la note est donc visible par les étudiants sur le portail). les bulletins en version "longue" (la note est donc visible par les étudiants sur le portail).
</p><p class="help"> </p><p class="help">
La modalité "rattrapage" permet de définir une évaluation dont les notes remplaceront les moyennes du modules Les modalités "rattrapage" et "deuxième session" définissent des évaluations prises en compte de
si elles sont meilleures que celles calculées. Dans ce cas, le coefficient est ignoré, et toutes les notes n'ont façon spéciale: </p>
<ul>
<li>les notes d'une évaluation de "rattrapage" remplaceront les moyennes du module
<em>si elles sont meilleures que celles calculées</em>.</li>
<li>les notes de "deuxième session" remplacent, lorsqu'elles sont saisies, la moyenne de l'étudiant
à ce module, même si la note de deuxième session est plus faible.</li>
</ul>
<p class="help">
Dans ces deux cas, le coefficient est ignoré, et toutes les notes n'ont
pas besoin d'être rentrées. pas besoin d'être rentrées.
</p> </p>
<p class="help"> <p class="help">
Les évaluations des modules de type "malus" sont spéciales: le coefficient n'est pas utilisé. Par ailleurs, les évaluations des modules de type "malus" sont toujours spéciales: le coefficient n'est pas utilisé.
Les notes de malus sont toujours comprises entre -20 et 20. Les points sont soustraits à la moyenne Les notes de malus sont toujours comprises entre -20 et 20. Les points sont soustraits à la moyenne
de l'UE à laquelle appartient le module malus (si la note est négative, la moyenne est donc augmentée). de l'UE à laquelle appartient le module malus (si la note est négative, la moyenne est donc augmentée).
</p> </p>
@ -1019,9 +1028,17 @@ def evaluation_create_form(
{ {
"input_type": "menu", "input_type": "menu",
"title": "Modalité", "title": "Modalité",
"allowed_values": (scu.EVALUATION_NORMALE, scu.EVALUATION_RATTRAPAGE), "allowed_values": (
scu.EVALUATION_NORMALE,
scu.EVALUATION_RATTRAPAGE,
scu.EVALUATION_SESSION2,
),
"type": "int", "type": "int",
"labels": ("Normale", "Rattrapage"), "labels": (
"Normale",
"Rattrapage (remplace si meilleure note)",
"Deuxième session (remplace toujours)",
),
}, },
), ),
] ]

View File

@ -34,6 +34,7 @@ import sco_utils as scu
from sco_utils import ( from sco_utils import (
EVALUATION_NORMALE, EVALUATION_NORMALE,
EVALUATION_RATTRAPAGE, EVALUATION_RATTRAPAGE,
EVALUATION_SESSION2,
) )
from sco_permissions import ScoEtudInscrit, ScoAbsChange from sco_permissions import ScoEtudInscrit, ScoAbsChange
from notes_log import log from notes_log import log
@ -341,8 +342,8 @@ def moduleimpl_status(context, moduleimpl_id=None, partition_id=None, REQUEST=No
partition_id=partition_id, partition_id=partition_id,
select_first_partition=True, select_first_partition=True,
) )
if eval["evaluation_type"] == EVALUATION_RATTRAPAGE: if eval["evaluation_type"] in (EVALUATION_RATTRAPAGE, EVALUATION_SESSION2):
tr_class = "mievr_rattr" tr_class = "mievr mievr_rattr"
else: else:
tr_class = "mievr" tr_class = "mievr"
tr_class_1 = "mievr" tr_class_1 = "mievr"
@ -361,7 +362,13 @@ def moduleimpl_status(context, moduleimpl_id=None, partition_id=None, REQUEST=No
) )
H.append("&nbsp;&nbsp;&nbsp; <em>%(description)s</em>" % eval) H.append("&nbsp;&nbsp;&nbsp; <em>%(description)s</em>" % eval)
if eval["evaluation_type"] == EVALUATION_RATTRAPAGE: if eval["evaluation_type"] == EVALUATION_RATTRAPAGE:
H.append("""<span class="mievr_rattr">rattrapage</span>""") H.append(
"""<span class="mievr_rattr" title="remplace si meilleure note">rattrapage</span>"""
)
elif eval["evaluation_type"] == EVALUATION_SESSION2:
H.append(
"""<span class="mievr_rattr" title="remplace autres notes">session 2</span>"""
)
if etat["last_modif"]: if etat["last_modif"]:
H.append( H.append(
"""<span class="mievr_lastmodif">(dernière modif le %s)</span>""" """<span class="mievr_lastmodif">(dernière modif le %s)</span>"""

View File

@ -111,6 +111,7 @@ NOTES_MENTIONS_LABS = (
EVALUATION_NORMALE = 0 EVALUATION_NORMALE = 0
EVALUATION_RATTRAPAGE = 1 EVALUATION_RATTRAPAGE = 1
EVALUATION_SESSION2 = 2
def fmt_note(val, note_max=None, keep_numeric=False): def fmt_note(val, note_max=None, keep_numeric=False):

View File

@ -1261,9 +1261,14 @@ tr.mievr_rattr {
background-color:#dddddd; background-color:#dddddd;
} }
span.mievr_rattr { span.mievr_rattr {
display: inline-block;
font-weight: bold; font-weight: bold;
color: blue; font-size: 80%;
color: white;
background-color: orangered;
margin-left: 2em; margin-left: 2em;
margin-top: 1px;
margin-bottom: 2px;;
border: 1px solid red; border: 1px solid red;
padding: 1px 3px 1px 3px; padding: 1px 3px 1px 3px;
} }