mail/app/blueprints/settings/__init__.py
deeily 5024bf9a8d init: full mail stack — phases 0..8 (web client, admin, IMAP/SMTP,
sieve, search, sessions, dramatiq, deploy/install, ELK, monitoring)
2026-04-29 16:30:43 +03:00

86 lines
3.1 KiB
Python

from flask import Blueprint, abort, current_app, redirect, render_template, request, url_for
from ...services import mock_mail
bp = Blueprint("settings", __name__, template_folder="../../templates")
@bp.route("/")
def index():
return redirect(url_for("admin.index"))
@bp.route("/sessions", methods=["GET", "POST"])
def sessions_view():
from flask import g
from ...services import sessions as sess
if request.method == "POST":
action = request.form.get("action")
if action == "revoke":
tok = request.form.get("token", "")
if tok and tok != g.session_token:
sess.revoke(tok)
sess.audit("session_revoke", g.user_email, "", "", extra=f"token={tok[:8]}")
elif action == "revoke_others":
n = sess.revoke_all_for(g.user_email, except_token=g.session_token)
sess.audit("session_revoke_others", g.user_email, "", "", extra=f"count={n}")
return redirect(url_for("settings.sessions_view"))
items = sess.list_for(g.user_email)
return render_template("settings/sessions.html", items=items, current=g.session_token)
@bp.route("/signatures")
def signatures():
return render_template("settings/signatures.html",
signatures=mock_mail.list_signatures())
@bp.route("/signatures/new", methods=["GET", "POST"])
def signature_new():
if request.method == "POST":
mock_mail.add_signature(
name=request.form.get("name", ""),
body_md=request.form.get("body_md", ""),
is_default=bool(request.form.get("is_default")),
)
return redirect(url_for("settings.signatures"))
return render_template("settings/signature_edit.html", signature=None)
@bp.route("/signatures/<int:sid>/edit", methods=["GET", "POST"])
def signature_edit(sid: int):
sig = mock_mail.get_signature(sid)
if not sig:
abort(404)
if request.method == "POST":
mock_mail.update_signature(
sid,
name=request.form.get("name", ""),
body_md=request.form.get("body_md", ""),
is_default=bool(request.form.get("is_default")),
)
return redirect(url_for("settings.signatures"))
return render_template("settings/signature_edit.html", signature=sig)
@bp.route("/signatures/<int:sid>/delete", methods=["POST"])
def signature_delete(sid: int):
mock_mail.delete_signature(sid)
return redirect(url_for("settings.signatures"))
@bp.route("/autoreply", methods=["GET", "POST"])
def autoreply():
if request.method == "POST":
mock_mail.update_autoreply(
enabled=bool(request.form.get("enabled")),
subject=request.form.get("subject", "").strip(),
body_md=request.form.get("body_md", ""),
date_from=request.form.get("date_from", "").strip(),
date_to=request.form.get("date_to", "").strip(),
only_contacts=bool(request.form.get("only_contacts")),
reply_once_per_day=bool(request.form.get("reply_once_per_day")),
)
return redirect(url_for("settings.autoreply"))
return render_template("settings/autoreply.html", ar=mock_mail.get_autoreply())