From 80b44658152cacdffe09035bcf558bfa1891d958 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Mon, 23 Jan 2023 20:35:15 -0300 Subject: [PATCH] Fix #564 Passage de semestre: inscrire aux groupes de parcours si ils existent --- app/__init__.py | 8 ++--- app/scodoc/sco_formsemestre_edit.py | 15 +++++++-- app/scodoc/sco_groups.py | 8 +++-- app/scodoc/sco_inscr_passage.py | 51 +++++++++++++++-------------- app/views/scolar.py | 2 +- 5 files changed, 49 insertions(+), 35 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 5217736fc..51e122cd5 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -561,11 +561,11 @@ def critical_error(msg): clear_scodoc_cache() raise ScoValueError( f""" - Une erreur est survenue. - - Si le problème persiste, merci de contacter le support ScoDoc via + Une erreur est survenue. + + Si le problème persiste, merci de contacter le support ScoDoc via {scu.SCO_DISCORD_ASSISTANCE} - + {msg} """ ) diff --git a/app/scodoc/sco_formsemestre_edit.py b/app/scodoc/sco_formsemestre_edit.py index 399cf05db..a584aa08e 100644 --- a/app/scodoc/sco_formsemestre_edit.py +++ b/app/scodoc/sco_formsemestre_edit.py @@ -1185,7 +1185,10 @@ def do_formsemestre_clone( """Clone a semestre: make copy, same modules, same options, same resps, same partitions. New dates, responsable_id """ - log("cloning %s" % orig_formsemestre_id) + log(f"cloning orig_formsemestre_id") + formsemestre_orig: FormSemestre = FormSemestre.query.get_or_404( + orig_formsemestre_id + ) orig_sem = sco_formsemestre.get_formsemestre(orig_formsemestre_id) cnx = ndb.GetDBConnexion() # 1- create sem @@ -1196,7 +1199,8 @@ def do_formsemestre_clone( args["date_fin"] = date_fin args["etat"] = 1 # non verrouillé formsemestre_id = sco_formsemestre.do_formsemestre_create(args) - log("created formsemestre %s" % formsemestre_id) + log(f"created formsemestre {formsemestre_id}") + formsemestre: FormSemestre = FormSemestre.query.get(formsemestre_id) # 2- create moduleimpls mods_orig = sco_moduleimpl.moduleimpl_list(formsemestre_id=orig_formsemestre_id) for mod_orig in mods_orig: @@ -1258,7 +1262,12 @@ def do_formsemestre_clone( args["formsemestre_id"] = formsemestre_id _ = sco_compute_moy.formsemestre_ue_computation_expr_create(cnx, args) - # 5- Copy partitions and groups + # 6- Copie les parcours + formsemestre.parcours = formsemestre_orig.parcours + db.session.add(formsemestre) + db.session.commit() + + # 7- Copy partitions and groups if clone_partitions: sco_groups_copy.clone_partitions_and_groups( orig_formsemestre_id, formsemestre_id diff --git a/app/scodoc/sco_groups.py b/app/scodoc/sco_groups.py index 3c350b50d..607369217 100644 --- a/app/scodoc/sco_groups.py +++ b/app/scodoc/sco_groups.py @@ -664,8 +664,10 @@ def set_group(etudid: int, group_id: int) -> bool: return True -def change_etud_group_in_partition(etudid, group_id, partition=None): - """Inscrit etud au groupe de cette partition, et le desinscrit d'autres groupes de cette partition.""" +def change_etud_group_in_partition(etudid: int, group_id: int, partition: dict = None): + """Inscrit etud au groupe de cette partition, + et le desinscrit d'autres groupes de cette partition. + """ log("change_etud_group_in_partition: etudid=%s group_id=%s" % (etudid, group_id)) # 0- La partition @@ -706,7 +708,7 @@ def change_etud_group_in_partition(etudid, group_id, partition=None): cnx.commit() # 5- Update parcours - formsemestre = FormSemestre.query.get(formsemestre_id) + formsemestre: FormSemestre = FormSemestre.query.get(formsemestre_id) formsemestre.update_inscriptions_parcours_from_groups() # 6- invalidate cache diff --git a/app/scodoc/sco_inscr_passage.py b/app/scodoc/sco_inscr_passage.py index 22c36b3c8..d9a562f46 100644 --- a/app/scodoc/sco_inscr_passage.py +++ b/app/scodoc/sco_inscr_passage.py @@ -36,6 +36,7 @@ from flask import url_for, g, request import app.scodoc.notesdb as ndb import app.scodoc.sco_utils as scu from app import log +from app.models import FormSemestre from app.scodoc.gen_tables import GenTable from app.scodoc import html_sco_header from app.scodoc import sco_codes_parcours @@ -175,6 +176,8 @@ def do_inscrit(sem, etudids, inscrit_groupes=False): (la liste doit avoir été vérifiée au préalable) En option: inscrit aux mêmes groupes que dans le semestre origine """ + formsemestre: FormSemestre = FormSemestre.query.get(sem["formsemestre_id"]) + formsemestre.setup_parcours_groups() log(f"do_inscrit (inscrit_groupes={inscrit_groupes}): {etudids}") for etudid in etudids: sco_formsemestre_inscriptions.do_formsemestre_inscription_with_modules( @@ -190,7 +193,6 @@ def do_inscrit(sem, etudids, inscrit_groupes=False): # du nom de la partition: évidemment, cela ne marche pas si on a les # même noms de groupes dans des partitions différentes) etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0] - log("cherche groupes de %(nom)s" % etud) # recherche le semestre origine (il serait plus propre de l'avoir conservé!) if len(etud["sems"]) < 2: @@ -201,13 +203,11 @@ def do_inscrit(sem, etudids, inscrit_groupes=False): prev_formsemestre["formsemestre_id"] if prev_formsemestre else None, ) - cursem_groups_by_name = dict( - [ - (g["group_name"], g) - for g in sco_groups.get_sem_groups(sem["formsemestre_id"]) - if g["group_name"] - ] - ) + cursem_groups_by_name = { + g["group_name"]: g + for g in sco_groups.get_sem_groups(sem["formsemestre_id"]) + if g["group_name"] + } # forme la liste des groupes présents dans les deux semestres: partition_groups = [] # [ partition+group ] (ds nouveau sem.) @@ -217,14 +217,13 @@ def do_inscrit(sem, etudids, inscrit_groupes=False): new_group = cursem_groups_by_name[prev_group_name] partition_groups.append(new_group) - # inscrit aux groupes + # Inscrit aux groupes for partition_group in partition_groups: - if partition_group["groups_editable"]: - sco_groups.change_etud_group_in_partition( - etudid, - partition_group["group_id"], - partition_group, - ) + sco_groups.change_etud_group_in_partition( + etudid, + partition_group["group_id"], + partition_group, + ) def do_desinscrit(sem, etudids): @@ -481,11 +480,12 @@ def build_page( def formsemestre_inscr_passage_help(sem): - return ( - """

Explications

+ return f"""

Explications

Cette page permet d'inscrire des étudiants dans le semestre destination %(titreannee)s, + href="{ + url_for("notes.formsemestre_status", scodoc_dept=g.scodoc_dept, formsemestre_id=sem["formsemestre_id"] ) + }">{sem['titreannee']}, et d'en désincrire si besoin.

Les étudiants sont groupés par semestres d'origines. Ceux qui sont en caractères @@ -495,10 +495,13 @@ def formsemestre_inscr_passage_help(sem):

Au départ, les étudiants déjà inscrits sont sélectionnés; vous pouvez ajouter d'autres étudiants à inscrire dans le semestre destination.

Si vous dé-selectionnez un étudiant déjà inscrit (en gras), il sera désinscrit.

+

Le bouton inscrire aux mêmes groupes ne prend en compte que les groupes qui existent + dans les deux semestres: pensez à créer les partitions et groupes que vous souhaitez conserver + avant d'inscrire les étudiants. +

Aucune action ne sera effectuée si vous n'appuyez pas sur le bouton "Appliquer les modifications" !

-
""" - % sem - ) +
+ """ def etuds_select_boxes( @@ -574,13 +577,13 @@ def etuds_select_boxes( if with_checkbox: H.append( """ (Select. - tous - aucun""" # " + tous + aucun""" # " % infos ) if sel_inscrits: H.append( - """inscrits""" + """inscrits""" % infos ) if with_checkbox or sel_inscrits: diff --git a/app/views/scolar.py b/app/views/scolar.py index 8a25b34bf..54e537169 100644 --- a/app/views/scolar.py +++ b/app/views/scolar.py @@ -935,7 +935,7 @@ def partition_editor(formsemestre_id: int): def create_partition_parcours(formsemestre_id): """Création d'une partitions nommée "Parcours" (PARTITION_PARCOURS) avec un groupe par parcours.""" - formsemestre = FormSemestre.query.get_or_404(formsemestre_id) + formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id) formsemestre.setup_parcours_groups() return flask.redirect( url_for(