PIVOT 1.1.0

This commit is contained in:
marijn committed 2026-10-14 13:34:37 +02:00
commit 8a53234eb6
161 files changed
+31109

No files matched your search

+84
View File
@@ -0,0 +1,84 @@
"""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')})