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

+65
View File
@@ -0,0 +1,65 @@
"""Smartschool › SGR groepen: subgroepen van de hoofdgroep (standaard 'groepen GO-Antwerpen') met hun leden."""
import csv
import io
import time
from datetime import date
from flask import Blueprint, render_template, request, Response, redirect, url_for, flash
from blueprints.auth import login_required
from rechten import recht_vereist
from services import sgr_groepen_service as sgr
from tenancy import huidige_school
sgr_groepen_bp = Blueprint('sgr_groepen', __name__)
def _gevraagd():
return (request.args.get('groep') or '').strip() or None
@sgr_groepen_bp.route("/", methods=["GET"])
@login_required
@recht_vereist('sgr_groepen')
def overzicht():
school = huidige_school()
standaard = (school.get('SS_SGR_GROEP') or sgr.STANDAARD_GROEP).strip()
gevraagd = _gevraagd()
hoofd, groepen, fout, opgehaald = None, [], None, None
try:
hoofd, groepen, t = sgr.overzicht(gevraagd, vernieuw=bool(request.args.get('vernieuw')))
opgehaald = time.strftime('%d-%m-%Y %H:%M', time.localtime(t))
except sgr.SgrFout as e:
fout = str(e)
except Exception as e:
fout = f"Groepen ophalen uit Smartschool mislukt: {e}"
if request.args.get('vernieuw'):
return redirect(url_for('sgr_groepen.overzicht', groep=gevraagd))
leden = [l for g in groepen for l in g['leden']]
return render_template("sgr_groepen.html", hoofd=hoofd, groepen=groepen, fout=fout, opgehaald=opgehaald,
groep=gevraagd or standaard, standaard=standaard, school_naam=school.naam,
aantal_leden=len(leden),
uniek=len({l['gebruikersnaam'] or (l['naam'], l['voornaam']) for l in leden}))
@sgr_groepen_bp.route("/export.csv", methods=["GET"])
@login_required
@recht_vereist('sgr_groepen')
def export():
try:
hoofd, groepen, _ = sgr.overzicht(_gevraagd())
except Exception as e:
flash(f"Kon niet exporteren: {e}", "error")
return redirect(url_for('sgr_groepen.overzicht', groep=_gevraagd()))
buf = io.StringIO()
w = csv.writer(buf, delimiter=';')
w.writerow(['Groep', 'Pad', 'Groepscode', 'Naam', 'Voornaam', 'Gebruikersnaam', 'Rol', 'E-mail'])
for g in groepen:
pad = ' › '.join(g['pad'] + [g['naam']])
if not g['leden']:
w.writerow([g['naam'], pad, g['code'], '', '', '', '', ''])
for l in g['leden']:
w.writerow([g['naam'], pad, g['code'], l['naam'], l['voornaam'], l['gebruikersnaam'], l['rol'], l['email']])
naam = ''.join(c if c.isalnum() else '_' for c in hoofd['naam'])[:40]
return Response('' + buf.getvalue(), mimetype='text/csv',
headers={'Content-Disposition': f'attachment; filename=SGR_{naam}_{date.today():%Y%m%d}.csv'})