SuiteConsultance/modules/email/drafts_web.py
2025-09-20 13:18:04 +02:00

87 lines
3.4 KiB
Python

from flask import Blueprint, request, redirect, url_for, flash, Response
from typing import List
from html import escape
from modules.email.draft_handler import DraftHandler
from modules.email.email_manager import EmailSender
email_drafts_bp = Blueprint("email_drafts", __name__, url_prefix="/email/drafts")
@email_drafts_bp.get("/")
def list_drafts_page():
"""
Page HTML minimaliste listant les brouillons avec bouton [Envoyer].
Pas de template Jinja requis (HTML inline pour simplicité d'intégration).
"""
handler = DraftHandler()
drafts = handler.list_pending()
def row_html(d):
# Contenu HTML tel quel (on suppose content déjà HTML sûr)
return f"""
<div style="border:1px solid #ddd; padding:12px; margin-bottom:12px; border-radius:8px;">
<div style="display:flex; justify-content:space-between; align-items:center;">
<h3 style="margin:0; font-size:1.05rem;">{escape(d.subject)}</h3>
<form method="post" action="{url_for('email_drafts.send_draft')}">
<input type="hidden" name="draft_id" value="{escape(d.id)}" />
<button type="submit" style="padding:6px 12px;">Envoyer</button>
</form>
</div>
<div style="color:#555; margin:6px 0 8px 0;">À: {escape(d.to_email)}</div>
<div style="background:#fafafa; padding:10px; border-radius:6px;">{d.content}</div>
<div style="font-size:12px; color:#777; margin-top:6px;">
Prospect: {escape(d.prospect_id)} | Template: {escape(d.template_id or '-') }
</div>
</div>
"""
items_html = "\n".join(row_html(d) for d in drafts) or "<p>Aucun brouillon à envoyer.</p>"
page = f"""
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Brouillons d'emails</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body style="max-width:920px; margin: 20px auto; font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;">
<h2>Brouillons d'emails à envoyer</h2>
<div>{items_html}</div>
</body>
</html>
"""
return Response(page, mimetype="text/html")
@email_drafts_bp.post("/send")
def send_draft():
"""
Envoi d'un brouillon sélectionné, puis mise à jour du statut.
"""
draft_id = (request.form.get("draft_id") or "").strip()
if not draft_id:
flash("Brouillon invalide", "warning")
return redirect(url_for("email_drafts.list_drafts_page"))
handler = DraftHandler()
draft = handler.get_draft(draft_id)
if not draft:
flash("Brouillon introuvable", "danger")
return redirect(url_for("email_drafts.list_drafts_page"))
sender = EmailSender()
try:
res = sender.send_email(draft.to_email, draft.subject, draft.content)
if res.get("success"):
handler.mark_sent(draft.id, success=True)
flash("Email envoyé.", "success")
else:
handler.mark_sent(draft.id, success=False, error_message=res.get("error"))
flash("Échec de l'envoi de l'email.", "danger")
except Exception as e:
handler.mark_sent(draft.id, success=False, error_message=str(e))
flash("Erreur lors de l'envoi de l'email.", "danger")
return redirect(url_for("email_drafts.list_drafts_page"))