ScoDoc est un logiciel libre développé par Emmanuel Viennet.
-"""
-
-
-_HTML_BEGIN = f"""
-
-
-
-
-
-
-
-
-
-%(page_title)s
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-"""
-
-
-def scodoc_top_html_header(page_title="ScoDoc: bienvenue"):
- """HTML header for top level pages"""
- H = [
- _HTML_BEGIN % {"page_title": page_title, "encoding": scu.SCO_ENCODING},
- """""",
- scu.CUSTOM_HTML_HEADER_CNX,
- ]
- return "\n".join(H)
-
-
-# Header:
-def sco_header(
- # optional args
- page_title="", # page title
- no_sidebar=False, # hide sidebar
- cssstyles=(), # additionals CSS sheets
- javascripts=(), # additionals JS filenames to load
- scripts=(), # script to put in page header
- init_google_maps=False, # Google maps
- titrebandeau="", # titre dans bandeau superieur
- etudid=None,
- formsemestre_id=None,
-):
- """Main HTML page header for ScoDoc
- Utilisé dans les anciennes pages. Les nouvelles pages utilisent le template Jinja.
- """
- from app.scodoc.sco_formsemestre_status import formsemestre_page_title
-
- if etudid is not None:
- g.current_etudid = etudid
- scodoc_flash_status_messages()
-
- params = {
- "page_title": page_title or sco_version.SCONAME,
- "no_sidebar": no_sidebar,
- "ScoURL": url_for("scolar.index_html", scodoc_dept=g.scodoc_dept),
- "encoding": scu.SCO_ENCODING,
- "titrebandeau_mkup": "
" + 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)}
-
-
-
-"""
- )
- # En attendant le replacement complet de cette fonction,
- # inclusion ici des messages flask
- H.append(render_template("flashed_messages.j2"))
- #
- # Barre menu semestre:
- H.append(formsemestre_page_title(formsemestre_id))
-
- # div pour affichage messages temporaires
- H.append('')
- #
- H.append('
"""
- + scu.CUSTOM_HTML_FOOTER
- + """"""
- )
+"""Legacy constants (TODO: remove)"""
diff --git a/app/scodoc/sco_archives_formsemestre.py b/app/scodoc/sco_archives_formsemestre.py
index 2365e1b7..561d0b6c 100644
--- a/app/scodoc/sco_archives_formsemestre.py
+++ b/app/scodoc/sco_archives_formsemestre.py
@@ -307,8 +307,6 @@ enregistrés et non modifiables, on peut les retrouver ultérieurement.
return render_template(
"sco_page.j2",
title="Archiver les PV et résultats",
- javascripts=sco_groups_view.JAVASCRIPTS,
- cssstyles=sco_groups_view.CSSSTYLES,
content="
Archiver les PV et résultats du semestre
"
+ "\n".join(H)
+ "\n"
diff --git a/app/scodoc/sco_bulletins_signature.py b/app/scodoc/sco_bulletins_signature.py
index 0b30f8d2..e862a169 100644
--- a/app/scodoc/sco_bulletins_signature.py
+++ b/app/scodoc/sco_bulletins_signature.py
@@ -69,7 +69,6 @@ et sur page "réglages bulletin" (avec formsemestre_id)
# raise ValueError("invalid value for 'side' parameter")
# signatureloc = get_bul_sig_img()
# H = [
-# self.sco_header(page_title="Changement de signature"),
# """
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 8e52c065..6eb27603 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
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"""
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 1a212a7a..9bba3d05 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})
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"),
"
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 = """
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 1bf9cdf1..1dda5aaa 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"],
- ),
"""
{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
""",
- html_sco_header.sco_footer(),
]
return H
@@ -522,7 +532,8 @@ def _record_ue_validations_and_coefs(
coef = None
now_dmy = time.strftime(scu.DATE_FMT)
log(
- f"_record_ue_validations_and_coefs: {formsemestre.id} etudid={etud.id} ue_id={ue.id} moy_ue={note} ue_coef={coef}"
+ f"""_record_ue_validations_and_coefs: {
+ formsemestre.id} etudid={etud.id} ue_id={ue.id} moy_ue={note} ue_coef={coef}"""
)
assert code is None or (note) # si code validant, il faut une note
sco_formsemestre_validation.do_formsemestre_validate_previous_ue(
diff --git a/app/scodoc/sco_formsemestre_inscriptions.py b/app/scodoc/sco_formsemestre_inscriptions.py
index 823d1cc6..e8ce67ce 100644
--- a/app/scodoc/sco_formsemestre_inscriptions.py
+++ b/app/scodoc/sco_formsemestre_inscriptions.py
@@ -28,7 +28,6 @@
"""Opérations d'inscriptions aux semestres et modules
"""
import collections
-import time
import flask
from flask import flash, url_for, g, render_template, request
@@ -52,7 +51,6 @@ from app.scodoc import sco_moduleimpl
from app.scodoc import sco_groups
from app.scodoc import sco_etud
from app.scodoc import sco_cache
-from app.scodoc import html_sco_header
# --- Gestion des inscriptions aux semestres
@@ -250,7 +248,6 @@ def do_formsemestre_inscription_with_modules(
]
formsemestre = FormSemestre.get_formsemestre(formsemestre_id, dept_id=dept_id)
# Inscription au semestre
- args = {"formsemestre_id": formsemestre_id, "etudid": etudid}
formsemestre.inscrit_etudiant(etud, etat=etat, etape=etape, method=method)
log(
f"""do_formsemestre_inscription_with_modules: etudid={
@@ -307,7 +304,6 @@ def formsemestre_inscription_with_modules_form(etudid, only_ext=False):
id=etudid, dept_id=g.scodoc_dept_id
).first_or_404()
H = [
- html_sco_header.sco_header(),
f"
Inscription de {etud.nomprenom}",
]
if only_ext:
@@ -319,8 +315,6 @@ def formsemestre_inscription_with_modules_form(etudid, only_ext=False):