Ign
def check_modif_user(
- edit,
- enforce_optionals=False,
- user_name="",
- nom="",
- prenom="",
- email="",
- dept="",
+ edit: bool,
+ enforce_optionals: bool = False,
+ user_name: str = "",
+ nom: str = "",
+ prenom: str = "",
+ email: str = "",
+ dept: str = "",
roles: list = None,
cas_id: str = None,
-):
+) -> tuple[bool, str]:
"""Vérifie que cet utilisateur peut être créé (edit=0) ou modifié (edit=1)
Cherche homonymes.
Ne vérifie PAS que l'on a la permission de faire la modif.
- returns (ok, msg)
+
+ edit: si vrai, mode "edition" (modif d'un objet existant)
+ enforce_optionals: vérifie que les champs optionnels sont cohérents.
+
+ Returns (ok, msg)
- ok : si vrai, peut continuer avec ces parametres
(si ok est faux, l'utilisateur peut quand même forcer la creation)
- msg: message warning à presenter à l'utilisateur
@@ -302,12 +305,18 @@ def check_modif_user(
False,
f"identifiant '{user_name}' invalide (pas d'accents ni de caractères spéciaux)",
)
- if enforce_optionals and len(user_name) > 64:
- return False, f"identifiant '{user_name}' trop long (64 caractères)"
- if enforce_optionals and len(nom) > 64:
- return False, f"nom '{nom}' trop long (64 caractères)" + MSG_OPT
- if enforce_optionals and len(prenom) > 64:
- return False, f"prenom '{prenom}' trop long (64 caractères)" + MSG_OPT
+ if len(user_name) > USERNAME_STR_LEN:
+ return (
+ False,
+ f"identifiant '{user_name}' trop long ({USERNAME_STR_LEN} caractères)",
+ )
+ if len(nom) > USERNAME_STR_LEN:
+ return False, f"nom '{nom}' trop long ({USERNAME_STR_LEN} caractères)" + MSG_OPT
+ if len(prenom) > 64:
+ return (
+ False,
+ f"prenom '{prenom}' trop long ({USERNAME_STR_LEN} caractères)" + MSG_OPT,
+ )
# check that same user_name has not already been described in this import
if not email:
return False, "vous devriez indiquer le mail de l'utilisateur créé !"
diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py
index dc4fb9772..d56466c3e 100644
--- a/app/scodoc/sco_utils.py
+++ b/app/scodoc/sco_utils.py
@@ -637,15 +637,24 @@ def is_valid_filename(filename):
BOOL_STR = {
"": False,
- "false": False,
"0": False,
"1": True,
+ "f": False,
+ "false": False,
+ "n": False,
+ "t": True,
"true": True,
+ "y": True,
}
def to_bool(x) -> bool:
- """a boolean, may also be encoded as a string "0", "False", "1", "True" """
+ """Cast value to boolean.
+ The value may be encoded as a string
+ False are: empty, "0", "False", "f", "n".
+ True: all other values, such as "1", "True", "foo", "bar"...
+ Case insentive, ignore leading and trailing spaces.
+ """
if isinstance(x, str):
return BOOL_STR.get(x.lower().strip(), True)
return bool(x)
diff --git a/app/templates/auth/cas_users_import_config.j2 b/app/templates/auth/cas_users_import_config.j2
new file mode 100644
index 000000000..4bcd8e0d8
--- /dev/null
+++ b/app/templates/auth/cas_users_import_config.j2
@@ -0,0 +1,47 @@
+{% extends "base.j2" %}
+{% import 'bootstrap/wtf.html' as wtf %}
+
+{% block app_content %}
+Chargement des configurations CAS des utilisateurs
+
+
+
A utiliser pour modifier le paramétrage CAS de
+ comptes utilisateurs existants
+
+
L'opération se déroule en plusieurs étapes:
+
+
+ - Dans un premier temps, vous téléchargez une feuille Excel pré-remplie
+ avec la liste des tous les utilisateurs.
+
+ - Vous modifiez cette feuille avec votre logiciel préféré.
+ Vous pouvez supprimer des lignes, mais pas en ajouter.
+
+ Il faut remplir ou modifier le contenu des colonnes cas_id,
+ cas_allow_login et cas_allow_scodoc_login.
+
+ Les autres colonnes sont là pour information et seront ignorées à l'import,
+ sauf évidemment user_name qui sert à repérer l'utilisateur.
+
+
+ - Revenez sur cette page et chargez le fichier dans ScoDoc.
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/app/templates/config_cas.j2 b/app/templates/config_cas.j2
index 64e4f3c1a..5c0cebd15 100644
--- a/app/templates/config_cas.j2
+++ b/app/templates/config_cas.j2
@@ -19,11 +19,11 @@
{% endif %}
-ℹ️ Note: si le CAS est forcé, le super-admin et les utilisateurs autorisés
- à "se connecter via ScoDoc" pourront toujours se
- connecter via l'adresse spéciale
- {{url_for("auth.login_scodoc", _external=True)}}
-
+ ℹ️ Note: si le CAS est forcé, le super-admin et les utilisateurs autorisés
+ à "se connecter via ScoDoc" pourront toujours se
+ connecter via l'adresse spéciale
+ {{url_for("auth.login_scodoc", _external=True)}}
+
diff --git a/app/templates/configuration.j2 b/app/templates/configuration.j2
index 9113e3c36..d011e0911 100644
--- a/app/templates/configuration.j2
+++ b/app/templates/configuration.j2
@@ -55,10 +55,18 @@
Utilisateurs et CAS
ScoDoc
diff --git a/app/views/scolar.py b/app/views/scolar.py
index d1e8ebea1..03e158c4c 100644
--- a/app/views/scolar.py
+++ b/app/views/scolar.py
@@ -1938,13 +1938,10 @@ def form_students_import_excel(formsemestre_id=None):
formsemestre_id = int(formsemestre_id) if formsemestre_id else None
if formsemestre_id:
sem = sco_formsemestre.get_formsemestre(formsemestre_id)
- dest_url = (
- # scu.ScoURL() + "/formsemestre_status?formsemestre_id=%s" % formsemestre_id # TODO: Remplacer par for_url ?
- url_for(
- "notes.formsemestre_status",
- scodoc_dept=g.scodoc_dept,
- formsemestre_id=formsemestre_id,
- )
+ dest_url = url_for(
+ "notes.formsemestre_status",
+ scodoc_dept=g.scodoc_dept,
+ formsemestre_id=formsemestre_id,
)
else:
sem = None
@@ -2091,7 +2088,6 @@ def import_generate_excel_sample(with_codesemestre="1"):
return scu.send_file(
data, "ImportEtudiants", scu.XLSX_SUFFIX, mime=scu.XLSX_MIMETYPE
)
- # return sco_excel.send_excel_file(data, "ImportEtudiants" + scu.XLSX_SUFFIX)
# --- Données admission
diff --git a/app/views/users.py b/app/views/users.py
index c4b9f9321..4d70b31a2 100644
--- a/app/views/users.py
+++ b/app/views/users.py
@@ -758,8 +758,8 @@ def import_users_form():
head = html_sco_header.sco_header(page_title="Import utilisateurs")
H = [
head,
- """Téléchargement d'une nouvelle liste d'utilisateurs
- A utiliser pour importer de nouveaux
+ """
Téléchargement d'une liste d'utilisateurs
+ A utiliser pour importer de nouveaux
utilisateurs (enseignants ou secrétaires)
@@ -782,9 +782,14 @@ def import_users_form():
envoi à chaque utilisateur de son mot de passe initial par mail.
"""
H.append(
- f"""-
+
- Étape 1: Obtenir la feuille excel à remplir
- """
+ }">Obtenir la feuille excel vide à remplir
+ ou bien la liste complète des utilisateurs.
+
+ - Étape 2:
+ """
)
F = html_sco_header.sco_footer()
tf = TrivialFormulator(
@@ -810,7 +815,7 @@ def import_users_form():
submitlabel="Télécharger",
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + "
" + help_msg + F
+ return "\n".join(H) + tf[1] + "" + help_msg + F
elif tf[0] == -1:
return flask.redirect(url_for("scolar.index_html", docodc_dept=g.scodoc_dept))