mail/app/blueprints/rules/__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

98 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import logging
from flask import Blueprint, redirect, render_template, request, url_for
from ...services import mock_mail
from ...services import sieve_builder, store
bp = Blueprint("rules", __name__, template_folder="../../templates")
log = logging.getLogger(__name__)
def _sync_sieve():
owner = mock_mail.CURRENT_USER_EMAIL
try:
rules = store.list_rules(owner)
script = sieve_builder.render(rules)
ok, msg = sieve_builder.deploy(owner, script)
if not ok:
log.warning("sieve deploy failed for %s: %s", owner, msg)
except Exception:
log.warning("sieve sync error", exc_info=True)
FIELDS = [
("from", "Поле «От»"),
("to", "Поле «Кому»"),
("cc", "Поле «Копия»"),
("subject", "Поле «Тема»"),
("body", "Содержимое письма"),
("forwarded_from", "Поле «Переадресовано от»"),
("forwarded_to", "Поле «Переадресовано для»"),
("size_kb", "Размер письма (Кб)"),
]
OPS = [
("contains", "содержит"),
("not_contains", "не содержит"),
("equals", "равно"),
("starts_with", "начинается с"),
("ends_with", "оканчивается на"),
("matches", "совпадает с шаблоном"),
("greater_than", "больше, чем"),
]
ACTIONS = [
("move", "переместить в папку"),
("star", "добавить в избранное"),
("important", "пометить как важное"),
("mark_read", "пометить прочитанным"),
("delete", "удалить"),
("forward_copy", "переслать копию на адрес"),
("autoreply", "ответить автоматически"),
]
@bp.route("/")
def index():
return render_template(
"rules/index.html",
rules=mock_mail.list_rules(),
fields=dict(FIELDS),
ops=dict(OPS),
actions=dict(ACTIONS),
fields_list=FIELDS,
ops_list=OPS,
actions_list=ACTIONS,
folders=mock_mail.all_folders(),
)
@bp.route("/new", methods=["POST"])
def create():
mock_mail.add_rule(
name=request.form.get("name", "").strip() or "Без названия",
field_=request.form.get("field", "subject"),
op=request.form.get("op", "contains"),
value=request.form.get("value", "").strip(),
action=request.form.get("action", "move"),
target=request.form.get("target", "").strip(),
apply_to_existing=bool(request.form.get("apply_to_existing")),
continue_chain=bool(request.form.get("continue_chain")),
apply_to_spam=bool(request.form.get("apply_to_spam")),
)
_sync_sieve()
return redirect(url_for("rules.index"))
@bp.route("/<int:rid>/toggle", methods=["POST"])
def toggle(rid: int):
mock_mail.toggle_rule(rid)
_sync_sieve()
return redirect(url_for("rules.index"))
@bp.route("/<int:rid>/delete", methods=["POST"])
def delete(rid: int):
mock_mail.delete_rule(rid)
_sync_sieve()
return redirect(url_for("rules.index"))