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

157 lines
6.5 KiB
Python

from flask import Blueprint, render_template, request, redirect, url_for, flash, session, jsonify
from tenancy import huidige_school, per_school
from blueprints.auth import login_required
from rechten import recht_vereist
from services.gmail_delegation_service import GmailDelegationService, DelegationError, MAX_DELEGATES
from services.gmail_delegatie_overzicht import DelegatieOverzicht
gmail_delegatie_bp = Blueprint('gmail_delegatie', __name__)
delegation_service = per_school(GmailDelegationService)
_table_ready = set() # scholen waarvoor de tabellen al gecontroleerd zijn
def _ensure_table():
if huidige_school().code not in _table_ready:
try:
delegation_service.ensure_table()
_table_ready.add(huidige_school().code)
except Exception as e:
flash(f"Kon tabel gmail_delegatie_log niet aanmaken: {e}", "error")
def _safe_log(actie, mailbox, gedelegeerde):
try:
delegation_service.log(session.get('user'), actie, mailbox, gedelegeerde)
except Exception as e:
flash(f"Wijziging is uitgevoerd, maar kon niet gelogd worden: {e}", "warning")
#---------------------------------------------
# Overzicht: mailbox zoeken en gedelegeerden tonen
#---------------------------------------------
@gmail_delegatie_bp.route('/', methods=['GET'])
@login_required
@recht_vereist('gmail_delegatie')
def overzicht():
_ensure_table()
zoek = (request.args.get('zoek') or '').strip()
mailbox_param = (request.args.get('mailbox') or '').strip()
zoekresultaten, mailbox, delegates, fout = [], None, [], None
# Zoekterm zonder @ = zoeken op naam; met @ = direct die mailbox openen
if zoek and '@' not in zoek:
zoekresultaten = delegation_service.search_users(zoek)
if not zoekresultaten:
fout = f"Geen gebruikers gevonden voor '{zoek}'."
elif zoek and not mailbox_param:
mailbox_param = zoek
if mailbox_param:
try:
mailbox = delegation_service.resolve_user(mailbox_param)
delegates = delegation_service.list_delegates(mailbox['email'])
DelegatieOverzicht().bewaar_mailbox(mailbox['email'], mailbox['naam'], delegates) # overzicht actueel houden
except DelegationError as e:
fout = str(e)
try:
geschiedenis = delegation_service.history(mailbox['email'] if mailbox else None)
except Exception:
geschiedenis = []
# Alle lopende machtigingen (achtergrondtaak, vanzelf vernieuwd als ze ouder zijn dan een dag)
ov = DelegatieOverzicht()
machtigingen, laatst, ov_fout = [], None, None
try:
ov.ensure_table()
if ov.verouderd():
ov.sync_op_achtergrond()
machtigingen, laatst = ov.alle(), ov.laatst_opgehaald()
except Exception as e:
ov_fout = f"Het overzicht kon niet gelezen worden: {e}"
return render_template('gmail_delegatie.html', zoek=zoek, zoekresultaten=zoekresultaten,
mailbox=mailbox, delegates=delegates, fout=fout,
geschiedenis=geschiedenis, max_delegates=MAX_DELEGATES,
machtigingen=machtigingen, laatst=laatst, ov_fout=ov_fout, ov_status=ov.status)
@gmail_delegatie_bp.route('/overzicht/vernieuwen', methods=['POST'])
@login_required
@recht_vereist('gmail_delegatie')
def overzicht_vernieuwen():
if DelegatieOverzicht().sync_op_achtergrond():
flash("Alle mailboxen worden nagekeken. Dit kan enkele minuten duren; de tabel vernieuwt vanzelf.", "info")
else:
flash("Er loopt al een ophaling.", "warning")
return redirect(url_for('gmail_delegatie.overzicht'))
@gmail_delegatie_bp.route('/overzicht/status.json', methods=['GET'])
@login_required
@recht_vereist('gmail_delegatie')
def overzicht_status():
s = DelegatieOverzicht().status
return jsonify(bezig=s['bezig'], voortgang=s['voortgang'], totaal=s['totaal'], fout=s['fout'], resultaat=s['resultaat'])
def _ververs_mailbox(mailbox):
"""Na een wijziging: de rijen van deze mailbox in het overzicht opnieuw opvragen."""
try:
m = delegation_service.resolve_user(mailbox)
DelegatieOverzicht().bewaar_mailbox(m['email'], m['naam'], delegation_service.list_delegates(m['email']))
except Exception:
pass
#---------------------------------------------
# Gedelegeerde toevoegen
#---------------------------------------------
@gmail_delegatie_bp.route('/toevoegen', methods=['POST'])
@login_required
@recht_vereist('gmail_delegatie')
def toevoegen():
_ensure_table()
mailbox_in = request.form.get('mailbox', '')
delegate_in = request.form.get('delegate', '')
try:
mailbox = delegation_service.resolve_user(mailbox_in)
delegate = delegation_service.resolve_user(delegate_in)
if delegate['geschorst']:
raise DelegationError(f"{delegate['email']} is geschorst en kan geen toegang krijgen.")
if len(delegation_service.list_delegates(mailbox['email'])) >= MAX_DELEGATES:
raise DelegationError(f"{mailbox['email']} heeft al het maximum van {MAX_DELEGATES} gedelegeerden.")
delegation_service.add_delegate(mailbox['email'], delegate['email'])
_safe_log('toegevoegd', mailbox['email'], delegate['email'])
_ververs_mailbox(mailbox['email'])
extra = f" (alias {delegate_in.strip()} omgezet naar hoofdadres)" if delegate['is_alias'] else ""
flash(f"{delegate['email']} heeft nu toegang tot {mailbox['email']}{extra}. "
"Het kan tot een minuut duren voor de mailbox zichtbaar is.", "success")
return redirect(url_for('gmail_delegatie.overzicht', mailbox=mailbox['email']))
except DelegationError as e:
flash(str(e), "error")
return redirect(url_for('gmail_delegatie.overzicht', mailbox=mailbox_in.strip()))
#---------------------------------------------
# Gedelegeerde verwijderen
#---------------------------------------------
@gmail_delegatie_bp.route('/verwijderen', methods=['POST'])
@login_required
@recht_vereist('gmail_delegatie')
def verwijderen():
_ensure_table()
mailbox = (request.form.get('mailbox') or '').strip().lower()
delegate = (request.form.get('delegate') or '').strip().lower()
try:
delegation_service.remove_delegate(mailbox, delegate)
_safe_log('verwijderd', mailbox, delegate)
_ververs_mailbox(mailbox)
flash(f"Toegang van {delegate} tot {mailbox} is ingetrokken.", "success")
except DelegationError as e:
flash(str(e), "error")
return redirect(url_for('gmail_delegatie.overzicht', mailbox=mailbox))