From cd3adb4177efea1071b2f8830b665ff8c6cf6de0 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet Problèmes et suggestions sur le logiciel: {scu.SCO_USERS_LIST} ScoDoc est un logiciel libre développé par Emmanuel Viennet. Une "formation" décrit une filière, comme un DUT ou une Licence. La formation se subdivise en unités pédagogiques (UE, matières, modules). Elle peut se diviser en plusieurs semestres (ou sessions), qui seront mis en place séparément.
@@ -168,7 +166,6 @@ def formation_edit(formation_id=None, create=False):
is_locked = formation.has_locked_sems(formation_id)
submitlabel = "Modifier les valeurs"
H = [
- html_sco_header.sco_header(page_title="Modification d'une formation"),
f""" Les matières sont des groupes de modules dans une UE
d'une formation donnée. Les matières servent surtout pour la
@@ -151,21 +147,25 @@ associé.
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + html_sco_header.sco_footer()
- elif tf[0] == -1:
+ return render_template(
+ "sco_page.j2", title="Création d'une matière", content="\n".join(H) + tf[1]
+ )
+ if tf[0] == -1:
return flask.redirect(dest_url)
- else:
- # check unicity
- mats = matiere_list(args={"ue_id": ue_id, "titre": tf[2]["titre"]})
- if mats:
- return (
+ # check unicity
+ mats = matiere_list(args={"ue_id": ue_id, "titre": tf[2]["titre"]})
+ if mats:
+ return render_template(
+ "sco_page.j2",
+ title="Création d'une matière",
+ content=(
"\n".join(H)
+ tf_error_message("Titre de matière déjà existant dans cette UE")
+ tf[1]
- + html_sco_header.sco_footer()
- )
- _ = do_matiere_create(tf[2])
- return flask.redirect(dest_url)
+ ),
+ )
+ _ = do_matiere_create(tf[2])
+ return flask.redirect(dest_url)
def can_delete_matiere(matiere: Matiere) -> tuple[bool, str]:
@@ -230,7 +230,6 @@ def matiere_delete(matiere_id=None):
mat = matiere_list(args={"matiere_id": matiere_id})[0]
UE = sco_edit_ue.ue_list(args={"ue_id": mat["ue_id"]})[0]
H = [
- html_sco_header.sco_header(page_title="Suppression d'une matière"),
" Les matières sont des groupes de modules dans une UE
+ help_msg = """ Les matières sont des groupes de modules dans une UE
d'une formation donnée. Les matières servent surtout pour la
présentation (bulletins, etc) mais n'ont pas de rôle dans le calcul
des notes.
@@ -325,18 +327,25 @@ associé.
formation_id=str(ue["formation_id"]),
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + help + html_sco_header.sco_footer()
+ return render_template(
+ "sco_page.j2",
+ title="Modification d'une matière",
+ content="\n".join(H) + tf[1] + help_msg,
+ )
elif tf[0] == -1:
return flask.redirect(dest_url)
else:
# check unicity
mats = matiere_list(args={"ue_id": tf[2]["ue_id"], "titre": tf[2]["titre"]})
if len(mats) > 1 or (len(mats) == 1 and mats[0]["matiere_id"] != matiere_id):
- return (
- "\n".join(H)
- + tf_error_message("Titre de matière déjà existant dans cette UE")
- + tf[1]
- + html_sco_header.sco_footer()
+ return render_template(
+ "sco_page.j2",
+ title="Modification d'une matière",
+ content=(
+ "\n".join(H)
+ + tf_error_message("Titre de matière déjà existant dans cette UE")
+ + tf[1]
+ ),
)
# changement d'UE ?
diff --git a/app/scodoc/sco_etape_apogee_view.py b/app/scodoc/sco_etape_apogee_view.py
index 1bf9cdf1b..1dda5aaab 100644
--- a/app/scodoc/sco_etape_apogee_view.py
+++ b/app/scodoc/sco_etape_apogee_view.py
@@ -32,12 +32,11 @@ import io
from zipfile import ZipFile
import flask
-from flask import flash, g, request, Response, send_file, url_for
+from flask import flash, g, render_template, request, Response, send_file, url_for
import app.scodoc.sco_utils as scu
from app import log
from app.models import Formation
-from app.scodoc import html_sco_header
from app.scodoc import sco_apogee_csv, sco_apogee_reader
from app.scodoc import sco_etape_apogee
from app.scodoc import sco_formsemestre
@@ -100,10 +99,6 @@ def apo_semset_maq_status(
ok_for_export &= semset["jury_ok"]
H = [
- html_sco_header.sco_header(
- page_title="Export Apogée",
- javascripts=["js/apo_semset_maq_status.js"],
- ),
""" Retour à la page d'export Apogée
- Pour l'ensemble Aucun étudiant Aucun étudiant Modification évaluation impossible pour {current_user.get_nomplogin()}
@@ -106,7 +104,6 @@ def formsemestre_ext_create_form(etudid, formsemestre_id):
}" class="stdlink">Étudiant {etud.nomprenom}
""",
]
- F = html_sco_header.sco_footer()
orig_sem = sco_formsemestre.get_formsemestre(formsemestre_id)
# Ne propose que des semestres de semestre_id strictement inférieur
# au semestre courant
@@ -133,7 +130,7 @@ def formsemestre_ext_create_form(etudid, formsemestre_id):
(indices entre {min_semestre_id} et {max_semestre_id}, semestre courant.)
{etud.nomprenom} est inscrit{etud.e} à ce semestre extérieur. Voici ses UE enregistrées avec leur notes
@@ -324,7 +335,6 @@ def _make_page(etud: Identite, formsemestre: FormSemestre, tf, message="") -> li
)}">retour au bulletin de notes
" + titrebandeau + " ",
- "authuser": current_user.user_name,
- }
- if no_sidebar:
- params["margin_left"] = "1em"
- else:
- params["margin_left"] = "140px"
-
- H = [_HTML_BEGIN % params]
-
- if init_google_maps:
- # It may be necessary to add an API key:
- H.append('')
-
- # Feuilles de style additionnelles:
- for cssstyle in cssstyles:
- H.append(
- f"""\n"""
- )
-
- H.append(
- f"""
-"""
- )
-
- if init_google_maps: # utilisé uniquement pour carte lycées
- H.append(
- f''
- )
-
- # JS additionels
- for js in javascripts:
- H.append(f"""\n""")
-
- H.append(
- f"""
-"""
- )
- # Scripts de la page:
- if scripts:
- H.append("""""")
-
- # Fin head, Body et bandeau haut:
- H.append(
- f"""
-
-
-{scu.CUSTOM_HTML_HEADER}
-{'' if no_sidebar else html_sidebar.sidebar(etudid)}
-
-
-Changement de la signature bulletin de %(sidetxt)s
# """
# % (sidetxt,),
diff --git a/app/scodoc/sco_edit_formation.py b/app/scodoc/sco_edit_formation.py
index 8e52c0656..6eb276035 100644
--- a/app/scodoc/sco_edit_formation.py
+++ b/app/scodoc/sco_edit_formation.py
@@ -43,7 +43,6 @@ import app.scodoc.sco_utils as scu
from app.scodoc.TrivialFormulator import TrivialFormulator, tf_error_message
from app.scodoc.sco_exceptions import ScoValueError, ScoNonEmptyFormationObject
-from app.scodoc import html_sco_header
from app.scodoc import sco_cache
from app.scodoc import codes_cursus
from app.scodoc import sco_edit_ue
@@ -146,7 +145,6 @@ def formation_edit(formation_id=None, create=False):
"""Edit or create a formation"""
if create:
H = [
- html_sco_header.sco_header(page_title="Création d'une formation"),
"""Création d'une formation
Modification de la formation {formation.acronyme}
version {formation.version}
""",
@@ -251,52 +248,57 @@ def formation_edit(formation_id=None, create=False):
submitlabel=submitlabel,
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + html_sco_header.sco_footer()
- elif tf[0] == -1:
+ return render_template(
+ "sco_page_dept.j2",
+ title="Modification d'une formation",
+ content="\n".join(H) + tf[1],
+ )
+ if tf[0] == -1:
return flask.redirect(url_for("notes.index_html", scodoc_dept=g.scodoc_dept))
+
+ # check unicity : constraint UNIQUE(acronyme,titre,version)
+ if create:
+ version = 1
else:
- # check unicity : constraint UNIQUE(acronyme,titre,version)
- if create:
- version = 1
- else:
- version = initvalues["version"]
- args = {
- "acronyme": tf[2]["acronyme"],
- "titre": tf[2]["titre"],
- "version": version,
- "dept_id": g.scodoc_dept_id,
- }
- other_formations: list[Formation] = Formation.query.filter_by(**args).all()
- if other_formations and (
- (len(other_formations) > 1) or other_formations[0].id != formation_id
- ):
- return (
+ version = initvalues["version"]
+ args = {
+ "acronyme": tf[2]["acronyme"],
+ "titre": tf[2]["titre"],
+ "version": version,
+ "dept_id": g.scodoc_dept_id,
+ }
+ other_formations: list[Formation] = Formation.query.filter_by(**args).all()
+ if other_formations and (
+ (len(other_formations) > 1) or other_formations[0].id != formation_id
+ ):
+ return render_template(
+ "sco_page_dept.j2",
+ title="Modification d'une formation",
+ content=(
"\n".join(H)
+ tf_error_message(
f"""Valeurs incorrectes: il existe déjà une formation avec même titre,
- acronyme et version.
- """
+ url_for('notes.ue_table',
+ scodoc_dept=g.scodoc_dept, formation_id=other_formations[0].id)
+ }">une formation avec même titre,
+ acronyme et version.
+ """
)
+ tf[1]
- + html_sco_header.sco_footer()
- )
- #
- if create:
- formation = do_formation_create(tf[2])
- else:
- if do_formation_edit(tf[2]):
- flash(
- f"""Modification de la formation {
- formation.titre} ({formation.acronyme}) version {formation.version}"""
- )
- return flask.redirect(
- url_for(
- "notes.ue_table", scodoc_dept=g.scodoc_dept, formation_id=formation.id
- )
+ ),
)
+ #
+ if create:
+ formation = do_formation_create(tf[2])
+ else:
+ if do_formation_edit(tf[2]):
+ flash(
+ f"""Modification de la formation {
+ formation.titre} ({formation.acronyme}) version {formation.version}"""
+ )
+ return flask.redirect(
+ url_for("notes.ue_table", scodoc_dept=g.scodoc_dept, formation_id=formation.id)
+ )
def do_formation_create(args: dict) -> Formation:
diff --git a/app/scodoc/sco_edit_matiere.py b/app/scodoc/sco_edit_matiere.py
index 1a212a7ad..9bba3d05c 100644
--- a/app/scodoc/sco_edit_matiere.py
+++ b/app/scodoc/sco_edit_matiere.py
@@ -29,7 +29,7 @@
(portage from DTML)
"""
import flask
-from flask import g, url_for, request
+from flask import g, render_template, request, url_for
from app import db, log
from app.models import Formation, Matiere, UniteEns, ScolarNews
@@ -43,7 +43,6 @@ from app.scodoc.sco_exceptions import (
ScoLockedFormError,
ScoNonEmptyFormationObject,
)
-from app.scodoc import html_sco_header
_matiereEditor = ndb.EditableTable(
"notes_matieres",
@@ -63,7 +62,6 @@ def matiere_list(*args, **kw):
def do_matiere_edit(*args, **kw):
"edit a matiere"
from app.scodoc import sco_edit_ue
- from app.scodoc import sco_edit_formation
cnx = ndb.GetDBConnexion()
# check
@@ -79,7 +77,6 @@ def do_matiere_edit(*args, **kw):
def do_matiere_create(args):
"create a matiere"
from app.scodoc import sco_edit_ue
- from app.models import ScolarNews
cnx = ndb.GetDBConnexion()
# check
@@ -103,7 +100,6 @@ def matiere_create(ue_id=None):
ue: UniteEns = UniteEns.query.get_or_404(ue_id)
default_numero = max([mat.numero for mat in ue.matieres] or [9]) + 1
H = [
- html_sco_header.sco_header(page_title="Création d'une matière"),
f"""Création d'une matière dans l'UE {ue.titre or ''} ({ue.acronyme})
Suppression de la matière %(titre)s" % mat,
" dans l'UE (%(acronyme)s))
" % UE,
]
@@ -248,13 +247,17 @@ def matiere_delete(matiere_id=None):
cancelbutton="Annuler",
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + html_sco_header.sco_footer()
- elif tf[0] == -1:
- return flask.redirect(dest_url)
- else:
- do_matiere_delete(matiere_id)
+ return render_template(
+ "sco_page.j2",
+ title="Suppression d'une matière",
+ content="\n".join(H) + tf[1],
+ )
+ if tf[0] == -1:
return flask.redirect(dest_url)
+ do_matiere_delete(matiere_id)
+ return flask.redirect(dest_url)
+
def matiere_edit(matiere_id=None):
"""Edit matiere"""
@@ -273,11 +276,10 @@ def matiere_edit(matiere_id=None):
ue_names = ["%(acronyme)s (%(titre)s)" % u for u in ues]
ue_ids = [u["ue_id"] for u in ues]
H = [
- html_sco_header.sco_header(page_title="Modification d'une matière"),
"""Modification de la matière %(titre)s""" % F,
f"""(formation ({formation.acronyme}, version {formation.version})
""",
]
- help = """Export des résultats vers Apogée
"""
"""{title}
{tab.html()}
- Étudiants dans la maquette Apogée {etape_apo}
Opération non autorisée
Table des résultats de tous les semestres
@@ -310,9 +305,14 @@ def scodoc_table_results(
""",
"\n".join(info_sems),
"""""",
- html_sco_header.sco_footer(),
]
- return "\n".join(H)
+ return render_template(
+ "sco_page_dept.j2",
+ title="Export résultats",
+ javascripts=html_sco_header.BOOTSTRAP_JS + ["js/export_results.js"],
+ cssstyles=html_sco_header.BOOTSTRAP_CSS,
+ content="\n".join(H),
+ )
# Formulaire pour saisie dates et sélection parcours
diff --git a/app/scodoc/sco_formsemestre_custommenu.py b/app/scodoc/sco_formsemestre_custommenu.py
index d719c42db..f6542bf8f 100644
--- a/app/scodoc/sco_formsemestre_custommenu.py
+++ b/app/scodoc/sco_formsemestre_custommenu.py
@@ -31,12 +31,11 @@ import flask
from flask import g, url_for, render_template, request
from flask_login import current_user
-from app.models.config import ScoDocSiteConfig, PersonalizedLink
+from app.models.config import ScoDocSiteConfig
from app.models import FormSemestre
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.TrivialFormulator import TrivialFormulator
-from app.scodoc import html_sco_header
_custommenuEditor = ndb.EditableTable(
"notes_formsemestre_custommenu",
@@ -107,7 +106,7 @@ def formsemestre_custommenu_edit(formsemestre_id):
dest_url = url_for(
"notes.formsemestre_status",
scodoc_dept=g.scodoc_dept,
- formsemestre_id=formsemestre_id,
+ formsemestre_id=formsemestre.id,
)
H = [
"""Enregistrement d'une inscription antérieure dans un autre
établissement
annulation
"
+ flash("annulation")
+ return flask.redirect(
+ url_for(
+ "notes.formsemestre_bulletinetud",
+ scodoc_dept=g.scodoc_dept,
+ formsemestre_id=formsemestre_id,
+ etudid=etudid,
+ )
+ )
else:
H = _make_page(etud, formsemestre, tf)
if tf[0] == 0: # premier affichage
- return "\n".join(H)
+ return render_template(
+ "sco_page.j2",
+ title="Validation des UE d'un semestre extérieur",
+ javascripts=["js/formsemestre_ext_edit_ue_validations.js"],
+ content="\n".join(H),
+ )
else: # soumission
# simule erreur
ok, message = _check_values(formsemestre, ues, tf[2])
if not ok:
H = _make_page(etud, formsemestre, tf, message=message)
- return "\n".join(H)
+ return render_template(
+ "sco_page.j2",
+ title="Validation des UE d'un semestre extérieur",
+ javascripts=["js/formsemestre_ext_edit_ue_validations.js"],
+ content="\n".join(H),
+ )
else:
# Submit
_record_ue_validations_and_coefs(formsemestre, etud, ues, tf[2])
@@ -299,10 +314,6 @@ def _make_page(etud: Identite, formsemestre: FormSemestre, tf, message="") -> li
nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre)
moy_gen = nt.get_etud_moy_gen(etud.id)
H = [
- html_sco_header.sco_header(
- page_title="Validation des UE d'un semestre extérieur",
- javascripts=["js/formsemestre_ext_edit_ue_validations.js"],
- ),
tf_error_message(message),
f"""Inscription de {etud.nomprenom}",
]
if only_ext:
@@ -319,8 +315,6 @@ def formsemestre_inscription_with_modules_form(etudid, only_ext=False):
')
if not check:
H.append(
@@ -206,7 +195,12 @@ def formsemestre_validation_etud_form(
"""
)
- return "\n".join(H + footer)
+ return render_template(
+ "sco_page.j2",
+ javascripts=["js/recap_parcours.js"],
+ title=f"Parcours {etud.nomprenom}",
+ content="\n".join(H + footer),
+ )
H.append(
formsemestre_recap_parcours_table(
@@ -218,7 +212,12 @@ def formsemestre_validation_etud_form(
dest_url = url_tableau
H.append(f'')
- return "\n".join(H + footer)
+ return render_template(
+ "sco_page.j2",
+ javascripts=["js/recap_parcours.js"],
+ title=f"Parcours {etud.nomprenom}",
+ content="\n".join(H + footer),
+ )
decision_jury = Se.nt.get_etud_decision_sem(etudid)
@@ -236,7 +235,12 @@ def formsemestre_validation_etud_form(
"""
)
)
- return "\n".join(H + footer)
+ return render_template(
+ "sco_page.j2",
+ javascripts=["js/recap_parcours.js"],
+ title=f"Parcours {etud.nomprenom}",
+ content="\n".join(H + footer),
+ )
evaluations_a_debloquer = Evaluation.get_evaluations_blocked_for_etud(
formsemestre, etud
@@ -256,7 +260,12 @@ def formsemestre_validation_etud_form(
"""
)
)
- return "\n".join(H + footer)
+ return render_template(
+ "sco_page.j2",
+ javascripts=["js/recap_parcours.js"],
+ title=f"Parcours {etud.nomprenom}",
+ content="\n".join(H + footer),
+ )
# Infos si pas de semestre précédent
if not Se.prev_formsemestre:
@@ -287,8 +296,12 @@ def formsemestre_validation_etud_form(
}" class="stdlink">Supprimer décision existante
"""
)
- H.append(html_sco_header.sco_footer())
- return "\n".join(H)
+ return render_template(
+ "sco_page.j2",
+ javascripts=["js/recap_parcours.js"],
+ title=f"Parcours {etud.nomprenom}",
+ content="\n".join(H),
+ )
# Infos sur decisions déjà saisies
if decision_jury:
@@ -329,8 +342,12 @@ def formsemestre_validation_etud_form(
H.append(f"""""")
H.append("")
- H.append(html_sco_header.sco_footer())
- return "\n".join(H)
+ return render_template(
+ "sco_page.j2",
+ javascripts=["js/recap_parcours.js"],
+ title=f"Parcours {etud.nomprenom}",
+ content="\n".join(H),
+ )
# Explication sur barres actuelles
H.append(' L\'étudiant ') @@ -393,7 +410,12 @@ def formsemestre_validation_etud_form( else: H.append("sans semestres décalés ") - return "".join(H + footer) + return render_template( + "sco_page.j2", + javascripts=["js/recap_parcours.js"], + title=f"Parcours {etud.nomprenom}", + content="\n".join(H + footer), + ) def formsemestre_validation_etud( @@ -1062,7 +1084,7 @@ def do_formsemestre_validation_auto(formsemestre_id): ), ) H = [ - f"""{html_sco_header.sco_header(page_title="Saisie automatique")} + f"""Saisie automatique des décisions du semestre {formsemestre.titre_annee()}Opération effectuée. {nb_valid} étudiants validés sur {len(etudids)} @@ -1088,8 +1110,10 @@ def do_formsemestre_validation_auto(formsemestre_id): scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id, mode_jury=1) }">continuer""" ) - H.append(html_sco_header.sco_footer()) - return "\n".join(H) + + return render_template( + "sco_page.j2", title="Saisie automatique", content="\n".join(H) + ) def formsemestre_validation_suppress_etud(formsemestre_id, etudid): @@ -1218,14 +1242,14 @@ def formsemestre_validate_previous_ue(formsemestre: FormSemestre, etud: Identite submitlabel="Enregistrer validation d'UE", ) if tf[0] == 0: - return f""" - {html_sco_header.sco_header( - page_title="Validation UE antérieure", - javascripts=["js/validate_previous_ue.js"], - cssstyles=["css/jury_delete_manual.css"], - etudid=etud.id, - formsemestre_id=formsemestre.id, - )} + return render_template( + "sco_page_dept.j2", + title="Validation UE antérieure", + javascripts=["js/validate_previous_ue.js"], + cssstyles=["css/jury_delete_manual.css"], + etudid=etud.id, + formsemestre_id=formsemestre.id, + content=f"""Gestion des validations d'UEs antérieures de {etud.html_link_fiche()}@@ -1265,8 +1289,8 @@ def formsemestre_validate_previous_ue(formsemestre: FormSemestre, etud: Identite {check_formation_ues(formation)[0]} - {html_sco_header.sco_footer()} - """ + """, + ) dest_url = url_for( "notes.formsemestre_validate_previous_ue", diff --git a/app/scodoc/sco_groups.py b/app/scodoc/sco_groups.py index 6faf1cea7..c585223d1 100644 --- a/app/scodoc/sco_groups.py +++ b/app/scodoc/sco_groups.py @@ -34,8 +34,7 @@ from xml.etree import ElementTree from xml.etree.ElementTree import Element import flask -from flask import g, request -from flask import url_for, make_response +from flask import g, make_response, render_template, request, url_for from sqlalchemy.sql import text from app import cache, db, log @@ -45,7 +44,6 @@ from app.models import FormSemestre, Identite, Scolog from app.models import SHORT_STR_LEN from app.models.groups import GroupDescr, Partition import app.scodoc.notesdb as ndb -from app.scodoc import html_sco_header from app.scodoc import sco_cache from app.scodoc import codes_cursus from app.scodoc import sco_cursus @@ -56,7 +54,6 @@ from app.scodoc import sco_xml from app.scodoc.sco_exceptions import ScoException, AccessDenied, ScoValueError from app.scodoc.TrivialFormulator import TrivialFormulator - partitionEditor = ndb.EditableTable( "partition", "partition_id", @@ -930,16 +927,12 @@ def edit_partition_form(formsemestre_id=None): raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !") partitions = get_partitions_list(formsemestre_id) - arrow_up, arrow_down, arrow_none = get_arrow_icons_tags() + arrow_up, arrow_down, _ = get_arrow_icons_tags() suppricon = scu.icontag( "delete_small_img", border="0", alt="supprimer", title="Supprimer" ) # H = [ - html_sco_header.sco_header( - page_title="Partitions...", - javascripts=["js/edit_partition_form.js"], - ), # limite à SHORT_STR_LEN r""" + + +{% endblock %} \ No newline at end of file diff --git a/app/templates/scolar/affect_groups.j2 b/app/templates/scolar/affect_groups.j2 index 51d7f599b..34920646c 100644 --- a/app/templates/scolar/affect_groups.j2 +++ b/app/templates/scolar/affect_groups.j2 @@ -1,5 +1,7 @@ {# -*- mode: jinja-html -*- #} -{{ sco_header|safe }} +{% extends "sco_page.j2" %} + +{% block app_content %}Affectation aux groupes de {{ partition.partition_name }}
@@ -54,4 +56,4 @@
-{{ sco_footer|safe }}
\ No newline at end of file
+{% endblock %}
From 50a01c8bd775577fc2e0275e6d3b13407ae7a6e4 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet |