diff --git a/app/auth/email.py b/app/auth/email.py index e9d1e426..827866b3 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 5e241c71..8ff8e885 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 550e0fdb..af0cef3f 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 d6d8c7d5..7a4f21d5 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 382908a4..64f8603c 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)
  • Revenez sur cette page et chargez le fichier dans ScoDoc. diff --git a/app/templates/auth/user_info_page.j2 b/app/templates/auth/user_info_page.j2 index f2ca51bf..cb5a5526 100644 --- a/app/templates/auth/user_info_page.j2 +++ b/app/templates/auth/user_info_page.j2 @@ -17,6 +17,7 @@ Nom : {{user.nom or ""}}
    Prénom : {{user.prenom or ""}}
    Mail : {{user.email}}
    + Mail institutionnel: {{user.email_institutionnel or ""}}
    Rôles : {{user.get_roles_string()}}
    Dept : {{user.dept or ""}}
    {% if user.passwd_temp or user.password_scodoc7 %} diff --git a/app/views/users.py b/app/views/users.py index d9c8a1fa..68109c6c 100644 --- a/app/views/users.py +++ b/app/views/users.py @@ -419,6 +419,17 @@ def create_user_form(user_name=None, edit=0, all_roles=True): "enabled": current_user.is_administrator(), }, ), + ( + "email_institutionnel", + { + "title": "e-mail institutionnel", + "input_type": "text", + "explanation": "facultatif" if not edit_only_roles else "", + "size": 36, + "allow_null": False, + "readonly": edit_only_roles, + }, + ), ] if not edit: # options création utilisateur descr += [ diff --git a/sco_version.py b/sco_version.py index c65998d1..990218e1 100644 --- a/sco_version.py +++ b/sco_version.py @@ -1,7 +1,7 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "9.4.62" +SCOVERSION = "9.4.63" SCONAME = "ScoDoc"