From 45352d9248bc8fc729a779924ec1cd4edd5d077f Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet
Date: Fri, 17 Sep 2021 09:15:12 +0200
Subject: [PATCH 1/3] =?UTF-8?q?Script=20migration:=20v=C3=A9rification=20e?=
=?UTF-8?q?xistence=20departements=20dans=20base=20cible?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/notes.py | 6 +++---
sco_version.py | 2 +-
scodoc.py | 11 +++++++++++
tools/migrate_from_scodoc7.sh | 32 ++++++++++++++++++++++++++++++--
4 files changed, 45 insertions(+), 6 deletions(-)
diff --git a/app/views/notes.py b/app/views/notes.py
index 6893e2f6c..baaf1ea80 100644
--- a/app/views/notes.py
+++ b/app/views/notes.py
@@ -38,8 +38,8 @@ from operator import itemgetter
from xml.etree import ElementTree
import flask
-from flask import url_for, g
-from flask import current_app
+from flask import url_for
+from flask import current_app, g
from flask_login import current_user
from config import Config
@@ -637,7 +637,7 @@ def XMLgetFormsemestres(etape_apo=None, formsemestre_id=None, REQUEST=None):
"""List all formsemestres matching etape, XML format
DEPRECATED: use formsemestre_list()
"""
- log("Warning: calling deprecated XMLgetFormsemestres")
+ current_app.logger.debug("Warning: calling deprecated XMLgetFormsemestres")
args = {}
if etape_apo:
args["etape_apo"] = etape_apo
diff --git a/sco_version.py b/sco_version.py
index 8fb397ce7..cbe325861 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -1,7 +1,7 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
-SCOVERSION = "9.0.28"
+SCOVERSION = "9.0.29"
SCONAME = "ScoDoc"
diff --git a/scodoc.py b/scodoc.py
index dd7e3f110..c32a84195 100755
--- a/scodoc.py
+++ b/scodoc.py
@@ -264,6 +264,17 @@ def create_dept(dept): # create-dept
return 0
+@app.cli.command()
+@click.argument("depts", nargs=-1)
+def list_depts(depts=""): # list-dept
+ """If dept exists, print it, else nothing.
+ Called without arguments, list all depts along with their ids.
+ """
+ for dept in models.Departement.query.order_by(models.Departement.id):
+ if not depts or dept.acronym in depts:
+ print(f"{dept.id}\t{dept.acronym}")
+
+
@app.cli.command()
@with_appcontext
def import_scodoc7_users(): # import-scodoc7-users
diff --git a/tools/migrate_from_scodoc7.sh b/tools/migrate_from_scodoc7.sh
index 67ba70d66..f8af51bd9 100755
--- a/tools/migrate_from_scodoc7.sh
+++ b/tools/migrate_from_scodoc7.sh
@@ -65,6 +65,27 @@ else
SCODOC7_HOME="$1" # racine de l'archive importée
fi
+# --- 1. Vérifie qu'aucun des départements à importer n'existe déjà
+check_existing_depts() {
+ sco7_depts=""
+ for f in "${SCODOC7_HOME}/var/scodoc/"/config/depts/*.cfg
+ do
+ dept=$(basename "${f%.*}") # le nom du dept peut-être en minuscules
+ sco9_name=$(echo "$dept" | tr "[:lower:]" "[:upper:]") # acronym ScoDoc 9 toujours en majuscule
+ sco7_depts="$sco7_depts $sco9_name"
+ done
+ nb_existing=$(echo "$sco7_depts" | su -c "cd $SCODOC_DIR && source venv/bin/activate && xargs flask list-depts" "$SCODOC_USER" | wc -l)
+ if [ "$nb_existing" -gt 0 ]
+ then
+ echo "Attention: il existe déjà $nb_existing départements de même nom que celles"
+ echo "que vous souhaitez importer !"
+ echo "Département qui allaient être importées: $sco7_depts"
+ echo "=> arrêt."
+ exit 2
+ fi
+}
+
+
# --- 2. Propriétaire des bases de données pour import "en place"
# Bases appartenant à www-data: les attribue à "scodoc" pour le script de migration SQL
# qui tourne en tant que "scodoc"
@@ -160,6 +181,8 @@ migrate_local_files() {
# ------ MAIN
+check_existing_depts
+
change_scodoc_file_ownership
if [ "$INPLACE" == 1 ]
@@ -190,10 +213,15 @@ su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask import-scodoc7-users
# ----- Migration bases départements
# les départements ScoDoc7 ont été déplacés dans /opt/scodoc-data/config/dept
-# (ils ne sont d'ailleurs plus utilisés par ScoDoc 9)
+# (ils ne sont plus utilisés par ScoDoc 9)
+# Le nom du dept peut-être en minuscules et/ou majuscules (Geii, GEII...)
+# Le nom de BD ScoDoc7 est toujours en majuscules (SCOGEII)
+# Rappel: les archives ScoDoc7 étaient .../archives//... donc minuscules/majuscules
+# alors qu'en ScoDoc9 elles seront .../archives// : le numéro interne du département,
+# puisque l'acronyme peut changer.
for f in "$SCODOC_VAR_DIR"/config/depts/*.cfg
do
- dept=$(basename "${f%.*}") # le nom du dept peut-être en minuscules et/ou majuscules (geii, GEII...)
+ dept=$(basename "${f%.*}") # le nom du dept peut-être en minuscules
db_name=$(echo "SCO$dept" | tr "[:lower:]" "[:upper:]") # nom de BD toujours en majuscule
echo
echo "----------------------------------------------"
From bd2e0ccde5064f76d0300ef2f1ff97ef5e29b941 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet
Date: Fri, 17 Sep 2021 10:02:27 +0200
Subject: [PATCH 2/3] Archives: utilise dept_id et non acronyme
---
app/scodoc/sco_archives.py | 15 +++++++++------
app/scodoc/sco_etape_apogee.py | 4 ++--
app/scodoc/sco_photos.py | 7 ++++---
tools/migrate_scodoc7_archives.py | 30 +++++++++++++++++++++++++++---
4 files changed, 42 insertions(+), 14 deletions(-)
diff --git a/app/scodoc/sco_archives.py b/app/scodoc/sco_archives.py
index f69041e90..ca73ac6cb 100644
--- a/app/scodoc/sco_archives.py
+++ b/app/scodoc/sco_archives.py
@@ -29,19 +29,19 @@
Archives are plain files, stored in
- /archives/
- (where is usually /opt/scodoc-data, and a departement id)
+ /archives/
+ (where is usually /opt/scodoc-data, and a departement id (int))
Les PV de jurys et documents associés sont stockées dans un sous-repertoire de la forme
///
(formsemestre_id est ici FormSemestre.id)
Les documents liés à l'étudiant sont dans
- /docetuds///
+ /docetuds///
(etudid est ici Identite.id)
Les maquettes Apogée pour l'export des notes sont dans
- /apo_csv//-//.csv
+ /apo_csv//-//.csv
Un répertoire d'archive contient des fichiers quelconques, et un fichier texte nommé _description.txt
qui est une description (humaine, format libre) de l'archive.
@@ -61,6 +61,7 @@ from flask import g
import app.scodoc.sco_utils as scu
from config import Config
from app import log
+from app.models import Departement
from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc.sco_exceptions import (
AccessDenied,
@@ -109,7 +110,8 @@ class BaseArchiver(object):
If directory does not yet exist, create it.
"""
self.initialize()
- dept_dir = os.path.join(self.root, g.scodoc_dept)
+ dept = Departement.query.filter_by(acronym=g.scodoc_dept).first()
+ dept_dir = os.path.join(self.root, str(dept.id))
try:
scu.GSL.acquire()
if not os.path.isdir(dept_dir):
@@ -128,7 +130,8 @@ class BaseArchiver(object):
:return: list of archive oids
"""
self.initialize()
- base = os.path.join(self.root, g.scodoc_dept) + os.path.sep
+ dept = Departement.query.filter_by(acronym=g.scodoc_dept).first()
+ base = os.path.join(self.root, str(dept.id)) + os.path.sep
dirs = glob.glob(base + "*")
return [os.path.split(x)[1] for x in dirs]
diff --git a/app/scodoc/sco_etape_apogee.py b/app/scodoc/sco_etape_apogee.py
index 5409c58eb..582497e95 100644
--- a/app/scodoc/sco_etape_apogee.py
+++ b/app/scodoc/sco_etape_apogee.py
@@ -32,11 +32,11 @@
Voir sco_apogee_csv.py pour la structure du fichier Apogée.
Stockage: utilise sco_archive.py
- => /opt/scodoc/var/scodoc/archives/apo_csv/RT/2016-1/2016-07-03-16-12-19/V3ASR.csv
+ => /opt/scodoc/var/scodoc/archives/apo_csv//2016-1/2016-07-03-16-12-19/V3ASR.csv
pour une maquette de l'année scolaire 2016, semestre 1, etape V3ASR
ou bien (à partir de ScoDoc 1678) :
- /opt/scodoc/var/scodoc/archives/apo_csv/RT/2016-1/2016-07-03-16-12-19/V3ASR!111.csv
+ /opt/scodoc/var/scodoc/archives/apo_csv//2016-1/2016-07-03-16-12-19/V3ASR!111.csv
pour une maquette de l'étape V3ASR version VDI 111.
La version VDI sera ignorée sauf si elle est indiquée dans l'étape du semestre.
diff --git a/app/scodoc/sco_photos.py b/app/scodoc/sco_photos.py
index b63b2afc3..39dbd0887 100644
--- a/app/scodoc/sco_photos.py
+++ b/app/scodoc/sco_photos.py
@@ -341,7 +341,7 @@ def find_new_dir():
def copy_portal_photo_to_fs(etud):
"""Copy the photo from portal (distant website) to local fs.
- Returns rel. path or None if copy failed, with a diagnotic message
+ Returns rel. path or None if copy failed, with a diagnostic message
"""
sco_etud.format_etud_ident(etud)
url = photo_portal_url(etud)
@@ -353,8 +353,9 @@ def copy_portal_photo_to_fs(etud):
log("copy_portal_photo_to_fs: getting %s" % url)
r = requests.get(url, timeout=portal_timeout)
except:
- log("download failed: exception:\n%s" % traceback.format_exc())
- log("called from:\n" + "".join(traceback.format_stack()))
+ # log("download failed: exception:\n%s" % traceback.format_exc())
+ # log("called from:\n" + "".join(traceback.format_stack()))
+ log("copy_portal_photo_to_fs: error.")
return None, "%s: erreur chargement de %s" % (etud["nomprenom"], url)
if r.status_code != 200:
log("download failed")
diff --git a/tools/migrate_scodoc7_archives.py b/tools/migrate_scodoc7_archives.py
index 55acd8421..6e7553db6 100644
--- a/tools/migrate_scodoc7_archives.py
+++ b/tools/migrate_scodoc7_archives.py
@@ -4,6 +4,7 @@
import glob
import os
import shutil
+import sys
from app.models import Departement
from app.models.formsemestre import FormSemestre
@@ -25,7 +26,8 @@ def migrate_scodoc7_dept_archive(dept_name=""):
migrate_docetuds(dept)
# ApoCSVArchiver:
- # /opt/scodoc-data/archives/apo_csv// ne bouge pas
+ # /opt/scodoc-data/archives/apo_csv// -> apo_csv//
+ migrate_apo_csv(dept)
def migrate_sem_archives(dept):
@@ -35,7 +37,7 @@ def migrate_sem_archives(dept):
for sem in FormSemestre.query.filter_by(dept_id=dept.id):
n += 1
arch_dir7 = f"/opt/scodoc-data/archives/{dept.acronym}/{sem.scodoc7_id}"
- arch_dir9 = f"/opt/scodoc-data/archives/{dept.acronym}/{sem.id}"
+ arch_dir9 = f"/opt/scodoc-data/archives/{dept.id}/{sem.id}"
if os.path.exists(arch_dir7):
n_moves += 1
if not os.path.exists(arch_dir9):
@@ -58,7 +60,7 @@ def migrate_docetuds(dept):
arch_dir7 = (
f"/opt/scodoc-data/archives/docetuds/{dept.acronym}/{etud.scodoc7_id}"
)
- arch_dir9 = f"/opt/scodoc-data/archives/docetuds/{dept.acronym}/{etud.id}"
+ arch_dir9 = f"/opt/scodoc-data/archives/docetuds/{dept.id}/{etud.id}"
if os.path.exists(arch_dir7):
n_moves += 1
if not os.path.exists(arch_dir9):
@@ -70,3 +72,25 @@ def migrate_docetuds(dept):
# print(f"\tmoving {arch}")
shutil.move(arch, arch_dir9)
# print(f"moved {n_moves}/{n} etuds")
+
+
+def migrate_apo_csv(dept):
+ "/opt/scodoc-data/archives/apo_csv// -> .../apo_csv//"
+ arch_dir7 = f"/opt/scodoc-data/archives/apo_csv/{dept.acronym}"
+ arch_dir7_upper = f"/opt/scodoc-data/archives/apo_csv/{dept.acronym.upper()}"
+ arch_dir9 = f"/opt/scodoc-data/archives/apo_csv/{dept.id}"
+ if os.path.exists(arch_dir7):
+ if os.path.exists(arch_dir9):
+ print(
+ f"Warning: {arch_dir9} exist ! not moving {arch_dir7}", file=sys.stderr
+ )
+ else:
+ shutil.move(arch_dir7, arch_dir9)
+ elif os.path.exists(arch_dir7_upper):
+ if os.path.exists(arch_dir9):
+ print(
+ f"Warning: {arch_dir9} exist ! not moving {arch_dir7_upper}",
+ file=sys.stderr,
+ )
+ else:
+ shutil.move(arch_dir7_upper, arch_dir9)
From 987800c30e0599b77159ddc2b6191b5a1433de8b Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet
Date: Sat, 18 Sep 2021 10:10:02 +0200
Subject: [PATCH 3/3] =?UTF-8?q?Remplace=20REQUEST.URL=20par=20acc=C3=A8s?=
=?UTF-8?q?=20=C3=A0=20Flask=20request=20global=20object?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/decorators.py | 16 +++++------
app/scodoc/sco_abs_views.py | 6 ++---
app/scodoc/sco_archives.py | 4 +--
app/scodoc/sco_archives_etud.py | 6 ++---
app/scodoc/sco_bulletins.py | 30 ++++++++++++++-------
app/scodoc/sco_bulletins_generator.py | 6 +++--
app/scodoc/sco_bulletins_pdf.py | 6 ++---
app/scodoc/sco_cost_formation.py | 6 +++--
app/scodoc/sco_debouche.py | 4 +--
app/scodoc/sco_dept.py | 6 ++---
app/scodoc/sco_edit_formation.py | 4 +--
app/scodoc/sco_edit_matiere.py | 10 +++----
app/scodoc/sco_edit_module.py | 8 +++---
app/scodoc/sco_edit_ue.py | 10 ++++---
app/scodoc/sco_etape_apogee_view.py | 9 ++++---
app/scodoc/sco_evaluations.py | 4 +--
app/scodoc/sco_export_results.py | 4 +--
app/scodoc/sco_formations.py | 4 +--
app/scodoc/sco_formsemestre.py | 4 +--
app/scodoc/sco_formsemestre_custommenu.py | 4 +--
app/scodoc/sco_formsemestre_edit.py | 12 ++++-----
app/scodoc/sco_formsemestre_exterieurs.py | 6 ++---
app/scodoc/sco_formsemestre_inscriptions.py | 6 ++---
app/scodoc/sco_formsemestre_status.py | 4 +--
app/scodoc/sco_formsemestre_validation.py | 4 +--
app/scodoc/sco_groups.py | 8 +++---
app/scodoc/sco_groups_view.py | 6 ++---
app/scodoc/sco_inscr_passage.py | 4 +--
app/scodoc/sco_liste_notes.py | 4 +--
app/scodoc/sco_lycee.py | 6 ++---
app/scodoc/sco_moduleimpl_inscriptions.py | 4 +--
app/scodoc/sco_photos.py | 2 +-
app/scodoc/sco_placement.py | 3 ++-
app/scodoc/sco_poursuite_dut.py | 4 +--
app/scodoc/sco_preferences.py | 8 +++---
app/scodoc/sco_prepajury.py | 4 ++-
app/scodoc/sco_pvjury.py | 10 +++----
app/scodoc/sco_recapcomplet.py | 4 ++-
app/scodoc/sco_report.py | 16 +++++------
app/scodoc/sco_saisie_notes.py | 4 +--
app/scodoc/sco_trombino.py | 4 +--
app/scodoc/sco_ue_external.py | 3 ++-
app/scodoc/sco_undo_notes.py | 4 ++-
app/scodoc/sco_users.py | 6 ++---
app/views/absences.py | 12 ++++-----
app/views/entreprises.py | 30 +++++++++++----------
app/views/notes.py | 22 +++++++--------
app/views/scolar.py | 16 +++++------
app/views/users.py | 4 +--
49 files changed, 199 insertions(+), 172 deletions(-)
diff --git a/app/decorators.py b/app/decorators.py
index 4987f0d83..a72d82535 100644
--- a/app/decorators.py
+++ b/app/decorators.py
@@ -46,15 +46,15 @@ class ZRequest(object):
# if current_app.config["DEBUG"]:
# le ReverseProxied se charge maintenant de mettre le bon protocole http ou https
- self.URL = request.base_url
- self.BASE0 = request.url_root
+ # self.URL = request.base_url
+ # self.BASE0 = request.url_root
# else:
# self.URL = request.base_url.replace("http://", "https://")
# self.BASE0 = request.url_root.replace("http://", "https://")
- self.URL0 = self.URL
+ # self.URL0 = self.URL
# query_string is bytes:
- self.QUERY_STRING = request.query_string.decode("utf-8")
- self.REQUEST_METHOD = request.method
+ # self.QUERY_STRING = request.query_string.decode("utf-8")
+ # self.REQUEST_METHOD = request.method
self.AUTHENTICATED_USER = current_user
self.REMOTE_ADDR = request.remote_addr
if request.method == "POST":
@@ -79,11 +79,7 @@ class ZRequest(object):
self.RESPONSE = ZResponse()
def __str__(self):
- return """REQUEST
- URL={r.URL}
- QUERY_STRING={r.QUERY_STRING}
- REQUEST_METHOD={r.REQUEST_METHOD}
- AUTHENTICATED_USER={r.AUTHENTICATED_USER}
+ return """ZREQUEST
form={r.form}
""".format(
r=self
diff --git a/app/scodoc/sco_abs_views.py b/app/scodoc/sco_abs_views.py
index a05d42c5e..f75e0b6bd 100644
--- a/app/scodoc/sco_abs_views.py
+++ b/app/scodoc/sco_abs_views.py
@@ -30,7 +30,7 @@
"""
import datetime
-from flask import url_for, g
+from flask import url_for, g, request
import app.scodoc.sco_utils as scu
from app.scodoc import notesdb as ndb
@@ -814,8 +814,8 @@ def ListeAbsEtud(
etudid, datedebut, with_evals=with_evals, format=format
)
if REQUEST:
- base_url_nj = "%s?etudid=%s&absjust_only=0" % (REQUEST.URL0, etudid)
- base_url_j = "%s?etudid=%s&absjust_only=1" % (REQUEST.URL0, etudid)
+ base_url_nj = "%s?etudid=%s&absjust_only=0" % (request.base_url, etudid)
+ base_url_j = "%s?etudid=%s&absjust_only=1" % (request.base_url, etudid)
else:
base_url_nj = base_url_j = ""
tab_absnonjust = GenTable(
diff --git a/app/scodoc/sco_archives.py b/app/scodoc/sco_archives.py
index ca73ac6cb..e17cea63d 100644
--- a/app/scodoc/sco_archives.py
+++ b/app/scodoc/sco_archives.py
@@ -56,7 +56,7 @@ import shutil
import time
import flask
-from flask import g
+from flask import g, request
import app.scodoc.sco_utils as scu
from config import Config
@@ -457,7 +457,7 @@ enregistrés et non modifiables, on peut les retrouver ultérieurement.
)
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
descr,
cancelbutton="Annuler",
diff --git a/app/scodoc/sco_archives_etud.py b/app/scodoc/sco_archives_etud.py
index 157d52173..fa41bb656 100644
--- a/app/scodoc/sco_archives_etud.py
+++ b/app/scodoc/sco_archives_etud.py
@@ -30,7 +30,7 @@
les dossiers d'admission et autres pièces utiles.
"""
import flask
-from flask import url_for, g
+from flask import url_for, g, request
import app.scodoc.sco_utils as scu
from app.scodoc import sco_import_etuds
@@ -153,7 +153,7 @@ def etud_upload_file_form(REQUEST, etudid):
% (scu.CONFIG.ETUD_MAX_FILE_SIZE // (1024 * 1024)),
]
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
(
("etudid", {"default": etudid, "input_type": "hidden"}),
@@ -308,7 +308,7 @@ def etudarchive_import_files_form(group_id, REQUEST=None):
]
F = html_sco_header.sco_footer()
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
(
("xlsfile", {"title": "Fichier Excel:", "input_type": "file", "size": 40}),
diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py
index 215985b9e..6a5bbb96d 100644
--- a/app/scodoc/sco_bulletins.py
+++ b/app/scodoc/sco_bulletins.py
@@ -28,6 +28,7 @@
"""Génération des bulletins de notes
"""
+from app.models import formsemestre
import time
import pprint
import email
@@ -38,7 +39,7 @@ from email.header import Header
from reportlab.lib.colors import Color
import urllib
-from flask import g
+from flask import g, request
from flask import url_for
from flask_login import current_user
from flask_mail import Message
@@ -143,7 +144,7 @@ def formsemestre_bulletinetud_dict(
I["formsemestre_id"] = formsemestre_id
I["sem"] = nt.sem
if REQUEST:
- I["server_name"] = REQUEST.BASE0
+ I["server_name"] = request.url_root
else:
I["server_name"] = ""
@@ -1032,7 +1033,7 @@ def _formsemestre_bulletinetud_header_html(
),
"""
""" % (
- REQUEST.URL0,
+ request.base_url,
formsemestre_id,
n_group_td,
n_group_tp,
@@ -190,7 +192,7 @@ def formsemestre_estim_cost(
)
tab.html_before_table = h
tab.base_url = "%s?formsemestre_id=%s&n_group_td=%s&n_group_tp=%s&coef_tp=%s" % (
- REQUEST.URL0,
+ request.base_url,
formsemestre_id,
n_group_td,
n_group_tp,
diff --git a/app/scodoc/sco_debouche.py b/app/scodoc/sco_debouche.py
index df93897c7..2dc2f10a8 100644
--- a/app/scodoc/sco_debouche.py
+++ b/app/scodoc/sco_debouche.py
@@ -29,7 +29,7 @@
Rapport (table) avec dernier semestre fréquenté et débouché de chaque étudiant
"""
import http
-from flask import url_for, g
+from flask import url_for, g, request
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
@@ -64,7 +64,7 @@ def report_debouche_date(start_year=None, format="html", REQUEST=None):
"Généré par %s le " % sco_version.SCONAME + scu.timedate_human_repr() + ""
)
tab.caption = "Récapitulatif débouchés à partir du 1/1/%s." % start_year
- tab.base_url = "%s?start_year=%s" % (REQUEST.URL0, start_year)
+ tab.base_url = "%s?start_year=%s" % (request.base_url, start_year)
return tab.make_page(
title="""""",
init_qtip=True,
diff --git a/app/scodoc/sco_dept.py b/app/scodoc/sco_dept.py
index 349ad0095..3d342dcc4 100644
--- a/app/scodoc/sco_dept.py
+++ b/app/scodoc/sco_dept.py
@@ -28,7 +28,7 @@
"""Page accueil département (liste des semestres, etc)
"""
-from flask import g
+from flask import g, request
from flask_login import current_user
import app
@@ -131,7 +131,7 @@ def index_html(REQUEST=None, showcodes=0, showsemtable=0):
if not showsemtable:
H.append(
'
Voir tous les semestres
'
- % REQUEST.URL0
+ % request.base_url
)
H.append(
@@ -242,7 +242,7 @@ def _sem_table_gt(sems, showcodes=False):
rows=sems,
html_class="table_leftalign semlist",
html_sortable=True,
- # base_url = '%s?formsemestre_id=%s' % (REQUEST.URL0, formsemestre_id),
+ # base_url = '%s?formsemestre_id=%s' % (request.base_url, formsemestre_id),
# caption='Maquettes enregistrées',
preferences=sco_preferences.SemPreferences(),
)
diff --git a/app/scodoc/sco_edit_formation.py b/app/scodoc/sco_edit_formation.py
index b52c3a53e..3ee235753 100644
--- a/app/scodoc/sco_edit_formation.py
+++ b/app/scodoc/sco_edit_formation.py
@@ -29,7 +29,7 @@
(portage from DTML)
"""
import flask
-from flask import g, url_for
+from flask import g, url_for, request
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
@@ -159,7 +159,7 @@ def formation_edit(formation_id=None, create=False, REQUEST=None):
)
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
(
("formation_id", {"default": formation_id, "input_type": "hidden"}),
diff --git a/app/scodoc/sco_edit_matiere.py b/app/scodoc/sco_edit_matiere.py
index 6b9e7d437..f3fbabe01 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
+from flask import g, url_for, request
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
@@ -116,7 +116,7 @@ associé.
""",
]
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
(
("ue_id", {"input_type": "hidden", "default": ue_id}),
@@ -202,7 +202,7 @@ def matiere_delete(matiere_id=None, REQUEST=None):
]
dest_url = scu.NotesURL() + "/ue_list?formation_id=" + str(UE["formation_id"])
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
(("matiere_id", {"input_type": "hidden"}),),
initvalues=M,
@@ -256,7 +256,7 @@ des notes.
associé.
"""
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
(
("matiere_id", {"input_type": "hidden"}),
@@ -323,4 +323,4 @@ def matiere_is_locked(matiere_id):
""",
{"matiere_id": matiere_id},
)
- return len(r) > 0
\ No newline at end of file
+ return len(r) > 0
diff --git a/app/scodoc/sco_edit_module.py b/app/scodoc/sco_edit_module.py
index 3b4ce2540..b0b6ca76f 100644
--- a/app/scodoc/sco_edit_module.py
+++ b/app/scodoc/sco_edit_module.py
@@ -29,7 +29,7 @@
(portage from DTML)
"""
import flask
-from flask import url_for, g
+from flask import url_for, g, request
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
@@ -143,7 +143,7 @@ def module_create(matiere_id=None, REQUEST=None):
else:
default_num = 10
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
(
(
@@ -294,7 +294,7 @@ def module_delete(module_id=None, REQUEST=None):
dest_url = scu.NotesURL() + "/ue_list?formation_id=" + str(Mod["formation_id"])
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
(("module_id", {"input_type": "hidden"}),),
initvalues=Mod,
@@ -388,7 +388,7 @@ def module_edit(module_id=None, REQUEST=None):
)
tf = TrivialFormulator(
- REQUEST.URL0,
+ request.base_url,
REQUEST.form,
(
(
diff --git a/app/scodoc/sco_edit_ue.py b/app/scodoc/sco_edit_ue.py
index db19d56bd..6f51ee4d8 100644
--- a/app/scodoc/sco_edit_ue.py
+++ b/app/scodoc/sco_edit_ue.py
@@ -29,7 +29,7 @@
"""
import flask
-from flask import g, url_for
+from flask import g, url_for, request
from flask_login import current_user
import app.scodoc.notesdb as ndb
@@ -326,7 +326,11 @@ def ue_edit(ue_id=None, create=False, formation_id=None, REQUEST=None):
)
)
tf = TrivialFormulator(
- REQUEST.URL0, REQUEST.form, fw, initvalues=initvalues, submitlabel=submitlabel
+ request.base_url,
+ REQUEST.form,
+ fw,
+ initvalues=initvalues,
+ submitlabel=submitlabel,
)
if tf[0] == 0:
X = """
@@ -1033,7 +1037,7 @@ def formation_table_recap(formation_id, format="html", REQUEST=None):
caption=title,
html_caption=title,
html_class="table_leftalign",
- base_url="%s?formation_id=%s" % (REQUEST.URL0, formation_id),
+ base_url="%s?formation_id=%s" % (request.base_url, formation_id),
page_title=title,
html_title="" + title + "
",
pdf_title=title,
diff --git a/app/scodoc/sco_etape_apogee_view.py b/app/scodoc/sco_etape_apogee_view.py
index 1b625bcd5..a4440bf7b 100644
--- a/app/scodoc/sco_etape_apogee_view.py
+++ b/app/scodoc/sco_etape_apogee_view.py
@@ -32,7 +32,7 @@ import io
from zipfile import ZipFile
import flask
-from flask import url_for, g, send_file
+from flask import url_for, g, send_file, request
# from werkzeug.utils import send_file
@@ -250,7 +250,7 @@ def apo_semset_maq_status(
"""