diff --git a/app/auth/email.py b/app/auth/email.py
index e9d1e4262..827866b35 100644
--- a/app/auth/email.py
+++ b/app/auth/email.py
@@ -1,15 +1,20 @@
# -*- coding: UTF-8 -*
-from flask import render_template, current_app
-from flask_babel import _
+
+from flask import render_template
+from app.auth.models import User
from app.email import get_from_addr, send_email
-def send_password_reset_email(user):
+def send_password_reset_email(user: User):
+ """Send message allowing to reset password"""
+ recipients = user.get_emails()
+ if not recipients:
+ return
token = user.get_reset_password_token()
send_email(
"[ScoDoc] Réinitialisation de votre mot de passe",
sender=get_from_addr(),
- recipients=[user.email],
+ recipients=recipients,
text_body=render_template("email/reset_password.txt", user=user, token=token),
html_body=render_template("email/reset_password.j2", user=user, token=token),
)
diff --git a/app/auth/models.py b/app/auth/models.py
index 5e241c712..8ff8e8859 100644
--- a/app/auth/models.py
+++ b/app/auth/models.py
@@ -56,7 +56,9 @@ class User(UserMixin, db.Model):
user_name = db.Column(db.String(USERNAME_STR_LEN), index=True, unique=True)
"le login"
email = db.Column(db.String(120))
-
+ "email à utiliser par ScoDoc"
+ email_institutionnel = db.Column(db.String(120))
+ "email dans l'établissement, facultatif"
nom = db.Column(db.String(USERNAME_STR_LEN))
prenom = db.Column(db.String(USERNAME_STR_LEN))
dept = db.Column(db.String(SHORT_STR_LEN), index=True)
@@ -64,7 +66,7 @@ class User(UserMixin, db.Model):
active = db.Column(db.Boolean, default=True, index=True)
"si faux, compte utilisateur désactivé"
cas_id = db.Column(db.Text(), index=True, unique=True, nullable=True)
- "uid sur le CAS (mail ou autre attribut, selon config.cas_attribute_id)"
+ "uid sur le CAS (id, mail ou autre attribut, selon config.cas_attribute_id)"
cas_allow_login = db.Column(
db.Boolean, default=False, server_default="false", nullable=False
)
@@ -253,6 +255,7 @@ class User(UserMixin, db.Model):
}
if include_email:
data["email"] = self.email or ""
+ data["email_institutionnel"] = self.email_institutionnel or ""
return data
def from_dict(self, data: dict, new_user=False):
@@ -265,6 +268,7 @@ class User(UserMixin, db.Model):
"dept",
"active",
"email",
+ "email_institutionnel",
"date_expiration",
"cas_id",
]:
@@ -323,6 +327,15 @@ class User(UserMixin, db.Model):
return self._departement.id
return None
+ def get_emails(self):
+ "List mail adresses to contact this user"
+ mails = []
+ if self.email:
+ mails.append(self.email)
+ if self.email_institutionnel:
+ mails.append(self.email_institutionnel)
+ return mails
+
# Permissions management:
def has_permission(self, perm: int, dept=False):
"""Check if user has permission `perm` in given `dept`.
@@ -615,8 +628,7 @@ def get_super_admin():
def send_notif_desactivation_user(user: User):
"""Envoi un message mail de notification à l'admin et à l'adresse du compte désactivé"""
- if not user.email:
- return
+ recipients = user.get_emails() + [current_app.config.get("SCODOC_ADMIN_MAIL")]
txt = [
f"""Le compte ScoDoc '{user.user_name}' associé à votre adresse <{user.email}>""",
"""a été désactivé par le système car son mot de passe n'était pas valide.\n""",
@@ -627,7 +639,7 @@ def send_notif_desactivation_user(user: User):
email.send_email(
f"ScoDoc: désactivation automatique du compte {user.user_name}",
email.get_from_addr(),
- [user.email, current_app.config.get("SCODOC_ADMIN_MAIL")],
+ recipients,
txt,
)
return txt
diff --git a/app/scodoc/sco_import_users.py b/app/scodoc/sco_import_users.py
index 550e0fdbe..af0cef3f0 100644
--- a/app/scodoc/sco_import_users.py
+++ b/app/scodoc/sco_import_users.py
@@ -53,6 +53,7 @@ TITLES = (
"cas_id",
"cas_allow_login",
"cas_allow_scodoc_login",
+ "email_institutionnel",
)
COMMENTS = (
"""user_name:
@@ -64,6 +65,7 @@ COMMENTS = (
"""prenom:
Maximum 64 caractères.""",
"""email:
+ L'adresse mail utilisée en priorité par ScoDoc pour contacter l'utilisateur.
Maximum 120 caractères.""",
"""roles:
un plusieurs rôles séparés par ','
@@ -85,6 +87,9 @@ COMMENTS = (
"""cas_allow_scodoc_login
autorise connexion via ScoDoc même si CAS obligatoire (optionnel, faux par défaut)
""",
+ """email_institutionnel
+ optionnel, le mail officiel de l'utilisateur.
+ Maximum 120 caractères.""",
)
diff --git a/app/scodoc/sco_users.py b/app/scodoc/sco_users.py
index d6d8c7d5d..7a4f21d5a 100644
--- a/app/scodoc/sco_users.py
+++ b/app/scodoc/sco_users.py
@@ -172,6 +172,7 @@ def list_users(
"cas_allow_scodoc_login",
"cas_last_login",
]
+ columns_ids.append("email_institutionnel")
title = "Utilisateurs définis dans ScoDoc"
tab = GenTable(
@@ -182,6 +183,7 @@ def list_users(
"nom_fmt": "Nom",
"prenom_fmt": "Prénom",
"email": "Mail",
+ "email_institutionnel": "Mail institutionnel (opt.)",
"dept": "Dept.",
"roles_string": "Rôles",
"date_expiration": "Expiration",
diff --git a/app/templates/auth/cas_users_import_config.j2 b/app/templates/auth/cas_users_import_config.j2
index 382908a43..64f8603c2 100644
--- a/app/templates/auth/cas_users_import_config.j2
+++ b/app/templates/auth/cas_users_import_config.j2
@@ -18,13 +18,15 @@
Vous pouvez supprimer des lignes, mais pas en ajouter.
On peut remplir ou modifier le contenu des colonnes active,
- cas_id, cas_allow_login et cas_allow_scodoc_login.
+ cas_id, cas_allow_login, cas_allow_scodoc_login,
+ et email_institutionnel
Les autres colonnes sont là pour information et seront ignorées à l'import,
sauf évidemment user_name qui sert à repérer l'utilisateur.
(Note: active active ou désactive le compte, sans lien avec CAS, mais il
- est commode de réviser la liste des utilisateurs actifs à l'occasion de la configuration CAS)
+ est commode de réviser la liste des utilisateurs actifs à l'occasion de la configuration CAS.
+ Pareil pour email_institutionnel)