"""Basisonderwijs › Bingel: leerlingenlijst uit Informat als Excel voor de import in Bingel.""" import io 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 bingel_service as bs from tenancy import huidige_school basisonderwijs_bp = Blueprint('basisonderwijs', __name__) KOLOMMEN = ['Klas', 'Voornaam', 'Familienaam', 'Wachtwoord', 'Klasnummer', 'Geslacht'] @basisonderwijs_bp.route('/bingel', methods=['GET']) @login_required @recht_vereist('bingel') def bingel(): rijen, voorbeeld, fout, waarschuwing = [], {}, None, None try: rijen, voorbeeld, waarschuwing = bs.leerlingen(vernieuw=bool(request.args.get('vernieuw'))) except bs.BingelFout as e: fout = str(e) except Exception as e: fout = f"Leerlingen ophalen uit Informat mislukt: {e}" if request.args.get('vernieuw'): return redirect(url_for('basisonderwijs.bingel')) klassen = sorted({r['klas'] for r in rijen}, key=str.lower) return render_template('bingel.html', rijen=rijen, klassen=klassen, voorbeeld=voorbeeld, fout=fout, waarschuwing=waarschuwing, kolommen=KOLOMMEN, school_naam=huidige_school().naam, zonder_klas=sum(1 for r in rijen if not r['klas']), zonder_geslacht=sum(1 for r in rijen if r['geslacht'] not in ('M', 'V'))) @basisonderwijs_bp.route('/bingel/export.xlsx', methods=['GET']) @login_required @recht_vereist('bingel') def bingel_export(): from openpyxl import Workbook from openpyxl.styles import Font try: rijen, _, _ = bs.leerlingen() except Exception as e: flash(str(e), "error") return redirect(url_for('basisonderwijs.bingel')) gekozen = request.args.getlist('klas') # aangevinkte klassen (niets = alle) if gekozen: rijen = [r for r in rijen if r['klas'] in gekozen] klas = gekozen[0] if len(gekozen) == 1 else '' wb = Workbook() ws = wb.active ws.title = 'Leerlingen' ws.append(KOLOMMEN) for c in ws[1]: c.font = Font(bold=True) for r in rijen: ws.append([r['klas'], r['voornaam'], r['naam'], '', r['klasnummer'], r['geslacht']]) for kol, breedte in zip('ABCDEF', (12, 18, 22, 14, 11, 10)): ws.column_dimensions[kol].width = breedte ws.freeze_panes = 'A2' buf = io.BytesIO() wb.save(buf) deel = ''.join(c if c.isalnum() else '_' for c in klas) + '_' if klas else '' return Response(buf.getvalue(), mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', headers={'Content-Disposition': f"attachment; filename=Bingel_{huidige_school().code}_{deel}" f"{date.today():%Y%m%d}.xlsx"})