forked from ScoDoc/ScoDoc
Ajout champ User.email_institutionnel
This commit is contained in:
parent
9058b93507
commit
7bd03f7630
@ -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),
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
|
@ -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.""",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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",
|
||||||
|
@ -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.
|
||||||
|
@ -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 %}
|
||||||
|
@ -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 += [
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user