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 -* # -*- 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 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() token = user.get_reset_password_token()
send_email( send_email(
"[ScoDoc] Réinitialisation de votre mot de passe", "[ScoDoc] Réinitialisation de votre mot de passe",
sender=get_from_addr(), sender=get_from_addr(),
recipients=[user.email], recipients=recipients,
text_body=render_template("email/reset_password.txt", user=user, token=token), text_body=render_template("email/reset_password.txt", user=user, token=token),
html_body=render_template("email/reset_password.j2", 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) user_name = db.Column(db.String(USERNAME_STR_LEN), index=True, unique=True)
"le login" "le login"
email = db.Column(db.String(120)) 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)) nom = db.Column(db.String(USERNAME_STR_LEN))
prenom = 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) 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) active = db.Column(db.Boolean, default=True, index=True)
"si faux, compte utilisateur désactivé" "si faux, compte utilisateur désactivé"
cas_id = db.Column(db.Text(), index=True, unique=True, nullable=True) 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( cas_allow_login = db.Column(
db.Boolean, default=False, server_default="false", nullable=False db.Boolean, default=False, server_default="false", nullable=False
) )
@ -253,6 +255,7 @@ class User(UserMixin, db.Model):
} }
if include_email: if include_email:
data["email"] = self.email or "" data["email"] = self.email or ""
data["email_institutionnel"] = self.email_institutionnel or ""
return data return data
def from_dict(self, data: dict, new_user=False): def from_dict(self, data: dict, new_user=False):
@ -265,6 +268,7 @@ class User(UserMixin, db.Model):
"dept", "dept",
"active", "active",
"email", "email",
"email_institutionnel",
"date_expiration", "date_expiration",
"cas_id", "cas_id",
]: ]:
@ -323,6 +327,15 @@ class User(UserMixin, db.Model):
return self._departement.id return self._departement.id
return None 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: # Permissions management:
def has_permission(self, perm: int, dept=False): def has_permission(self, perm: int, dept=False):
"""Check if user has permission `perm` in given `dept`. """Check if user has permission `perm` in given `dept`.
@ -615,8 +628,7 @@ def get_super_admin():
def send_notif_desactivation_user(user: User): def send_notif_desactivation_user(user: User):
"""Envoi un message mail de notification à l'admin et à l'adresse du compte désactivé""" """Envoi un message mail de notification à l'admin et à l'adresse du compte désactivé"""
if not user.email: recipients = user.get_emails() + [current_app.config.get("SCODOC_ADMIN_MAIL")]
return
txt = [ txt = [
f"""Le compte ScoDoc '{user.user_name}' associé à votre adresse <{user.email}>""", 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""", """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( email.send_email(
f"ScoDoc: désactivation automatique du compte {user.user_name}", f"ScoDoc: désactivation automatique du compte {user.user_name}",
email.get_from_addr(), email.get_from_addr(),
[user.email, current_app.config.get("SCODOC_ADMIN_MAIL")], recipients,
txt, txt,
) )
return txt return txt

View File

@ -53,6 +53,7 @@ TITLES = (
"cas_id", "cas_id",
"cas_allow_login", "cas_allow_login",
"cas_allow_scodoc_login", "cas_allow_scodoc_login",
"email_institutionnel",
) )
COMMENTS = ( COMMENTS = (
"""user_name: """user_name:
@ -64,6 +65,7 @@ COMMENTS = (
"""prenom: """prenom:
Maximum 64 caractères.""", Maximum 64 caractères.""",
"""email: """email:
L'adresse mail utilisée en priorité par ScoDoc pour contacter l'utilisateur.
Maximum 120 caractères.""", Maximum 120 caractères.""",
"""roles: """roles:
un plusieurs rôles séparés par ',' un plusieurs rôles séparés par ','
@ -85,6 +87,9 @@ COMMENTS = (
"""cas_allow_scodoc_login """cas_allow_scodoc_login
autorise connexion via ScoDoc même si CAS obligatoire (optionnel, faux par défaut) 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_allow_scodoc_login",
"cas_last_login", "cas_last_login",
] ]
columns_ids.append("email_institutionnel")
title = "Utilisateurs définis dans ScoDoc" title = "Utilisateurs définis dans ScoDoc"
tab = GenTable( tab = GenTable(
@ -182,6 +183,7 @@ def list_users(
"nom_fmt": "Nom", "nom_fmt": "Nom",
"prenom_fmt": "Prénom", "prenom_fmt": "Prénom",
"email": "Mail", "email": "Mail",
"email_institutionnel": "Mail institutionnel (opt.)",
"dept": "Dept.", "dept": "Dept.",
"roles_string": "Rôles", "roles_string": "Rôles",
"date_expiration": "Expiration", "date_expiration": "Expiration",

View File

@ -18,13 +18,15 @@
Vous pouvez supprimer des lignes, mais pas en ajouter. Vous pouvez supprimer des lignes, mais pas en ajouter.
<br> <br>
On peut remplir ou modifier le contenu des colonnes <tt>active</tt>, 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> <br>
Les autres colonnes sont là pour information et seront ignorées à l'import, 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. sauf évidemment <tt>user_name</tt> qui sert à repérer l'utilisateur.
<br> <br>
(Note: <tt>active</tt> active ou désactive le compte, sans lien avec CAS, mais il (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>
<li style="margin-bottom:32px;">Revenez sur cette page et chargez le fichier dans ScoDoc. <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>Nom :</b> {{user.nom or ""}}<br>
<b>Prénom :</b> {{user.prenom or ""}}<br> <b>Prénom :</b> {{user.prenom or ""}}<br>
<b>Mail :</b> {{user.email}}<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>Rôles :</b> {{user.get_roles_string()}}<br>
<b>Dept :</b> {{user.dept or ""}}<br> <b>Dept :</b> {{user.dept or ""}}<br>
{% if user.passwd_temp or user.password_scodoc7 %} {% 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(), "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 if not edit: # options création utilisateur
descr += [ descr += [

View File

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