87 lines
3.4 KiB
Python
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"))
|