85 lines
3.8 KiB
Python
85 lines
3.8 KiB
Python
"""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')})
|