diff --git a/VERSION.py b/VERSION.py
index 3ff1eed40..b1d6df673 100644
--- a/VERSION.py
+++ b/VERSION.py
@@ -8,13 +8,14 @@ SCONAME = "ScoDoc"
SCONEWS = """
Année 2021
+- Évaluations de type "deuxième session"
- Gestion du genre neutre (pas d'affichage de la civilité)
- Diverses corrections (PV de jurys, ...)
- Modernisation du code Python
Année 2020
-- Corrections d'erreurs, améliorations saise absences< et affichage bulletins
+- Corrections d'erreurs, améliorations saisie absences et affichage bulletins
- Nouveau site scodoc.org pour la documentation
- Enregistrement de semestres extérieurs
- Améliorations PV de Jury
diff --git a/sco_bulletins.py b/sco_bulletins.py
index 83c39f070..fc2fb92a6 100644
--- a/sco_bulletins.py
+++ b/sco_bulletins.py
@@ -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"])
if e["evaluation_type"] == scu.EVALUATION_RATTRAPAGE:
e["coef_txt"] = "rat."
+ elif e["evaluation_type"] == scu.EVALUATION_SESSION2:
+ e["coef_txt"] = "sess. 2"
if e["etat"]["evalattente"]:
mod_attente = True # une eval en attente dans ce module
if (not is_malus) or (val != "NP"):
diff --git a/sco_compute_moy.py b/sco_compute_moy.py
index 368506fc5..904436b3a 100644
--- a/sco_compute_moy.py
+++ b/sco_compute_moy.py
@@ -38,6 +38,7 @@ from sco_utils import (
NOTES_NEUTRALISE,
EVALUATION_NORMALE,
EVALUATION_RATTRAPAGE,
+ EVALUATION_SESSION2,
)
from sco_exceptions import ScoException
from notesdb import EditableTable, quote_html
@@ -242,7 +243,10 @@ def do_moduleimpl_moyennes(context, nt, mod):
if e["etat"]["evalattente"]:
attente = True
- if e["evaluation_type"] == EVALUATION_RATTRAPAGE:
+ if (
+ e["evaluation_type"] == EVALUATION_RATTRAPAGE
+ or e["evaluation_type"] == EVALUATION_SESSION2
+ ):
if eval_rattr:
# !!! plusieurs rattrapages !
diag_info.update(
@@ -344,7 +348,7 @@ def do_moduleimpl_moyennes(context, nt, mod):
if diag_info:
diag_info["moduleimpl_id"] = moduleimpl_id
R[etudid] = user_moy
- # Note de rattrapage ?
+ # Note de rattrapage ou dexuième session ?
if eval_rattr:
if eval_rattr["notes"].has_key(etudid):
note = eval_rattr["notes"][etudid]["value"]
@@ -353,8 +357,14 @@ def do_moduleimpl_moyennes(context, nt, mod):
R[etudid] = note
else:
note_sur_20 = note * 20.0 / eval_rattr["note_max"]
- if note_sur_20 > R[etudid]:
- # log('note_sur_20=%s' % note_sur_20)
+ if eval_rattr["evaluation_type"] == EVALUATION_RATTRAPAGE:
+ # 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
return R, valid_evals, attente, diag_info
diff --git a/sco_evaluations.py b/sco_evaluations.py
index 82667bb58..1fe86a0f9 100644
--- a/sco_evaluations.py
+++ b/sco_evaluations.py
@@ -229,6 +229,7 @@ def do_evaluation_etat(
if (
(TotalNbMissing > 0)
and (E["evaluation_type"] != scu.EVALUATION_RATTRAPAGE)
+ and (E["evaluation_type"] != scu.EVALUATION_SESSION2)
and not is_malus
):
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
les bulletins en version "longue" (la note est donc visible par les étudiants sur le portail).
- La modalité "rattrapage" permet de définir une évaluation dont les notes remplaceront les moyennes du modules
- si elles sont meilleures que celles calculées. Dans ce cas, le coefficient est ignoré, et toutes les notes n'ont
+ Les modalités "rattrapage" et "deuxième session" définissent des évaluations prises en compte de
+ façon spéciale:
+
+ - les notes d'une évaluation de "rattrapage" remplaceront les moyennes du module
+ si elles sont meilleures que celles calculées.
+ - 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.
+
+
+ Dans ces deux cas, le coefficient est ignoré, et toutes les notes n'ont
pas besoin d'être rentrées.
- 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
de l'UE à laquelle appartient le module malus (si la note est négative, la moyenne est donc augmentée).
@@ -1019,9 +1028,17 @@ def evaluation_create_form(
{
"input_type": "menu",
"title": "Modalité",
- "allowed_values": (scu.EVALUATION_NORMALE, scu.EVALUATION_RATTRAPAGE),
+ "allowed_values": (
+ scu.EVALUATION_NORMALE,
+ scu.EVALUATION_RATTRAPAGE,
+ scu.EVALUATION_SESSION2,
+ ),
"type": "int",
- "labels": ("Normale", "Rattrapage"),
+ "labels": (
+ "Normale",
+ "Rattrapage (remplace si meilleure note)",
+ "Deuxième session (remplace toujours)",
+ ),
},
),
]
diff --git a/sco_moduleimpl_status.py b/sco_moduleimpl_status.py
index 62400761e..ba32596da 100644
--- a/sco_moduleimpl_status.py
+++ b/sco_moduleimpl_status.py
@@ -34,6 +34,7 @@ import sco_utils as scu
from sco_utils import (
EVALUATION_NORMALE,
EVALUATION_RATTRAPAGE,
+ EVALUATION_SESSION2,
)
from sco_permissions import ScoEtudInscrit, ScoAbsChange
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,
select_first_partition=True,
)
- if eval["evaluation_type"] == EVALUATION_RATTRAPAGE:
- tr_class = "mievr_rattr"
+ if eval["evaluation_type"] in (EVALUATION_RATTRAPAGE, EVALUATION_SESSION2):
+ tr_class = "mievr mievr_rattr"
else:
tr_class = "mievr"
tr_class_1 = "mievr"
@@ -361,7 +362,13 @@ def moduleimpl_status(context, moduleimpl_id=None, partition_id=None, REQUEST=No
)
H.append(" %(description)s" % eval)
if eval["evaluation_type"] == EVALUATION_RATTRAPAGE:
- H.append("""rattrapage""")
+ H.append(
+ """rattrapage"""
+ )
+ elif eval["evaluation_type"] == EVALUATION_SESSION2:
+ H.append(
+ """session 2"""
+ )
if etat["last_modif"]:
H.append(
"""(dernière modif le %s)"""
diff --git a/sco_utils.py b/sco_utils.py
index 60b26cbcb..6a30c3cb2 100644
--- a/sco_utils.py
+++ b/sco_utils.py
@@ -111,6 +111,7 @@ NOTES_MENTIONS_LABS = (
EVALUATION_NORMALE = 0
EVALUATION_RATTRAPAGE = 1
+EVALUATION_SESSION2 = 2
def fmt_note(val, note_max=None, keep_numeric=False):
diff --git a/static/css/scodoc.css b/static/css/scodoc.css
index deb9cf3c7..a3c5b031d 100644
--- a/static/css/scodoc.css
+++ b/static/css/scodoc.css
@@ -1261,9 +1261,14 @@ tr.mievr_rattr {
background-color:#dddddd;
}
span.mievr_rattr {
+ display: inline-block;
font-weight: bold;
- color: blue;
+ font-size: 80%;
+ color: white;
+ background-color: orangered;
margin-left: 2em;
+ margin-top: 1px;
+ margin-bottom: 2px;;
border: 1px solid red;
padding: 1px 3px 1px 3px;
}