"""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')})