diff --git a/app/comp/moy_ue.py b/app/comp/moy_ue.py index c533c21aa..8c1d68dab 100644 --- a/app/comp/moy_ue.py +++ b/app/comp/moy_ue.py @@ -33,7 +33,10 @@ import pandas as pd from app import db from app import models from app.models import ( + DispenseUE, FormSemestre, + FormSemestreInscription, + Identite, Module, ModuleImpl, ModuleUECoef, @@ -215,6 +218,31 @@ def notes_sem_load_cube(formsemestre: FormSemestre) -> tuple: ) +def load_dispense_ues( + formsemestre: FormSemestre, etudids: pd.Index, ues: list[UniteEns] +) -> set[tuple[int, int]]: + """Construit l'ensemble des + etudids = modimpl_inscr_df.index, # les etudids + ue_ids : modimpl_coefs_df.index, # les UE du formsemestre sans les UE bonus sport + + Résultat: set de (etudid, ue_id). + """ + dispense_ues = set() + ue_sem_by_code = {ue.ue_code: ue for ue in ues} + # Prend toutes les dispenses obtenues par des étudiants de ce formsemestre, + # puis filtre sur inscrits et code d'UE UE + for dispense_ue in DispenseUE.query.join( + Identite, FormSemestreInscription + ).filter_by(formsemestre_id=formsemestre.id): + if dispense_ue.etudid in etudids: + # UE dans le semestre avec même code ? + ue = ue_sem_by_code.get(dispense_ue.ue.ue_code) + if ue is not None: + dispense_ues.add((dispense_ue.etudid, ue.id)) + + return dispense_ues + + def compute_ue_moys_apc( sem_cube: np.array, etuds: list, diff --git a/app/comp/res_but.py b/app/comp/res_but.py index f3f0c97db..cf7f41018 100644 --- a/app/comp/res_but.py +++ b/app/comp/res_but.py @@ -72,7 +72,7 @@ class ResultatsSemestreBUT(NotesTableCompat): modimpl.module.ue.type != UE_SPORT for modimpl in self.formsemestre.modimpls_sorted ] - self.dispense_ues = DispenseUE.load_formsemestre_dispense_ues_set( + self.dispense_ues = moy_ue.load_dispense_ues( self.formsemestre, self.modimpl_inscr_df.index, self.ues ) self.etud_moy_ue = moy_ue.compute_ue_moys_apc( diff --git a/app/models/etudiants.py b/app/models/etudiants.py index d4ee28ef0..cc1d4d528 100644 --- a/app/models/etudiants.py +++ b/app/models/etudiants.py @@ -65,10 +65,6 @@ class Identite(db.Model): passive_deletes=True, ) - # Relations avec les assiduites et les justificatifs - assiduites = db.relationship("Assiduite", backref="etudiant", lazy="dynamic") - justificatifs = db.relationship("Justificatif", backref="etudiant", lazy="dynamic") - def __repr__(self): return ( f"" diff --git a/app/models/ues.py b/app/models/ues.py index 596e0bef6..2f14ee74f 100644 --- a/app/models/ues.py +++ b/app/models/ues.py @@ -256,23 +256,12 @@ class UniteEns(db.Model): class DispenseUE(db.Model): """Dispense d'UE - Utilisé en APC (BUT) pour indiquer les étudiants redoublants avec une UE capitalisée + Utilisé en PCC (BUT) pour indiquer les étudiants redoublants avec une UE capitalisée qu'ils ne refont pas. - La dispense d'UE n'est PAS une validation: - - elle n'est pas affectée par les décisions de jury (pas effacée) - - elle est associée à un formsemestre - - elle ne permet pas la délivrance d'ECTS ou du diplôme. - - On utilise cette dispense et non une "inscription" par souci d'efficacité: - en général, la grande majorité des étudiants suivront toutes les UEs de leur parcours, - la dispense étant une exception. """ - __table_args__ = (db.UniqueConstraint("formsemestre_id", "ue_id", "etudid"),) + __table_args__ = (db.UniqueConstraint("ue_id", "etudid"),) id = db.Column(db.Integer, primary_key=True) - formsemestre_id = formsemestre_id = db.Column( - db.Integer, db.ForeignKey("notes_formsemestre.id"), index=True, nullable=True - ) ue_id = db.Column( db.Integer, db.ForeignKey(UniteEns.id, ondelete="CASCADE"), @@ -291,25 +280,3 @@ class DispenseUE(db.Model): def __repr__(self) -> str: return f"""<{self.__class__.__name__} {self.id} etud={ repr(self.etud)} ue={repr(self.ue)}>""" - - @classmethod - def load_formsemestre_dispense_ues_set( - cls, formsemestre: "FormSemestre", etudids: pd.Index, ues: list[UniteEns] - ) -> set[tuple[int, int]]: - """Construit l'ensemble des - etudids = modimpl_inscr_df.index, # les etudids - ue_ids : modimpl_coefs_df.index, # les UE du formsemestre sans les UE bonus sport - - Résultat: set de (etudid, ue_id). - """ - # Prend toutes les dispenses obtenues par des étudiants de ce formsemestre, - # puis filtre sur inscrits et ues - ue_ids = {ue.id for ue in ues} - dispense_ues = { - (dispense_ue.etudid, dispense_ue.ue_id) - for dispense_ue in DispenseUE.query.filter_by( - formsemestre_id=formsemestre.id - ) - if dispense_ue.etudid in etudids and dispense_ue.ue_id in ue_ids - } - return dispense_ues diff --git a/app/scodoc/sco_evaluation_db.py b/app/scodoc/sco_evaluation_db.py index b99af2cc3..134bcd1ad 100644 --- a/app/scodoc/sco_evaluation_db.py +++ b/app/scodoc/sco_evaluation_db.py @@ -36,7 +36,7 @@ from flask_login import current_user from app import db, log -from app.models import Evaluation, ModuleImpl, ScolarNews +from app.models import ModuleImpl, ScolarNews from app.models.evaluations import evaluation_enrich_dict, check_evaluation_args import app.scodoc.sco_utils as scu import app.scodoc.notesdb as ndb diff --git a/app/scodoc/sco_moduleimpl_inscriptions.py b/app/scodoc/sco_moduleimpl_inscriptions.py index bf330adb3..7ac6b2cae 100644 --- a/app/scodoc/sco_moduleimpl_inscriptions.py +++ b/app/scodoc/sco_moduleimpl_inscriptions.py @@ -400,9 +400,7 @@ def moduleimpl_inscriptions_stats(formsemestre_id): # Etudiants "dispensés" d'une UE (capitalisée) ues_cap_info = get_etuds_with_capitalized_ue(formsemestre_id) if ues_cap_info: - H.append( - '

Étudiants avec UEs capitalisées (ADM):