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("//toggle", methods=["POST"]) def toggle(rid: int): mock_mail.toggle_rule(rid) _sync_sieve() return redirect(url_for("rules.index")) @bp.route("//delete", methods=["POST"]) def delete(rid: int): mock_mail.delete_rule(rid) _sync_sieve() return redirect(url_for("rules.index"))