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 import datetime
from app import db from app import db
from app.models.etudiants import Identite
from app.models.moduleimpls import ModuleImpl from app.models.moduleimpls import ModuleImpl
from app.models.notes import NotesNotes
from app.models.ues import UniteEns from app.models.ues import UniteEns
from app.scodoc.sco_exceptions import ScoValueError 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): class EvaluationUEPoids(db.Model):
"""Poids des évaluations (BUT) """Poids des évaluations (BUT)

View File

@ -27,13 +27,14 @@ from app.models.but_refcomp import (
ApcReferentielCompetences, ApcReferentielCompetences,
) )
from app.models.groups import GroupDescr, Partition from app.models.groups import GroupDescr, Partition
from app.scodoc.sco_exceptions import ScoValueError
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
from app.models.but_refcomp import parcours_formsemestre from app.models.but_refcomp import parcours_formsemestre
from app.models.etudiants import Identite from app.models.etudiants import Identite
from app.models.formations import Formation from app.models.formations import Formation
from app.models.modules import Module 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.ues import UniteEns
from app.models.validations import ScolarFormSemestreValidation from app.models.validations import ScolarFormSemestreValidation
@ -690,6 +691,31 @@ class FormSemestre(db.Model):
) )
return "\n".join(H) 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 # Association id des utilisateurs responsables (aka directeurs des etudes) du semestre
notes_formsemestre_responsables = db.Table( 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.comp.res_compat import NotesTableCompat
from app.models import Evaluation, FormSemestre from app.models import Evaluation, FormSemestre
from app.models import ScolarNews from app.models import ScolarNews
from app.models.etudiants import Identite
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
from app.scodoc.sco_utils import ModuleType from app.scodoc.sco_utils import ModuleType
import app.scodoc.notesdb as ndb 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>" 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): def do_evaluation_set_missing(evaluation_id, value, dialog_confirmed=False):
"""Initialisation des notes manquantes""" """Initialisation des notes manquantes"""
evaluation = Evaluation.query.get_or_404(evaluation_id) 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 for etudid, _ in etudid_etats: # pour tous les inscrits
if etudid not in notes_db: # pas de note if etudid not in notes_db: # pas de note
notes.append((etudid, value)) notes.append((etudid, value))
# Check value # Convert and check values
L, invalids, _, _, _ = _check_notes( L, invalids, _, _, _ = _check_notes(
notes, evaluation.to_dict(), modimpl.module.to_dict() notes, evaluation.to_dict(), modimpl.module.to_dict()
) )

View File

@ -203,6 +203,12 @@ sco_publish(
Permission.ScoImplement, Permission.ScoImplement,
methods=["GET", "POST"], 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( sco_publish(
"/formsemestre_recapcomplet", "/formsemestre_recapcomplet",
sco_recapcomplet.formsemestre_recapcomplet, sco_recapcomplet.formsemestre_recapcomplet,