Files
Pivot/blueprints/sgr_groepen_bp.py
2026-10-14 13:34:37 +02:00

66 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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'})