canaille-globuzma/canaille/admin.py

196 lines
5.7 KiB
Python
Raw Normal View History

2021-12-20 22:57:27 +00:00
from canaille.apputils import obj_to_b64
2021-12-02 17:23:14 +00:00
from canaille.flaskutils import permissions_needed
2021-01-22 17:26:53 +00:00
from canaille.mails import profile_hash
2023-01-22 11:48:15 +00:00
from canaille.mails import send_test_mail
2021-12-20 22:57:27 +00:00
from flask import Blueprint
from flask import current_app
2021-12-23 18:21:29 +00:00
from flask import flash
from flask import request
2021-12-20 22:57:27 +00:00
from flask import url_for
from flask_babel import gettext as _
from flask_themer import render_template
2021-12-23 18:21:29 +00:00
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
from wtforms.validators import Email
2022-01-11 20:11:54 +00:00
bp = Blueprint("admin", __name__, url_prefix="/admin")
2021-12-23 18:21:29 +00:00
class MailTestForm(FlaskForm):
mail = StringField(
_("Email"),
validators=[
DataRequired(),
Email(),
],
render_kw={
"placeholder": _("jane@doe.com"),
"spellcheck": "false",
"autocorrect": "off",
},
)
2022-01-11 20:11:54 +00:00
@bp.route("/mail", methods=["GET", "POST"])
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_oidc")
2021-12-02 11:05:24 +00:00
def mail_index(user):
2021-12-23 18:21:29 +00:00
form = MailTestForm(request.form or None)
if request.form and form.validate():
2023-01-22 11:48:15 +00:00
if send_test_mail(form.mail.data):
2021-12-23 18:21:29 +00:00
flash(_("The test invitation mail has been sent correctly"), "success")
else:
flash(_("The test invitation mail has not been sent correctly"), "error")
2021-12-23 18:21:29 +00:00
return render_template("mail/admin.html", form=form, menuitem="admin")
2021-12-02 11:05:24 +00:00
2023-01-22 11:48:15 +00:00
@bp.route("/mail/test.html")
@permissions_needed("manage_oidc")
def test_html(user):
base_url = url_for("account.index", _external=True)
return render_template(
"mail/test.html",
site_name=current_app.config.get("NAME", "Canaille"),
site_url=base_url,
logo=current_app.config.get("LOGO"),
)
@bp.route("/mail/test.txt")
@permissions_needed("manage_oidc")
def test_txt(user):
base_url = url_for("account.index", _external=True)
return render_template(
"mail/test.txt",
site_name=current_app.config.get("NAME", "Canaille"),
site_url=current_app.config.get("SERVER_NAME", base_url),
)
2022-01-11 20:11:54 +00:00
@bp.route("/mail/password-init.html")
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_oidc")
2021-12-02 11:05:24 +00:00
def password_init_html(user):
base_url = url_for("account.index", _external=True)
reset_url = url_for(
"account.reset",
uid=user.uid[0],
hash=profile_hash(user.uid[0], user.mail[0], user.userPassword[0]),
_external=True,
)
return render_template(
"mail/firstlogin.html",
site_name=current_app.config.get("NAME", reset_url),
site_url=base_url,
reset_url=reset_url,
logo=current_app.config.get("LOGO"),
title=_("Password initialization on {website_name}").format(
website_name=current_app.config.get("NAME", reset_url)
),
)
2022-01-11 20:11:54 +00:00
@bp.route("/mail/password-init.txt")
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_oidc")
2021-12-02 11:05:24 +00:00
def password_init_txt(user):
base_url = url_for("account.index", _external=True)
reset_url = url_for(
"account.reset",
uid=user.uid[0],
hash=profile_hash(user.uid[0], user.mail[0], user.userPassword[0]),
_external=True,
)
return render_template(
"mail/firstlogin.txt",
site_name=current_app.config.get("NAME", reset_url),
site_url=current_app.config.get("SERVER_NAME", base_url),
reset_url=reset_url,
)
2022-01-11 20:11:54 +00:00
@bp.route("/mail/reset.html")
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_oidc")
2021-12-02 11:05:24 +00:00
def password_reset_html(user):
2021-05-24 15:43:15 +00:00
base_url = url_for("account.index", _external=True)
reset_url = url_for(
2021-05-24 15:43:15 +00:00
"account.reset",
uid=user.uid[0],
hash=profile_hash(user.uid[0], user.mail[0], user.userPassword[0]),
_external=True,
)
return render_template(
"mail/reset.html",
site_name=current_app.config.get("NAME", reset_url),
site_url=base_url,
reset_url=reset_url,
2020-12-10 16:42:58 +00:00
logo=current_app.config.get("LOGO"),
2020-12-10 15:34:46 +00:00
title=_("Password reset on {website_name}").format(
website_name=current_app.config.get("NAME", reset_url)
),
)
2022-01-11 20:11:54 +00:00
@bp.route("/mail/reset.txt")
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_oidc")
2021-12-02 11:05:24 +00:00
def password_reset_txt(user):
2021-05-24 15:43:15 +00:00
base_url = url_for("account.index", _external=True)
reset_url = url_for(
2021-05-24 15:43:15 +00:00
"account.reset",
uid=user.uid[0],
hash=profile_hash(user.uid[0], user.mail[0], user.userPassword[0]),
_external=True,
)
return render_template(
"mail/reset.txt",
site_name=current_app.config.get("NAME", reset_url),
site_url=current_app.config.get("SERVER_NAME", base_url),
reset_url=reset_url,
)
2021-12-01 11:19:28 +00:00
2022-01-11 20:11:54 +00:00
@bp.route("/mail/<uid>/<email>/invitation.html")
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_oidc")
2021-12-01 11:19:28 +00:00
def invitation_html(user, uid, email):
base_url = url_for("account.index", _external=True)
registration_url = url_for(
"account.registration",
2021-12-02 10:39:32 +00:00
data=obj_to_b64([uid, email]),
2021-12-01 11:19:28 +00:00
hash=profile_hash(uid, email),
_external=True,
)
return render_template(
"mail/invitation.html",
site_name=current_app.config.get("NAME", base_url),
site_url=base_url,
registration_url=registration_url,
logo=current_app.config.get("LOGO"),
title=_("Invitation on {website_name}").format(
website_name=current_app.config.get("NAME", base_url)
),
)
2022-01-11 20:11:54 +00:00
@bp.route("/mail/<uid>/<email>/invitation.txt")
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_oidc")
2021-12-01 11:19:28 +00:00
def invitation_txt(user, uid, email):
base_url = url_for("account.index", _external=True)
registration_url = url_for(
"account.registration",
2021-12-02 10:39:32 +00:00
data=obj_to_b64([uid, email]),
2021-12-01 11:19:28 +00:00
hash=profile_hash(uid, email),
_external=True,
)
return render_template(
"mail/invitation.txt",
site_name=current_app.config.get("NAME", base_url),
site_url=base_url,
registration_url=registration_url,
)