From f94d40d316d4d7e23f1eb29567fdda1375b8eae3 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sat, 11 Dec 2021 20:27:58 +0100 Subject: [PATCH] greffe APC sur tableau recap. --- app/scodoc/notes_table.py | 31 ++++++++++++++++++++++++++++++- app/scodoc/sco_bulletins_xml.py | 2 +- app/scodoc/sco_edit_module.py | 16 +++++++++------- app/scodoc/sco_recapcomplet.py | 22 +++++++++++++++++----- app/templates/pn/form_mods.html | 2 +- 5 files changed, 58 insertions(+), 15 deletions(-) diff --git a/app/scodoc/notes_table.py b/app/scodoc/notes_table.py index fbfae8bc2..29314e3f2 100644 --- a/app/scodoc/notes_table.py +++ b/app/scodoc/notes_table.py @@ -32,6 +32,8 @@ from operator import itemgetter from flask import g, url_for +from app.but import bulletin_but +from app.models import FormSemestre, Identite from app.models import ScoDocSiteConfig import app.scodoc.sco_utils as scu from app.scodoc.sco_utils import ModuleType @@ -245,6 +247,14 @@ class NotesTable(object): self.formation["type_parcours"] ) + # En APC, il faut avoir toutes les UE du semestre + # (elles n'ont pas nécessairement un module rattaché): + if self.parcours.APC_SAE: + formsemestre = FormSemestre.query.get(formsemestre_id) + for ue in formsemestre.query_ues(): + if ue.id not in self.uedict: + self.uedict[ue.id] = ue.to_dict() + # Decisions jury et UE capitalisées self.comp_decisions_jury() self.comp_ue_capitalisees() @@ -294,7 +304,7 @@ class NotesTable(object): t.append(val) # t.append(etudid) - T.append(tuple(t)) + T.append(t) # tri par moyennes décroissantes, # en laissant les demissionnaires a la fin, par ordre alphabetique def row_key(x): @@ -1326,3 +1336,22 @@ class NotesTable(object): for e in self.get_evaluations_etats() if e["moduleimpl_id"] == moduleimpl_id ] + + def apc_recompute_moyennes(self): + """recalule les moyennes en APC (BUT) + et modifie en place le tableau T. + XXX Raccord provisoire avant refonte de cette classe. + """ + assert self.parcours.APC_SAE + formsemestre = FormSemestre.query.get(self.formsemestre_id) + results = bulletin_but.ResultatsSemestreBUT(formsemestre) + + # Rappel des épisodes précédents: T est une liste de liste + # Colonnes: 0 moy_gen, moy_ue1, ..., moy_ue_n, moy_mod1, ..., moy_mod_n, etudid + ues = self.get_ues() # incluant le(s) UE de sport + for t in self.T: + etudid = t[-1] + t[0] = results.etud_moy_gen[etudid] + for i, ue in enumerate(ues, start=1): + if ue["type"] != UE_SPORT: + t[i] = results.etud_moy_ue[ue["id"]][etudid] diff --git a/app/scodoc/sco_bulletins_xml.py b/app/scodoc/sco_bulletins_xml.py index 4234dcfe8..39ff1040d 100644 --- a/app/scodoc/sco_bulletins_xml.py +++ b/app/scodoc/sco_bulletins_xml.py @@ -81,7 +81,7 @@ def make_xml_formsemestre_bulletinetud( sem = sco_formsemestre.get_formsemestre(formsemestre_id) formsemestre = FormSemestre.query.get_or_404(formsemestre_id) - if formsemestre.formation.is_apc: + if formsemestre.formation.is_apc(): return bulletin_but_xml_compat( formsemestre_id, etudid, diff --git a/app/scodoc/sco_edit_module.py b/app/scodoc/sco_edit_module.py index b57213712..1fff8bd49 100644 --- a/app/scodoc/sco_edit_module.py +++ b/app/scodoc/sco_edit_module.py @@ -316,15 +316,14 @@ def module_create(matiere_id=None, module_type=None, semestre_id=None): raise ValueError("UE invalide") tf[2]["semestre_id"] = selected_ue.semestre_idx - module_id = do_module_create(tf[2]) + _ = do_module_create(tf[2]) - mod = Module.query.get(module_id) return flask.redirect( url_for( "notes.ue_table", scodoc_dept=g.scodoc_dept, formation_id=ue.formation_id, - semestre_idx=mod.semestre_id, + semestre_idx=tf[2]["semestre_id"], ) ) @@ -645,17 +644,20 @@ def module_edit(module_id=None): else: # l'UE peut changer tf[2]["ue_id"], tf[2]["matiere_id"] = tf[2]["ue_matiere_id"].split("!") + # En APC, force le semestre égal à celui de l'UE + if is_apc: + selected_ue = UniteEns.query.get(tf[2]["ue_id"]) + if selected_ue is None: + raise ValueError("UE invalide") + tf[2]["semestre_id"] = selected_ue.semestre_idx # Check unicité code module dans la formation do_module_edit(tf[2]) - # recharge au cas où le semestre ait changé: - mod = Module.query.get(module_id) - return flask.redirect( url_for( "notes.ue_table", scodoc_dept=g.scodoc_dept, formation_id=formation_id, - semestre_idx=mod.semestre_id, + semestre_idx=tf[2]["semestre_id"], ) ) diff --git a/app/scodoc/sco_recapcomplet.py b/app/scodoc/sco_recapcomplet.py index ce4f25690..34f1aee79 100644 --- a/app/scodoc/sco_recapcomplet.py +++ b/app/scodoc/sco_recapcomplet.py @@ -35,8 +35,11 @@ from xml.etree import ElementTree from flask import request from flask import make_response -import app.scodoc.sco_utils as scu from app import log +from app.but import bulletin_but +from app.models import FormSemestre, UniteEns, Module, ModuleImpl + +import app.scodoc.sco_utils as scu from app.scodoc import html_sco_header from app.scodoc import sco_bac from app.scodoc import sco_bulletins_json @@ -78,6 +81,10 @@ def formsemestre_recapcomplet( sem = sco_formsemestre.get_formsemestre(formsemestre_id) F = sco_formations.formation_list(args={"formation_id": sem["formation_id"]})[0] parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) + # Options pour APC BUT: cache les modules par défaut car moyenne n'a pas de sens + formsemestre = FormSemestre.query.get_or_404(formsemestre_id) + if formsemestre.formation.is_apc(): + hidemodules = True # traduit du DTML modejury = int(modejury) hidemodules = ( @@ -289,6 +296,8 @@ def make_formsemestre_recapcomplet( "apb_classement_gr", ] + formsemestre = FormSemestre.query.get_or_404(formsemestre_id) + # A ré-écrire XXX sem = sco_formsemestre.do_formsemestre_list( args={"formsemestre_id": formsemestre_id} )[0] @@ -298,6 +307,9 @@ def make_formsemestre_recapcomplet( modimpls = nt.get_modimpls() ues = nt.get_ues() # incluant le(s) UE de sport # + if formsemestre.formation.is_apc(): + nt.apc_recompute_moyennes() + # partitions, partitions_etud_groups = sco_groups.get_formsemestre_groups( formsemestre_id ) @@ -433,7 +445,8 @@ def make_formsemestre_recapcomplet( else: l.append(gr_name) # groupe - l.append(fmtnum(scu.fmt_note(t[0], keep_numeric=keep_numeric))) # moy_gen + # Moyenne générale + l.append(fmtnum(scu.fmt_note(t[0], keep_numeric=keep_numeric))) # Ajoute rangs dans groupes seulement si CSV ou XLS if format[:3] == "xls" or format == "csv": rang_gr, _, gr_name = sco_bulletins.get_etud_rangs_groups( @@ -442,9 +455,8 @@ def make_formsemestre_recapcomplet( for partition in partitions: l.append(rang_gr[partition["partition_id"]]) - i = 0 - for ue in ues: - i += 1 + + for i, ue in enumerate(ues, start=1): if ue["type"] != UE_SPORT: l.append( fmtnum(scu.fmt_note(t[i], keep_numeric=keep_numeric)) diff --git a/app/templates/pn/form_mods.html b/app/templates/pn/form_mods.html index 1b54b1ccf..045491f6e 100644 --- a/app/templates/pn/form_mods.html +++ b/app/templates/pn/form_mods.html @@ -36,7 +36,7 @@ {% if editable %}