66 lines
2.7 KiB
Python
66 lines
2.7 KiB
Python
"""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'})
|