diff --git a/app/scodoc/gen_tables.py b/app/scodoc/gen_tables.py index b5ce3e6d..5820d20a 100644 --- a/app/scodoc/gen_tables.py +++ b/app/scodoc/gen_tables.py @@ -494,7 +494,7 @@ class GenTable: caption = self.html_caption or self.caption if caption or self.base_url: - H.append('

') + H.append('

') if caption: H.append(caption) if self.base_url: @@ -512,7 +512,7 @@ class GenTable: }">{scu.ICON_PDF}""" ) H.append("") - H.append("

") + H.append("
") H.append(self.html_next_section) return "\n".join(H) diff --git a/app/scodoc/sco_edit_apc.py b/app/scodoc/sco_edit_apc.py index 8943b234..ab5e2d7e 100644 --- a/app/scodoc/sco_edit_apc.py +++ b/app/scodoc/sco_edit_apc.py @@ -71,19 +71,17 @@ def html_edit_formation_apc( ues_by_sem = {} ects_by_sem = {} - for semestre_idx in semestre_ids: - ues_by_sem[semestre_idx] = formation.ues.filter_by( - semestre_idx=semestre_idx - ).order_by(UniteEns.semestre_idx, UniteEns.numero, UniteEns.acronyme) - ects = [ - ue.ects - for ue in ues_by_sem[semestre_idx] - if ue.type != codes_cursus.UE_SPORT - ] + for s_idx in semestre_ids: + ues_by_sem[s_idx] = ( + formation.ues.filter_by(semestre_idx=s_idx) + .order_by(UniteEns.semestre_idx, UniteEns.numero, UniteEns.acronyme) + .all() + ) + ects = [ue.ects for ue in ues_by_sem[s_idx] if ue.type != codes_cursus.UE_SPORT] if None in ects: - ects_by_sem[semestre_idx] = 'manquant' + ects_by_sem[s_idx] = 'manquant' else: - ects_by_sem[semestre_idx] = f"{sum(ects):g}" + ects_by_sem[s_idx] = f"{sum(ects):g}" arrow_up, arrow_down, arrow_none = sco_groups.get_arrow_icons_tags() @@ -124,14 +122,14 @@ def html_edit_formation_apc( ues_by_sem=ues_by_sem, ), ] - for semestre_idx in semestre_ids: - ressources_in_sem = ressources.filter_by(semestre_id=semestre_idx) - saes_in_sem = saes.filter_by(semestre_id=semestre_idx) - other_modules_in_sem = other_modules.filter_by(semestre_id=semestre_idx) + for s_idx in semestre_ids: + ressources_in_sem = ressources.filter_by(semestre_id=s_idx) + saes_in_sem = saes.filter_by(semestre_id=s_idx) + other_modules_in_sem = other_modules.filter_by(semestre_id=s_idx) matiere_parent = Matiere.query.filter( Matiere.ue_id == UniteEns.id, UniteEns.formation_id == formation.id, - UniteEns.semestre_idx == semestre_idx, + UniteEns.semestre_idx == s_idx, UniteEns.type != codes_cursus.UE_SPORT, ).first() H += [ @@ -139,7 +137,7 @@ def html_edit_formation_apc( render_template( "pn/form_mods.j2", formation=formation, - titre=f"Ressources du S{semestre_idx}", + titre=f"Ressources du S{s_idx}", create_element_msg="créer une nouvelle ressource", # matiere_parent=matiere_parent, modules=ressources_in_sem, @@ -148,16 +146,16 @@ def html_edit_formation_apc( tag_editable=tag_editable, icons=icons, scu=scu, - semestre_id=semestre_idx, + semestre_id=s_idx, ) - if ues_by_sem[semestre_idx].count() > 0 + if len(ues_by_sem[s_idx]) > 0 else "" ), ( render_template( "pn/form_mods.j2", formation=formation, - titre=f"Situations d'Apprentissage et d'Évaluation (SAÉs) S{semestre_idx}", + titre=f"Situations d'Apprentissage et d'Évaluation (SAÉs) S{s_idx}", create_element_msg="créer une nouvelle SAÉ", # matiere_parent=matiere_parent, modules=saes_in_sem, @@ -166,16 +164,16 @@ def html_edit_formation_apc( tag_editable=tag_editable, icons=icons, scu=scu, - semestre_id=semestre_idx, + semestre_id=s_idx, ) - if ues_by_sem[semestre_idx].count() > 0 + if len(ues_by_sem[s_idx]) > 0 else "" ), ( render_template( "pn/form_mods.j2", formation=formation, - titre=f"Autres modules (non BUT) du S{semestre_idx}", + titre=f"Autres modules (non BUT) du S{s_idx}", create_element_msg="créer un nouveau module", modules=other_modules_in_sem, module_type=ModuleType.STANDARD, @@ -183,10 +181,11 @@ def html_edit_formation_apc( tag_editable=tag_editable, icons=icons, scu=scu, - semestre_id=semestre_idx, + semestre_id=s_idx, ) - if ues_by_sem[semestre_idx].count() > 0 - else """créer une UE pour pouvoir ajouter des modules""" + if len(ues_by_sem[s_idx]) > 0 + else """créer une UE pour pouvoir ajouter des + modules""" ), ] diff --git a/app/scodoc/sco_formsemestre_exterieurs.py b/app/scodoc/sco_formsemestre_exterieurs.py index 6ad279ff..da71ee64 100644 --- a/app/scodoc/sco_formsemestre_exterieurs.py +++ b/app/scodoc/sco_formsemestre_exterieurs.py @@ -56,34 +56,34 @@ from app.scodoc import sco_formsemestre_validation from app.scodoc.codes_cursus import UE_SPORT -def formsemestre_ext_create(etudid, sem_params): +def formsemestre_ext_create(etud: Identite | None, sem_params: dict) -> FormSemestre: """Crée un formsemestre exterieur et y inscrit l'étudiant. sem_params: dict nécessaire à la création du formsemestre """ # Check args _ = Formation.query.get_or_404(sem_params["formation_id"]) - if etudid: - _ = Identite.get_etud(etudid) # Create formsemestre sem_params["modalite"] = "EXT" sem_params["etapes"] = None sem_params["responsables"] = [current_user.id] - formsemestre_id = sco_formsemestre.do_formsemestre_create(sem_params, silent=True) + formsemestre = FormSemestre.create_formsemestre(sem_params, silent=True) # nota: le semestre est créé vide: pas de modules # Inscription au semestre - sco_formsemestre_inscriptions.do_formsemestre_inscription_with_modules( - formsemestre_id, - etudid, - method="formsemestre_ext_create", - ) - return formsemestre_id + if etud: + sco_formsemestre_inscriptions.do_formsemestre_inscription_with_modules( + formsemestre.id, + etud.id, + method="formsemestre_ext_create", + ) + return formsemestre def formsemestre_ext_create_form(etudid, formsemestre_id): """Formulaire création/inscription à un semestre extérieur""" etud = Identite.get_etud(etudid) + formsemestre = FormSemestre.get_formsemestre(formsemestre_id) H = [ f"""

Enregistrement d'une inscription antérieure dans un autre établissement

@@ -96,27 +96,26 @@ def formsemestre_ext_create_form(etudid, formsemestre_id): Notez que si un semestre extérieur similaire a déjà été créé pour un autre étudiant, il est préférable d'utiliser la fonction " + scodoc_dept=g.scodoc_dept, etudid=etud.id, only_ext=1) }"> inscrire à un autre semestre"

Étudiant {etud.nomprenom}

""", ] - orig_sem = sco_formsemestre.get_formsemestre(formsemestre_id) # Ne propose que des semestres de semestre_id strictement inférieur # au semestre courant # et seulement si pas inscrit au même semestre_id d'un semestre ordinaire ScoDoc. # Les autres situations (eg redoublements en changeant d'établissement) # doivent être gérées par les validations de semestres "antérieurs" insem = sco_formsemestre_inscriptions.do_formsemestre_inscription_list( - args={"etudid": etudid, "etat": scu.INSCRIT} + args={"etudid": etud.id, "etat": scu.INSCRIT} ) semlist = [sco_formsemestre.get_formsemestre(i["formsemestre_id"]) for i in insem] existing_semestre_ids = {s["semestre_id"] for s in semlist} min_semestre_id = 1 - max_semestre_id = orig_sem["semestre_id"] + max_semestre_id = formsemestre.semestre_id semestre_ids = set(range(min_semestre_id, max_semestre_id)) - existing_semestre_ids H.append( f"""

L'étudiant est déjà inscrit dans des semestres ScoDoc de rangs: @@ -203,22 +202,22 @@ def formsemestre_ext_create_form(etudid, formsemestre_id):

""" ) return render_template("sco_page.j2", content="\n".join(H) + "\n" + tf[1]) - elif tf[0] == -1: + if tf[0] == -1: return flask.redirect( url_for( "notes.formsemestre_bulletinetud", scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id, - etudid=etudid, + etudid=etud.id, ) ) - else: - # Le semestre extérieur est créé dans la même formation que le semestre courant - tf[2]["formation_id"] = orig_sem["formation_id"] - formsemestre_ext_create(etudid, tf[2]) - return flask.redirect( - url_for("scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etudid) - ) + + # Le semestre extérieur est créé dans la même formation que le semestre courant + tf[2]["formation_id"] = formsemestre.formation_id + formsemestre_ext_create(etud, tf[2]) + return flask.redirect( + url_for("scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etud.id) + ) def formsemestre_ext_edit_ue_validations(formsemestre_id, etudid): diff --git a/app/static/css/gt_table.css b/app/static/css/gt_table.css index 2e8253e6..0e57dd25 100644 --- a/app/static/css/gt_table.css +++ b/app/static/css/gt_table.css @@ -56,4 +56,9 @@ div.dt-container div.dt-search { div.dt-container div.dt-search input { margin-left: 0.5em; +} + +div.gt_caption { + margin-top: 4px; + margin-bottom: 16px; } \ No newline at end of file diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css index 06234400..19fb7645 100644 --- a/app/static/css/scodoc.css +++ b/app/static/css/scodoc.css @@ -131,6 +131,11 @@ div.scobox-etud { background-color: var(--sco-color-background); } + +ul.sco-links li { + margin-bottom: 8px; +} + /* customization of multiselect style */ .multiselect-container.dropdown-menu { background-color: #e9e9e9; @@ -4091,26 +4096,6 @@ div.scobox.update_warning>div:nth-child(2) { padding-left: 8ex; } -/* - Titres des tabs: - .nav-tabs li a { - font-variant: small-caps; - font-size: 13pt; - } - - #group-tabs { - clear: both; - } - - #group-tabs ul { - display: inline; - } - - #group-tabs ul li { - display: inline; - } -*/ - /* Page accueil */ #scodoc_attribution p { font-size: 75%; diff --git a/app/templates/pn/form_ues.j2 b/app/templates/pn/form_ues.j2 index 255605af..9369b132 100644 --- a/app/templates/pn/form_ues.j2 +++ b/app/templates/pn/form_ues.j2 @@ -118,7 +118,7 @@ {% if editable %}