98 lines
3.1 KiB
Python
98 lines
3.1 KiB
Python
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"))
|