Améliore initialisation poids évaluations

This commit is contained in:
Emmanuel Viennet 2022-10-05 10:31:25 +02:00
parent 75c5256ba9
commit 10caea92ae
5 changed files with 55 additions and 21 deletions

View File

@ -100,6 +100,29 @@ class Evaluation(db.Model):
db.session.add(copy) db.session.add(copy)
return copy return copy
def set_default_poids(self) -> bool:
"""Initialize les poids bvers les UE à leurs valeurs par défaut
C'est à dire à 1 si le coef. module/UE est non nul, 0 sinon.
Les poids existants ne sont pas modifiés.
Return True if (uncommited) modification, False otherwise.
"""
ue_coef_dict = self.moduleimpl.module.get_ue_coef_dict()
sem_ues = self.moduleimpl.formsemestre.query_ues(with_sport=False).all()
modified = False
for ue in sem_ues:
existing_poids = EvaluationUEPoids.query.filter_by(
ue=ue, evaluation=self
).first()
if existing_poids is None:
coef_ue = ue_coef_dict.get(ue.id, 0.0) or 0.0
if coef_ue > 0:
poids = 1.0 # par défaut au départ
else:
poids = 0.0
self.set_ue_poids(ue, poids)
modified = True
return modified
def set_ue_poids(self, ue, poids: float) -> None: def set_ue_poids(self, ue, poids: float) -> None:
"""Set poids évaluation vers cette UE""" """Set poids évaluation vers cette UE"""
self.update_ue_poids_dict({ue.id: poids}) self.update_ue_poids_dict({ue.id: poids})

View File

@ -39,6 +39,7 @@ from flask import request
from app import db from app import db
from app import log from app import log
from app import models from app import models
from app.models.evaluations import Evaluation
from app.models.formsemestre import FormSemestre from app.models.formsemestre import FormSemestre
from app.models.moduleimpls import ModuleImpl from app.models.moduleimpls import ModuleImpl
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
@ -61,11 +62,17 @@ def evaluation_create_form(
): ):
"Formulaire création/édition d'une évaluation (pas de ses notes)" "Formulaire création/édition d'une évaluation (pas de ses notes)"
if evaluation_id is not None: if evaluation_id is not None:
evaluation = models.Evaluation.query.get(evaluation_id) evaluation: Evaluation = models.Evaluation.query.get(evaluation_id)
if evaluation is None: if evaluation is None:
raise ScoValueError("Cette évaluation n'existe pas ou plus !") raise ScoValueError("Cette évaluation n'existe pas ou plus !")
moduleimpl_id = evaluation.moduleimpl_id moduleimpl_id = evaluation.moduleimpl_id
# #
modimpl: ModuleImpl = (
ModuleImpl.query.filter_by(id=moduleimpl_id)
.join(FormSemestre)
.filter_by(dept_id=g.scodoc_dept_id)
.first_or_404()
)
modimpl_o = sco_moduleimpl.moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[ modimpl_o = sco_moduleimpl.moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[
0 0
] ]
@ -126,7 +133,7 @@ def evaluation_create_form(
# #
H = [ H = [
f"""<h3>{action} en f"""<h3>{action} en
{scu.MODULE_TYPE_NAMES[mod["module_type"]]} <a href="{ {scu.MODULE_TYPE_NAMES[mod["module_type"]]} <a class="stdlink" href="{
url_for("notes.moduleimpl_status", url_for("notes.moduleimpl_status",
scodoc_dept=g.scodoc_dept, moduleimpl_id=moduleimpl_id) scodoc_dept=g.scodoc_dept, moduleimpl_id=moduleimpl_id)
}">{mod["code"] or "module sans code"} {mod["titre"]}</a> {link}</h3> }">{mod["code"] or "module sans code"} {mod["titre"]}</a> {link}</h3>
@ -145,25 +152,22 @@ def evaluation_create_form(
if vals.get("tf_submitted", False) and "visibulletinlist" not in vals: if vals.get("tf_submitted", False) and "visibulletinlist" not in vals:
vals["visibulletinlist"] = [] vals["visibulletinlist"] = []
# #
ue_coef_dict = {} ue_coef_dict = modimpl.module.get_ue_coef_dict()
if is_apc: # BUT: poids vers les UE if is_apc: # BUT: poids vers les UE
ue_coef_dict = ModuleImpl.query.get(moduleimpl_id).module.get_ue_coef_dict() if edit:
for ue in sem_ues: if evaluation.set_default_poids():
if edit: db.session.commit()
existing_poids = models.EvaluationUEPoids.query.filter_by( ue_poids_dict = evaluation.get_ue_poids_dict()
ue=ue, evaluation=evaluation for ue in sem_ues:
).first() initvalues[f"poids_{ue.id}"] = ue_poids_dict[ue.id]
else: else:
existing_poids = None for ue in sem_ues:
if existing_poids:
poids = existing_poids.poids
else:
coef_ue = ue_coef_dict.get(ue.id, 0.0) or 0.0 coef_ue = ue_coef_dict.get(ue.id, 0.0) or 0.0
if coef_ue > 0: if coef_ue > 0:
poids = 1.0 # par défaut au départ poids = 1.0 # par défaut au départ
else: else:
poids = 0.0 poids = 0.0
initvalues[f"poids_{ue.id}"] = poids initvalues[f"poids_{ue.id}"] = poids
# #
form = [ form = [
("evaluation_id", {"default": evaluation_id, "input_type": "hidden"}), ("evaluation_id", {"default": evaluation_id, "input_type": "hidden"}),
@ -221,7 +225,7 @@ def evaluation_create_form(
"size": 4, "size": 4,
"type": "float", "type": "float",
"title": "Notes de 0 à", "title": "Notes de 0 à",
"explanation": "barème (note max actuelle: %s)" % min_note_max_str, "explanation": f"barème (note max actuelle: {min_note_max_str})",
"allow_null": False, "allow_null": False,
"max_value": scu.NOTES_MAX, "max_value": scu.NOTES_MAX,
"min_value": min_note_max, "min_value": min_note_max,
@ -232,7 +236,7 @@ def evaluation_create_form(
{ {
"size": 36, "size": 36,
"type": "text", "type": "text",
"explanation": 'type d\'évaluation, apparait sur le bulletins longs. Exemples: "contrôle court", "examen de TP", "examen final".', "explanation": """type d'évaluation, apparait sur le bulletins longs. Exemples: "contrôle court", "examen de TP", "examen final".""",
}, },
), ),
( (
@ -320,7 +324,9 @@ def evaluation_create_form(
readonly=False, readonly=False,
) )
dest_url = "moduleimpl_status?moduleimpl_id=%s" % modimpl_o["moduleimpl_id"] dest_url = url_for(
"notes.moduleimpl_status", scodoc_dept=g.scodoc_dept, moduleimpl_id=modimpl.id
)
if tf[0] == 0: if tf[0] == 0:
head = html_sco_header.sco_header(page_title=page_title) head = html_sco_header.sco_header(page_title=page_title)
return ( return (
@ -342,7 +348,7 @@ def evaluation_create_form(
if edit: if edit:
sco_evaluation_db.do_evaluation_edit(tf[2]) sco_evaluation_db.do_evaluation_edit(tf[2])
else: else:
# création d'une evaluation # création d'une evaluation (via fonction ScoDoc7)
evaluation_id = sco_evaluation_db.do_evaluation_create(**tf[2]) evaluation_id = sco_evaluation_db.do_evaluation_create(**tf[2])
if is_apc: if is_apc:
# Set poids # Set poids

View File

@ -33,6 +33,7 @@ import time
from flask import g, url_for from flask import g, url_for
from flask_login import current_user from flask_login import current_user
from app import db
from app.auth.models import User from app.auth.models import User
from app.comp import res_sem from app.comp import res_sem
from app.comp.res_compat import NotesTableCompat from app.comp.res_compat import NotesTableCompat
@ -527,6 +528,10 @@ def _ligne_evaluation(
H.append(f"""<tr class="{tr_class_1}"><td class="mievr_tit" colspan="8">""") H.append(f"""<tr class="{tr_class_1}"><td class="mievr_tit" colspan="8">""")
coef = evaluation.coefficient coef = evaluation.coefficient
if is_apc: if is_apc:
if not evaluation.get_ue_poids_dict():
# Au cas où les poids par défaut n'existent pas encore:
if evaluation.set_default_poids():
db.session.commit()
coef *= sum(evaluation.get_ue_poids_dict().values()) coef *= sum(evaluation.get_ue_poids_dict().values())
# Avertissement si coefs x poids nuls # Avertissement si coefs x poids nuls
if coef < scu.NOTES_PRECISION: if coef < scu.NOTES_PRECISION:

View File

@ -1125,7 +1125,7 @@ def _form_dem_of_def(
{validations_descr} {validations_descr}
{('<p><a class="stdlink" href="' {('<p><a class="stdlink" href="'
+ url_for("notes.formsemestre_validation_but", scodoc_dept=g.scodoc_dept, + url_for("notes.formsemestre_validation_but", scodoc_dept=g.scodoc_dept,
formsemestre_id=formsemestre_id,etudid=etudid) formsemestre_id=formsemestre_id, etudid=etudid)
+ '">modifier ces décisions</a></p>') if validations_descr else ""} + '">modifier ces décisions</a></p>') if validations_descr else ""}
</div> </div>
{html_sco_header.sco_footer()} {html_sco_header.sco_footer()}

View File

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