"""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'})