Ajout champ User.email_institutionnel

This commit is contained in:
Emmanuel Viennet 2023-03-14 16:30:27 +01:00
parent 9058b93507
commit 7bd03f7630
8 changed files with 50 additions and 12 deletions

View File

@ -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),
)

View File

@ -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

View File

@ -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.""",
)

View File

@ -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",

View File

@ -18,13 +18,15 @@
Vous pouvez supprimer des lignes, mais pas en ajouter.
<br>
On peut remplir ou modifier le contenu des colonnes <tt>active</tt>,
</tt><tt>cas_id</tt>, <tt>cas_allow_login</tt> et <tt>cas_allow_scodoc_login</tt>.
<tt>cas_id</tt>, <tt>cas_allow_login</tt>, <tt>cas_allow_scodoc_login</tt>,
et <tt>email_institutionnel</tt>
<br>
Les autres colonnes sont là pour information et seront ignorées à l'import,
sauf évidemment <tt>user_name</tt> qui sert à repérer l'utilisateur.
<br>
(Note: <tt>active</tt> 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 <tt>email_institutionnel</tt>)
</li>
<li style="margin-bottom:32px;">Revenez sur cette page et chargez le fichier dans ScoDoc.

View File

@ -17,6 +17,7 @@
<b>Nom :</b> {{user.nom or ""}}<br>
<b>Prénom :</b> {{user.prenom or ""}}<br>
<b>Mail :</b> {{user.email}}<br>
<b>Mail institutionnel:</b> {{user.email_institutionnel or ""}}<br>
<b>Rôles :</b> {{user.get_roles_string()}}<br>
<b>Dept :</b> {{user.dept or ""}}<br>
{% if user.passwd_temp or user.password_scodoc7 %}

View File

@ -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 += [

View File

@ -1,7 +1,7 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
SCOVERSION = "9.4.62"
SCOVERSION = "9.4.63"
SCONAME = "ScoDoc"