Initial commit

This commit is contained in:
Kristof committed 2026-10-14 12:29:29 +02:00
commit 536ff43ce4
158 files changed
+30355

No files matched your search

+115
View File
@@ -0,0 +1,115 @@
"""Gmail › Contacten: contactlijsten in de mailboxen en het adresboek van de organisatie (zichtbaar/verborgen)."""
from flask import Blueprint, render_template, request, session, jsonify
from blueprints.auth import login_required
from rechten import recht_vereist, log
from services import contacten_service as cs
contacten_bp = Blueprint('contacten', __name__)
TABS = ('lijsten', 'adresboek')
def _door():
return session.get('naam') or session.get('user')
@contacten_bp.route('/', methods=['GET'])
@login_required
@recht_vereist('gmail_contacten')
def overzicht():
tab = request.args.get('tab') if request.args.get('tab') in TABS else TABS[0]
ctx = {'tab': tab, 'fout': None, 'status': cs.LijstSync().status}
try:
if tab == 'adresboek':
ctx['ous'] = cs.ou_lijst()
ctx['ou'] = request.args.get('ou') or ''
ctx['met_sub'] = 'sub' not in request.args or '1' in request.args.getlist('sub')
ctx['gebruikers'] = cs.gebruikers_in([ctx['ou']], ctx['met_sub']) if ctx['ou'] else []
else:
ctx['lijsten'] = cs.lijsten()
lid = request.args.get('lijst', type=int)
ctx['gekozen'] = cs.lijst(lid) if lid else None
ctx['nieuw'] = bool(request.args.get('nieuw'))
if ctx['gekozen'] or ctx['nieuw']:
ctx['ous'] = cs.ou_lijst()
except cs.ContactFout as e:
ctx['fout'] = str(e)
except Exception as e:
ctx['fout'] = cs.vriendelijk(e)
return render_template('contacten.html', **ctx)
# ---------------------------------------------------------------------
# 1. Adresboek
# ---------------------------------------------------------------------
@contacten_bp.route('/adresboek', methods=['POST'])
@login_required
@recht_vereist('gmail_contacten')
def adresboek():
d = request.get_json(silent=True) or {}
emails = [e for e in d.get('emails') or [] if isinstance(e, str)][:2000]
if not emails:
return jsonify(ok=False, fout="Niemand gekozen."), 400
try:
fouten = cs.zet_zichtbaar(emails, bool(d.get('zichtbaar')))
except Exception as e:
return jsonify(ok=False, fout=cs.vriendelijk(e)), 400
log(f"Contacten: {len(emails)} gebruiker(s) {'zichtbaar' if d.get('zichtbaar') else 'verborgen'} in het adresboek")
return jsonify(ok=not fouten, fouten=fouten, aantal=len(emails) - len(fouten))
# ---------------------------------------------------------------------
# 2. Contactlijsten in de mailboxen
# ---------------------------------------------------------------------
@contacten_bp.route('/lijst/bewaren', methods=['POST'])
@login_required
@recht_vereist('gmail_contacten')
def lijst_bewaren():
d = request.get_json(silent=True) or {}
lid = int(d['id']) if str(d.get('id') or '').isdigit() else None
oud = cs.lijst(lid) if lid else None
try:
lid = cs.lijst_bewaren(lid, d.get('naam'), [o for o in d.get('ous') or [] if isinstance(o, str)],
bool(d.get('met_sub')), [i for i in d.get('items') or [] if isinstance(i, dict)], _door())
except cs.ContactFout as e:
return jsonify(ok=False, fout=str(e)), 400
log(f"Contacten: contactlijst {d.get('naam')} bewaard")
gestart = False
# Stond de lijst al in de mailboxen? Dan meteen bijwerken (ook bij wie er door een OU-wijziging uit valt)
if oud and oud.get('Laatste_sync'):
gestart = cs.LijstSync().start(lid, oude_naam=oud['Naam'], oude_ous=oud['ous'])
return jsonify(ok=True, id=lid, gestart=gestart)
@contacten_bp.route('/lijst/<int:lijst_id>/sync', methods=['POST'])
@login_required
@recht_vereist('gmail_contacten')
def lijst_sync(lijst_id):
if not cs.LijstSync().start(lijst_id):
return jsonify(ok=False, fout="Er loopt al een opdracht."), 409
log(f"Contacten: contactlijst {lijst_id} naar de mailboxen")
return jsonify(ok=True)
@contacten_bp.route('/lijst/<int:lijst_id>/verwijderen', methods=['POST'])
@login_required
@recht_vereist('gmail_contacten')
def lijst_verwijderen(lijst_id):
l = cs.lijst(lijst_id)
if not l:
return jsonify(ok=False, fout="Lijst niet gevonden."), 404
log(f"Contacten: contactlijst {l['Naam']} verwijderd")
if l.get('Laatste_sync'):
if not cs.LijstSync().start(lijst_id, verwijderen=True):
return jsonify(ok=False, fout="Er loopt al een opdracht."), 409
return jsonify(ok=True, gestart=True)
cs.lijst_verwijderen_db(lijst_id)
return jsonify(ok=True, gestart=False)
@contacten_bp.route('/status.json', methods=['GET'])
@login_required
@recht_vereist('gmail_contacten')
def status():
return jsonify(cs.LijstSync().status)