Files
Pivot/blueprints/gmail_labels_bp.py
T
2026-10-14 12:29:29 +02:00

85 lines
3.8 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.
"""Google › E-mails met een label verplaatsen of kopiëren naar een andere mailbox."""
from flask import Blueprint, render_template, request, redirect, url_for, flash, session, jsonify
from blueprints.auth import login_required
from rechten import recht_vereist, log
from services import gmail_label_service as gl
from services.gmail_delegation_service import GmailDelegationService, DelegationError
gmail_labels_bp = Blueprint('gmail_labels', __name__)
def _mailbox(waarde):
"""E-mailadres → {'email', 'naam', ...} via Google (hoofdadres, ook als er een alias ingegeven werd)."""
return GmailDelegationService().resolve_user(waarde)
@gmail_labels_bp.route('/', methods=['GET'])
@login_required
@recht_vereist('gmail_labels')
def overzicht():
bron_in = (request.args.get('bron') or '').strip()
doel_in = (request.args.get('doel') or '').strip()
label_id = (request.args.get('label') or '').strip()
bron = doel = None
labels, fout, gekozen = [], None, None
if bron_in:
try:
bron = _mailbox(bron_in)
labels = gl.labels(bron['email'])
gekozen = next((l for l in labels if l['id'] == label_id), None)
except (DelegationError, gl.LabelFout) as e:
fout = str(e)
except Exception as e:
fout = gl.vriendelijk(e)
if doel_in and not fout:
try:
doel = _mailbox(doel_in)
if bron and doel['email'] == bron['email']:
fout, doel = "De doelmailbox moet een andere mailbox zijn dan de bronmailbox.", None
except DelegationError as e:
fout = str(e)
try:
geschiedenis = gl.geschiedenis()
except Exception:
geschiedenis = []
return render_template('gmail_labels.html', bron_in=bron_in, doel_in=doel_in, bron=bron, doel=doel,
labels=labels, gekozen=gekozen, fout=fout, status=gl.LabelVerplaatser().status,
geschiedenis=geschiedenis, scope=gl.SCOPE)
@gmail_labels_bp.route('/start', methods=['POST'])
@login_required
@recht_vereist('gmail_labels')
def start():
f = request.form
terug = dict(bron=f.get('bron'), doel=f.get('doel'), label=f.get('label'))
modus = 'verplaatsen' if f.get('modus') == 'verplaatsen' else 'kopieren'
try:
bron, doel = _mailbox(f.get('bron')), _mailbox(f.get('doel'))
if bron['email'] == doel['email']:
raise DelegationError("De doelmailbox moet een andere mailbox zijn dan de bronmailbox.")
label = next((l for l in gl.labels(bron['email']) if l['id'] == f.get('label')), None)
if not label:
raise gl.LabelFout("Dat label bestaat niet (meer) in de bronmailbox.")
except (DelegationError, gl.LabelFout) as e:
flash(str(e), "error")
return redirect(url_for('gmail_labels.overzicht', **terug))
door = session.get('naam') or session.get('user')
if gl.LabelVerplaatser().start(bron['email'], label['id'], label['naam'], doel['email'], modus, door):
log(f"Gmail: label '{label['naam']}' {modus} van {bron['email']} naar {doel['email']}")
flash(f"Gestart: de berichten met label '{label['naam']}' worden {'verplaatst' if modus == 'verplaatsen' else 'gekopieerd'} "
f"naar {doel['email']}. Je mag deze pagina sluiten; het gaat verder op de achtergrond.", "info")
else:
flash("Er loopt al een opdracht. Wacht tot die klaar is.", "warning")
return redirect(url_for('gmail_labels.overzicht', **terug))
@gmail_labels_bp.route('/status.json', methods=['GET'])
@login_required
@recht_vereist('gmail_labels')
def status():
s = gl.LabelVerplaatser().status
return jsonify({k: s.get(k) for k in ('bezig', 'voortgang', 'totaal', 'gelukt', 'overgeslagen', 'fouten', 'fout',
'resultaat', 'opdracht', 'foutvoorbeelden')})