This commit is contained in:
viennet 2020-12-23 23:49:11 +01:00
parent cf091d2c1a
commit ec006442c4
1 changed files with 53 additions and 47 deletions

View File

@ -27,15 +27,23 @@
"""Evaluations """Evaluations
""" """
import time
import urllib
import operator
import datetime
from notes_log import log, logCallStack from notes_log import log, logCallStack
from sco_utils import * import sco_utils as scu
from notesdb import * from notesdb import ScoDocCursor
from sco_exceptions import AccessDenied, ScoValueError
import VERSION
from gen_tables import GenTable from gen_tables import GenTable
from TrivialFormulator import TrivialFormulator
import sco_news import sco_news
import sco_formsemestre import sco_formsemestre
import sco_groups import sco_groups
import ZAbsences import ZAbsences
import sco_evaluations
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# #
@ -47,7 +55,7 @@ def notes_moyenne_median_mini_maxi(notes):
notes = [ notes = [
x x
for x in notes for x in notes
if (x != None) and (x != NOTES_NEUTRALISE) and (x != NOTES_ATTENTE) if (x != None) and (x != scu.NOTES_NEUTRALISE) and (x != scu.NOTES_ATTENTE)
] ]
n = len(notes) n = len(notes)
if not n: if not n:
@ -136,8 +144,8 @@ def do_evaluation_etat(
NotesDB = context._notes_getall(evaluation_id) # { etudid : value } NotesDB = context._notes_getall(evaluation_id) # { etudid : value }
notes = [x["value"] for x in NotesDB.values()] notes = [x["value"] for x in NotesDB.values()]
nb_abs = len([x for x in notes if x is None]) nb_abs = len([x for x in notes if x is None])
nb_neutre = len([x for x in notes if x == NOTES_NEUTRALISE]) nb_neutre = len([x for x in notes if x == scu.NOTES_NEUTRALISE])
nb_att = len([x for x in notes if x == NOTES_ATTENTE]) nb_att = len([x for x in notes if x == scu.NOTES_ATTENTE])
moy_num, median_num, mini_num, maxi_num = notes_moyenne_median_mini_maxi(notes) moy_num, median_num, mini_num, maxi_num = notes_moyenne_median_mini_maxi(notes)
if moy_num is None: if moy_num is None:
median, moy = "", "" median, moy = "", ""
@ -145,10 +153,10 @@ def do_evaluation_etat(
mini, maxi = "", "" mini, maxi = "", ""
mini_num, maxi_num = None, None mini_num, maxi_num = None, None
else: else:
median = fmt_note(median_num) median = scu.fmt_note(median_num)
moy = fmt_note(moy_num) moy = scu.fmt_note(moy_num)
mini = fmt_note(mini_num) mini = scu.fmt_note(mini_num)
maxi = fmt_note(maxi_num) maxi = scu.fmt_note(maxi_num)
# cherche date derniere modif note # cherche date derniere modif note
if len(NotesDB): if len(NotesDB):
t = [x["date"] for x in NotesDB.values()] t = [x["date"] for x in NotesDB.values()]
@ -159,7 +167,7 @@ def do_evaluation_etat(
E = context.do_evaluation_list(args={"evaluation_id": evaluation_id})[0] E = context.do_evaluation_list(args={"evaluation_id": evaluation_id})[0]
M = context.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] M = context.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = context.do_module_list(args={"module_id": M["module_id"]})[0]
is_malus = Mod["module_type"] == MODULE_MALUS # True si module de malus is_malus = Mod["module_type"] == scu.MODULE_MALUS # True si module de malus
formsemestre_id = M["formsemestre_id"] formsemestre_id = M["formsemestre_id"]
# Si partition_id is None, prend 'all' ou bien la premiere: # Si partition_id is None, prend 'all' ou bien la premiere:
if partition_id is None: if partition_id is None:
@ -186,8 +194,8 @@ def do_evaluation_etat(
# On considere une note "manquante" lorsqu'elle n'existe pas # On considere une note "manquante" lorsqu'elle n'existe pas
# ou qu'elle est en attente (ATT) # ou qu'elle est en attente (ATT)
GrNbMissing = DictDefault() # group_id : nb notes manquantes GrNbMissing = scu.DictDefault() # group_id : nb notes manquantes
GrNotes = DictDefault(defaultvalue=[]) # group_id: liste notes valides GrNotes = scu.DictDefault(defaultvalue=[]) # group_id: liste notes valides
TotalNbMissing = 0 TotalNbMissing = 0
TotalNbAtt = 0 TotalNbAtt = 0
groups = {} # group_id : group groups = {} # group_id : group
@ -201,14 +209,14 @@ def do_evaluation_etat(
isMissing = False isMissing = False
if NotesDB.has_key(i["etudid"]): if NotesDB.has_key(i["etudid"]):
val = NotesDB[i["etudid"]]["value"] val = NotesDB[i["etudid"]]["value"]
if val == NOTES_ATTENTE: if val == scu.NOTES_ATTENTE:
isMissing = True isMissing = True
TotalNbAtt += 1 TotalNbAtt += 1
if group: if group:
GrNotes[group["group_id"]].append(val) GrNotes[group["group_id"]].append(val)
else: else:
if group: if group:
junk = GrNotes[group["group_id"]] # create group _ = GrNotes[group["group_id"]] # create group
isMissing = True isMissing = True
if isMissing: if isMissing:
TotalNbMissing += 1 TotalNbMissing += 1
@ -219,7 +227,7 @@ def do_evaluation_etat(
gr_incomplets.sort() gr_incomplets.sort()
if ( if (
(TotalNbMissing > 0) (TotalNbMissing > 0)
and (E["evaluation_type"] != EVALUATION_RATTRAPAGE) and (E["evaluation_type"] != scu.EVALUATION_RATTRAPAGE)
and not is_malus and not is_malus
): ):
complete = False complete = False
@ -244,15 +252,15 @@ def do_evaluation_etat(
"group_id": group_id, "group_id": group_id,
"group_name": groups[group_id]["group_name"], "group_name": groups[group_id]["group_name"],
"gr_moy_num": gr_moy, "gr_moy_num": gr_moy,
"gr_moy": fmt_note(gr_moy), "gr_moy": scu.fmt_note(gr_moy),
"gr_median_num": gr_median, "gr_median_num": gr_median,
"gr_median": fmt_note(gr_median), "gr_median": scu.fmt_note(gr_median),
"gr_mini": fmt_note(gr_mini), "gr_mini": scu.fmt_note(gr_mini),
"gr_maxi": fmt_note(gr_maxi), "gr_maxi": scu.fmt_note(gr_maxi),
"gr_mini": gr_mini, "gr_mini_num": gr_mini,
"gr_maxi": gr_maxi, "gr_maxi_num": gr_maxi,
"gr_nb_notes": len(notes), "gr_nb_notes": len(notes),
"gr_nb_att": len([x for x in notes if x == NOTES_ATTENTE]), "gr_nb_att": len([x for x in notes if x == scu.NOTES_ATTENTE]),
} }
) )
gr_moyennes.sort(key=operator.itemgetter("group_name")) gr_moyennes.sort(key=operator.itemgetter("group_name"))
@ -380,7 +388,7 @@ def _eval_etat(evals):
nb_evals_en_cours += 1 nb_evals_en_cours += 1
dates.append(e["etat"]["last_modif"]) dates.append(e["etat"]["last_modif"])
dates = sort_dates(dates) dates = scu.sort_dates(dates)
if len(dates): if len(dates):
last_modif = dates[-1] # date de derniere modif d'une note dans un module last_modif = dates[-1] # date de derniere modif d'une note dans un module
@ -511,18 +519,18 @@ def evaluation_date_first_completion(context, evaluation_id):
if not etat["evalcomplete"]: if not etat["evalcomplete"]:
return None return None
E = context.do_evaluation_list(args={"evaluation_id": evaluation_id})[0] # XXX inachevé ou à revoir ?
M = context.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0]
formsemestre_id = M["formsemestre_id"]
# Il faut considerer les inscriptions au semestre # Il faut considerer les inscriptions au semestre
# (pour avoir l'etat et le groupe) et aussi les inscriptions # (pour avoir l'etat et le groupe) et aussi les inscriptions
# au module (pour gerer les modules optionnels correctement) # au module (pour gerer les modules optionnels correctement)
insem = context.do_formsemestre_inscription_listinscrits(formsemestre_id) # E = context.do_evaluation_list(args={"evaluation_id": evaluation_id})[0]
insmod = context.do_moduleimpl_inscription_list(moduleimpl_id=E["moduleimpl_id"]) # M = context.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0]
insmodset = set([x["etudid"] for x in insmod]) # formsemestre_id = M["formsemestre_id"]
# insem = context.do_formsemestre_inscription_listinscrits(formsemestre_id)
# insmod = context.do_moduleimpl_inscription_list(moduleimpl_id=E["moduleimpl_id"])
# insmodset = set([x["etudid"] for x in insmod])
# retire de insem ceux qui ne sont pas inscrits au module # retire de insem ceux qui ne sont pas inscrits au module
ins = [i for i in insem if i["etudid"] in insmodset] # ins = [i for i in insem if i["etudid"] in insmodset]
notes = context._notes_getall(evaluation_id, filter_suppressed=False).values() notes = context._notes_getall(evaluation_id, filter_suppressed=False).values()
notes_log = context._notes_getall( notes_log = context._notes_getall(
@ -560,8 +568,8 @@ def formsemestre_evaluations_delai_correction(
for e in evals: for e in evals:
M = context.do_moduleimpl_list(moduleimpl_id=e["moduleimpl_id"])[0] M = context.do_moduleimpl_list(moduleimpl_id=e["moduleimpl_id"])[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = context.do_module_list(args={"module_id": M["module_id"]})[0]
if (e["evaluation_type"] != EVALUATION_NORMALE) or ( if (e["evaluation_type"] != scu.EVALUATION_NORMALE) or (
Mod["module_type"] == MODULE_MALUS Mod["module_type"] == scu.MODULE_MALUS
): ):
continue continue
e["date_first_complete"] = evaluation_date_first_completion( e["date_first_complete"] = evaluation_date_first_completion(
@ -612,8 +620,8 @@ def formsemestre_evaluations_delai_correction(
caption="Correction des évaluations du semestre", caption="Correction des évaluations du semestre",
preferences=context.get_preferences(formsemestre_id), preferences=context.get_preferences(formsemestre_id),
base_url="%s?formsemestre_id=%s" % (REQUEST.URL0, formsemestre_id), base_url="%s?formsemestre_id=%s" % (REQUEST.URL0, formsemestre_id),
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "", origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
filename=make_filename("evaluations_delais_" + sem["titreannee"]), filename=scu.make_filename("evaluations_delais_" + sem["titreannee"]),
) )
return tab.make_page(context, format=format, REQUEST=REQUEST) return tab.make_page(context, format=format, REQUEST=REQUEST)
@ -727,7 +735,6 @@ def evaluation_describe(context, evaluation_id="", edit_in_place=True, REQUEST=N
M = context.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] M = context.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = context.do_module_list(args={"module_id": M["module_id"]})[0]
formsemestre_id = M["formsemestre_id"] formsemestre_id = M["formsemestre_id"]
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
u = context.Users.user_info(M["responsable_id"]) u = context.Users.user_info(M["responsable_id"])
resp = u["prenomnom"] resp = u["prenomnom"]
nomcomplet = u["nomcomplet"] nomcomplet = u["nomcomplet"]
@ -747,13 +754,13 @@ def evaluation_describe(context, evaluation_id="", edit_in_place=True, REQUEST=N
etit = E["description"] or "" etit = E["description"] or ""
if etit: if etit:
etit = ' "' + etit + '"' etit = ' "' + etit + '"'
if Mod["module_type"] == MODULE_MALUS: if Mod["module_type"] == scu.MODULE_MALUS:
etit += ' <span class="eval_malus">(points de malus)</span>' etit += ' <span class="eval_malus">(points de malus)</span>'
H = [ H = [
'<span class="eval_title">Evaluation%s</span><p><b>Module : %s</b></p>' '<span class="eval_title">Evaluation%s</span><p><b>Module : %s</b></p>'
% (etit, mod_descr) % (etit, mod_descr)
] ]
if Mod["module_type"] == MODULE_MALUS: if Mod["module_type"] == scu.MODULE_MALUS:
# Indique l'UE # Indique l'UE
ue = context.do_ue_list(args={"ue_id": Mod["ue_id"]})[0] ue = context.do_ue_list(args={"ue_id": Mod["ue_id"]})[0]
H.append("<p><b>UE : %(acronyme)s</b></p>" % ue) H.append("<p><b>UE : %(acronyme)s</b></p>" % ue)
@ -804,9 +811,9 @@ def evaluation_create_form(
moduleimpl_id = the_eval["moduleimpl_id"] moduleimpl_id = the_eval["moduleimpl_id"]
# #
M = context.do_moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0] M = context.do_moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0]
is_malus = M["module"]["module_type"] == MODULE_MALUS # True si module de malus is_malus = M["module"]["module_type"] == scu.MODULE_MALUS # True si module de malus
formsemestre_id = M["formsemestre_id"] formsemestre_id = M["formsemestre_id"]
min_note_max = NOTES_PRECISION # le plus petit bareme possible min_note_max = scu.NOTES_PRECISION # le plus petit bareme possible
if not readonly: if not readonly:
try: try:
context._evaluation_check_write_access(REQUEST, moduleimpl_id=moduleimpl_id) context._evaluation_check_write_access(REQUEST, moduleimpl_id=moduleimpl_id)
@ -853,17 +860,16 @@ def evaluation_create_form(
# Note maximale actuelle dans cette eval ? # Note maximale actuelle dans cette eval ?
etat = do_evaluation_etat(context, evaluation_id) etat = do_evaluation_etat(context, evaluation_id)
if etat["maxi_num"] is not None: if etat["maxi_num"] is not None:
min_note_max = max(NOTES_PRECISION, etat["maxi_num"]) min_note_max = max(scu.NOTES_PRECISION, etat["maxi_num"])
else: else:
min_note_max = NOTES_PRECISION min_note_max = scu.NOTES_PRECISION
# #
if min_note_max > NOTES_PRECISION: if min_note_max > scu.NOTES_PRECISION:
min_note_max_str = fmt_note(min_note_max) min_note_max_str = scu.fmt_note(min_note_max)
else: else:
min_note_max_str = "0" min_note_max_str = "0"
# #
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = context.do_module_list(args={"module_id": M["module_id"]})[0]
sem = sco_formsemestre.get_formsemestre(context, M["formsemestre_id"])
# #
help = """<div class="help"><p class="help"> help = """<div class="help"><p class="help">
Le coefficient d'une évaluation n'est utilisé que pour pondérer les évaluations au sein d'un module. Le coefficient d'une évaluation n'est utilisé que pour pondérer les évaluations au sein d'un module.
@ -973,7 +979,7 @@ def evaluation_create_form(
"title": "Notes de 0 à", "title": "Notes de 0 à",
"explanation": "barème (note max actuelle: %s)" % min_note_max_str, "explanation": "barème (note max actuelle: %s)" % min_note_max_str,
"allow_null": False, "allow_null": False,
"max_value": NOTES_MAX, "max_value": scu.NOTES_MAX,
"min_value": min_note_max, "min_value": min_note_max,
}, },
), ),
@ -1008,7 +1014,7 @@ def evaluation_create_form(
{ {
"input_type": "menu", "input_type": "menu",
"title": "Modalité", "title": "Modalité",
"allowed_values": (EVALUATION_NORMALE, EVALUATION_RATTRAPAGE), "allowed_values": (scu.EVALUATION_NORMALE, scu.EVALUATION_RATTRAPAGE),
"type": "int", "type": "int",
"labels": ("Normale", "Rattrapage"), "labels": ("Normale", "Rattrapage"),
}, },