Remplissage des notes des étudiants inscrits en cours de route

This commit is contained in:
Emmanuel Viennet 2022-10-05 23:48:54 +02:00 committed by iziram
parent 6f35e18a63
commit 665451b676
6 changed files with 2047 additions and 1850 deletions

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,9 @@
import datetime
from app import db
from app.models.etudiants import Identite
from app.models.moduleimpls import ModuleImpl
from app.models.notes import NotesNotes
from app.models.ues import UniteEns
from app.scodoc.sco_exceptions import ScoValueError
@ -176,6 +178,12 @@ class Evaluation(db.Model):
]
)
def get_etud_note(self, etud: Identite) -> NotesNotes:
"""La note de l'étudiant, ou None si pas noté.
(nb: pas de cache, lent, ne pas utiliser pour des calculs)
"""
return NotesNotes.query.filter_by(etudid=etud.id, evaluation_id=self.id).first()
class EvaluationUEPoids(db.Model):
"""Poids des évaluations (BUT)

View File

@ -27,13 +27,14 @@ from app.models.but_refcomp import (
ApcReferentielCompetences,
)
from app.models.groups import GroupDescr, Partition
from app.scodoc.sco_exceptions import ScoValueError
import app.scodoc.sco_utils as scu
from app.models.but_refcomp import parcours_formsemestre
from app.models.etudiants import Identite
from app.models.formations import Formation
from app.models.modules import Module
from app.models.moduleimpls import ModuleImpl
from app.models.moduleimpls import ModuleImpl, ModuleImplInscription
from app.models.ues import UniteEns
from app.models.validations import ScolarFormSemestreValidation
@ -690,6 +691,31 @@ class FormSemestre(db.Model):
)
return "\n".join(H)
def etud_set_all_missing_notes(self, etud: Identite, value=None) -> int:
"""Met toutes les notes manquantes de cet étudiant dans ce semestre
(ie dans toutes les évaluations des modules auxquels il est inscrit et n'a pas de note)
à la valeur donnée par value, qui est en général "ATT", "ABS", "EXC".
"""
from app.scodoc import sco_saisie_notes
inscriptions = (
ModuleImplInscription.query.filter_by(etudid=etud.id)
.join(ModuleImpl)
.filter_by(formsemestre_id=self.id)
)
nb_recorded = 0
for inscription in inscriptions:
for evaluation in inscription.modimpl.evaluations:
if evaluation.get_etud_note(etud) is None:
if not sco_saisie_notes.do_evaluation_set_etud_note(
evaluation, etud, value
):
raise ScoValueError(
"erreur lors de l'enregistrement de la note"
)
nb_recorded += 1
return nb_recorded
# Association id des utilisateurs responsables (aka directeurs des etudes) du semestre
notes_formsemestre_responsables = db.Table(

File diff suppressed because it is too large Load Diff

View File

@ -40,6 +40,7 @@ from app.comp import res_sem
from app.comp.res_compat import NotesTableCompat
from app.models import Evaluation, FormSemestre
from app.models import ScolarNews
from app.models.etudiants import Identite
import app.scodoc.sco_utils as scu
from app.scodoc.sco_utils import ModuleType
import app.scodoc.notesdb as ndb
@ -300,6 +301,25 @@ def do_evaluation_upload_xls():
return 0, msg + "<p>(pas de notes modifiées)</p>"
def do_evaluation_set_etud_note(evaluation: Evaluation, etud: Identite, value) -> bool:
"""Enregistre la note d'un seul étudiant
value: valeur externe (float ou str)
"""
if not sco_permissions_check.can_edit_notes(current_user, evaluation.moduleimpl.id):
raise AccessDenied(f"Modification des notes impossible pour {current_user}")
# Convert and check value
L, invalids, _, _, _ = _check_notes(
[(etud.id, value)], evaluation.to_dict(), evaluation.moduleimpl.module.to_dict()
)
if len(invalids) == 0:
nb_changed, _, _ = notes_add(
current_user, evaluation.id, L, "Initialisation notes"
)
if nb_changed == 1:
return True
return False # error
def do_evaluation_set_missing(evaluation_id, value, dialog_confirmed=False):
"""Initialisation des notes manquantes"""
evaluation = Evaluation.query.get_or_404(evaluation_id)
@ -318,7 +338,7 @@ def do_evaluation_set_missing(evaluation_id, value, dialog_confirmed=False):
for etudid, _ in etudid_etats: # pour tous les inscrits
if etudid not in notes_db: # pas de note
notes.append((etudid, value))
# Check value
# Convert and check values
L, invalids, _, _, _ = _check_notes(
notes, evaluation.to_dict(), modimpl.module.to_dict()
)

View File

@ -203,6 +203,12 @@ sco_publish(
Permission.ScoImplement,
methods=["GET", "POST"],
)
sco_publish(
"/formsemestre_view_etuds_sans_note",
sco_formsemestre_status.formsemestre_note_etuds_sans_notes,
Permission.ScoView,
methods=["GET", "POST"],
)
sco_publish(
"/formsemestre_recapcomplet",
sco_recapcomplet.formsemestre_recapcomplet,